api-tools 0.5.2 → 0.8.0.1
raw patch · 44 files changed
+2887/−3181 lines, 44 filesdep +base16-bytestringdep +binarydep +cborgdep ~QuickCheckdep ~aesondep ~aeson-prettynew-component:exe:perf-testPVP ok
version bump matches the API change (PVP)
Dependencies added: base16-bytestring, binary, cborg, scientific, serialise
Dependency ranges changed: QuickCheck, aeson, aeson-pretty, attoparsec, deepseq, lens, old-locale, safecopy, tasty, tasty-hunit, template-haskell, text, time, vector
API changes (from Hackage documentation)
- Data.API.API: instance FromJSONWithErrs Thing
- Data.API.API.Gen: _RegularExpression :: RegularExpression -> Text
- Data.API.API.Gen: _TypeRef :: TypeRef -> Text
- Data.API.API.Gen: _an_comment :: APINode -> !Text
- Data.API.API.Gen: _an_convert :: APINode -> !(Maybe Conversion)
- Data.API.API.Gen: _an_name :: APINode -> !Text
- Data.API.API.Gen: _an_prefix :: APINode -> !Text
- Data.API.API.Gen: _an_spec :: APINode -> !Spec
- Data.API.API.Gen: _cv_injection :: Conversion -> !Text
- Data.API.API.Gen: _cv_projection :: Conversion -> !Text
- Data.API.API.Gen: _fd_comment :: Field -> !Text
- Data.API.API.Gen: _fd_default :: Field -> !(Maybe DefaultValue)
- Data.API.API.Gen: _fd_name :: Field -> !Text
- Data.API.API.Gen: _fd_readonly :: Field -> !Bool
- Data.API.API.Gen: _fd_type :: Field -> !APIType
- Data.API.API.Gen: _ir_hi :: IntRange -> !(Maybe Int)
- Data.API.API.Gen: _ir_lo :: IntRange -> !(Maybe Int)
- Data.API.API.Gen: _sn_filter :: SpecNewtype -> !(Maybe Filter)
- Data.API.API.Gen: _sn_type :: SpecNewtype -> !BasicType
- Data.API.API.Gen: _ur_hi :: UTCRange -> !(Maybe UTCTime)
- Data.API.API.Gen: _ur_lo :: UTCRange -> !(Maybe UTCTime)
- Data.API.API.Gen: apiAPISimpleTests :: [(String, Property)]
- Data.API.API.Gen: instance Arbitrary APINode
- Data.API.API.Gen: instance Arbitrary APIType
- Data.API.API.Gen: instance Arbitrary BasicType
- Data.API.API.Gen: instance Arbitrary Conversion
- Data.API.API.Gen: instance Arbitrary DefaultValue
- Data.API.API.Gen: instance Arbitrary Field
- Data.API.API.Gen: instance Arbitrary Filter
- Data.API.API.Gen: instance Arbitrary IntRange
- Data.API.API.Gen: instance Arbitrary RegularExpression
- Data.API.API.Gen: instance Arbitrary Spec
- Data.API.API.Gen: instance Arbitrary SpecNewtype
- Data.API.API.Gen: instance Arbitrary TypeRef
- Data.API.API.Gen: instance Arbitrary UTCRange
- Data.API.API.Gen: instance Bounded BasicType
- Data.API.API.Gen: instance Enum BasicType
- Data.API.API.Gen: instance Eq APINode
- Data.API.API.Gen: instance Eq APIType
- Data.API.API.Gen: instance Eq BasicType
- Data.API.API.Gen: instance Eq Conversion
- Data.API.API.Gen: instance Eq DefaultValue
- Data.API.API.Gen: instance Eq Field
- Data.API.API.Gen: instance Eq Filter
- Data.API.API.Gen: instance Eq IntRange
- Data.API.API.Gen: instance Eq RegularExpression
- Data.API.API.Gen: instance Eq Spec
- Data.API.API.Gen: instance Eq SpecNewtype
- Data.API.API.Gen: instance Eq TypeRef
- Data.API.API.Gen: instance Eq UTCRange
- Data.API.API.Gen: instance Example APINode
- Data.API.API.Gen: instance Example APIType
- Data.API.API.Gen: instance Example BasicType
- Data.API.API.Gen: instance Example Conversion
- Data.API.API.Gen: instance Example DefaultValue
- Data.API.API.Gen: instance Example Field
- Data.API.API.Gen: instance Example Filter
- Data.API.API.Gen: instance Example IntRange
- Data.API.API.Gen: instance Example RegularExpression
- Data.API.API.Gen: instance Example Spec
- Data.API.API.Gen: instance Example SpecNewtype
- Data.API.API.Gen: instance Example TypeRef
- Data.API.API.Gen: instance Example UTCRange
- Data.API.API.Gen: instance FromJSON APINode
- Data.API.API.Gen: instance FromJSON APIType
- Data.API.API.Gen: instance FromJSON BasicType
- Data.API.API.Gen: instance FromJSON Conversion
- Data.API.API.Gen: instance FromJSON DefaultValue
- Data.API.API.Gen: instance FromJSON Field
- Data.API.API.Gen: instance FromJSON Filter
- Data.API.API.Gen: instance FromJSON IntRange
- Data.API.API.Gen: instance FromJSON RegularExpression
- Data.API.API.Gen: instance FromJSON Spec
- Data.API.API.Gen: instance FromJSON SpecNewtype
- Data.API.API.Gen: instance FromJSON TypeRef
- Data.API.API.Gen: instance FromJSON UTCRange
- Data.API.API.Gen: instance FromJSONWithErrs APINode
- Data.API.API.Gen: instance FromJSONWithErrs APIType
- Data.API.API.Gen: instance FromJSONWithErrs BasicType
- Data.API.API.Gen: instance FromJSONWithErrs Conversion
- Data.API.API.Gen: instance FromJSONWithErrs DefaultValue
- Data.API.API.Gen: instance FromJSONWithErrs Field
- Data.API.API.Gen: instance FromJSONWithErrs Filter
- Data.API.API.Gen: instance FromJSONWithErrs IntRange
- Data.API.API.Gen: instance FromJSONWithErrs RegularExpression
- Data.API.API.Gen: instance FromJSONWithErrs Spec
- Data.API.API.Gen: instance FromJSONWithErrs SpecNewtype
- Data.API.API.Gen: instance FromJSONWithErrs TypeRef
- Data.API.API.Gen: instance FromJSONWithErrs UTCRange
- Data.API.API.Gen: instance IsString RegularExpression
- Data.API.API.Gen: instance IsString TypeRef
- Data.API.API.Gen: instance Ord BasicType
- Data.API.API.Gen: instance Ord RegularExpression
- Data.API.API.Gen: instance Ord TypeRef
- Data.API.API.Gen: instance SafeCopy APINode
- Data.API.API.Gen: instance SafeCopy APIType
- Data.API.API.Gen: instance SafeCopy BasicType
- Data.API.API.Gen: instance SafeCopy Conversion
- Data.API.API.Gen: instance SafeCopy DefaultValue
- Data.API.API.Gen: instance SafeCopy Field
- Data.API.API.Gen: instance SafeCopy Filter
- Data.API.API.Gen: instance SafeCopy IntRange
- Data.API.API.Gen: instance SafeCopy RegularExpression
- Data.API.API.Gen: instance SafeCopy Spec
- Data.API.API.Gen: instance SafeCopy SpecNewtype
- Data.API.API.Gen: instance SafeCopy TypeRef
- Data.API.API.Gen: instance SafeCopy UTCRange
- Data.API.API.Gen: instance Show APINode
- Data.API.API.Gen: instance Show APIType
- Data.API.API.Gen: instance Show BasicType
- Data.API.API.Gen: instance Show Conversion
- Data.API.API.Gen: instance Show DefaultValue
- Data.API.API.Gen: instance Show Field
- Data.API.API.Gen: instance Show Filter
- Data.API.API.Gen: instance Show IntRange
- Data.API.API.Gen: instance Show RegularExpression
- Data.API.API.Gen: instance Show Spec
- Data.API.API.Gen: instance Show SpecNewtype
- Data.API.API.Gen: instance Show TypeRef
- Data.API.API.Gen: instance Show UTCRange
- Data.API.API.Gen: instance ToJSON APINode
- Data.API.API.Gen: instance ToJSON APIType
- Data.API.API.Gen: instance ToJSON BasicType
- Data.API.API.Gen: instance ToJSON Conversion
- Data.API.API.Gen: instance ToJSON DefaultValue
- Data.API.API.Gen: instance ToJSON Field
- Data.API.API.Gen: instance ToJSON Filter
- Data.API.API.Gen: instance ToJSON IntRange
- Data.API.API.Gen: instance ToJSON RegularExpression
- Data.API.API.Gen: instance ToJSON Spec
- Data.API.API.Gen: instance ToJSON SpecNewtype
- Data.API.API.Gen: instance ToJSON TypeRef
- Data.API.API.Gen: instance ToJSON UTCRange
- Data.API.API.Gen: instance Typeable APINode
- Data.API.API.Gen: instance Typeable APIType
- Data.API.API.Gen: instance Typeable BasicType
- Data.API.API.Gen: instance Typeable Conversion
- Data.API.API.Gen: instance Typeable DefaultValue
- Data.API.API.Gen: instance Typeable Field
- Data.API.API.Gen: instance Typeable Filter
- Data.API.API.Gen: instance Typeable IntRange
- Data.API.API.Gen: instance Typeable RegularExpression
- Data.API.API.Gen: instance Typeable Spec
- Data.API.API.Gen: instance Typeable SpecNewtype
- Data.API.API.Gen: instance Typeable TypeRef
- Data.API.API.Gen: instance Typeable UTCRange
- Data.API.Changes: afBadDefault :: ApplyFailure -> DefaultValue
- Data.API.Changes: afCustomMessage :: ApplyFailure -> String
- Data.API.Changes: afDecl :: ApplyFailure -> NormTypeDecl
- Data.API.Changes: afExistingField :: ApplyFailure -> FieldName
- Data.API.Changes: afExistingType :: ApplyFailure -> TypeName
- Data.API.Changes: afExpectedKind :: ApplyFailure -> TypeKind
- Data.API.Changes: afFieldName :: ApplyFailure -> FieldName
- Data.API.Changes: afFieldType :: ApplyFailure -> APIType
- Data.API.Changes: afMissingField :: ApplyFailure -> FieldName
- Data.API.Changes: afMissingType :: ApplyFailure -> TypeName
- Data.API.Changes: afMissingTypes :: ApplyFailure -> Set TypeName
- Data.API.Changes: afType :: ApplyFailure -> APIType
- Data.API.Changes: afTypeKind :: ApplyFailure -> TypeKind
- Data.API.Changes: afTypeName :: ApplyFailure -> TypeName
- Data.API.Changes: databaseMigration :: CustomMigrations db ty fld -> db -> Object -> Either ValueError Object
- Data.API.Changes: databaseMigrationSchema :: CustomMigrations db ty fld -> db -> NormAPI -> Either ApplyFailure (Maybe NormAPI)
- Data.API.Changes: fieldMigration :: CustomMigrations db ty fld -> fld -> Value -> Either ValueError Value
- Data.API.Changes: instance (Eq a, Eq b) => Eq (MergeResult a b)
- Data.API.Changes: instance (Show a, Show b) => Show (MergeResult a b)
- Data.API.Changes: instance Eq APIChange
- Data.API.Changes: instance Eq APIChangelog
- Data.API.Changes: instance Eq APITableChange
- Data.API.Changes: instance Eq ApplyFailure
- Data.API.Changes: instance Eq DataChecks
- Data.API.Changes: instance Eq MigrateFailure
- Data.API.Changes: instance Eq TypeKind
- Data.API.Changes: instance Eq UpdateDeclPos
- Data.API.Changes: instance Eq UpdateTypePos
- Data.API.Changes: instance Eq ValidateFailure
- Data.API.Changes: instance Eq ValueError
- Data.API.Changes: instance Eq VersionExtra
- Data.API.Changes: instance Ord DataChecks
- Data.API.Changes: instance Ord VersionExtra
- Data.API.Changes: instance PP TypeKind
- Data.API.Changes: instance PP VersionExtra
- Data.API.Changes: instance PPLines APIChange
- Data.API.Changes: instance PPLines APITableChange
- Data.API.Changes: instance PPLines ApplyFailure
- Data.API.Changes: instance PPLines MigrateFailure
- Data.API.Changes: instance PPLines ValidateFailure
- Data.API.Changes: instance PPLines ValueError
- Data.API.Changes: instance Show APIChange
- Data.API.Changes: instance Show APIChangelog
- Data.API.Changes: instance Show APITableChange
- Data.API.Changes: instance Show ApplyFailure
- Data.API.Changes: instance Show MigrateFailure
- Data.API.Changes: instance Show TypeKind
- Data.API.Changes: instance Show UpdateDeclPos
- Data.API.Changes: instance Show UpdateTypePos
- Data.API.Changes: instance Show ValidateFailure
- Data.API.Changes: instance Show ValidateWarning
- Data.API.Changes: instance Show ValueError
- Data.API.Changes: instance Show VersionExtra
- Data.API.Changes: typeMigration :: CustomMigrations db ty fld -> ty -> Value -> Either ValueError Value
- Data.API.Changes: typeMigrationSchema :: CustomMigrations db ty fld -> ty -> NormTypeDecl -> Either ApplyFailure (Maybe NormTypeDecl)
- Data.API.Changes: vfApplyFailure :: ValidateFailure -> ApplyFailure
- Data.API.Changes: vfChangelogVersion :: ValidateFailure -> VersionExtra
- Data.API.Changes: vfDifferences :: ValidateFailure -> Map TypeName (MergeResult NormTypeDecl NormTypeDecl)
- Data.API.Changes: vfEarlierVersion :: ValidateFailure -> VersionExtra
- Data.API.Changes: vfFailedToApply :: ValidateFailure -> APIChange
- Data.API.Changes: vfFromVersion :: ValidateFailure -> VersionExtra
- Data.API.Changes: vfInvalidVersion :: ValidateFailure -> VersionExtra
- Data.API.Changes: vfLaterVersion :: ValidateFailure -> VersionExtra
- Data.API.Changes: vfMissingDeclarations :: ValidateFailure -> Set TypeName
- Data.API.Changes: vfSuccessfullyApplied :: ValidateFailure -> [APITableChange]
- Data.API.Changes: vfTargetVersion :: ValidateFailure -> VersionExtra
- Data.API.Changes: vfToVersion :: ValidateFailure -> VersionExtra
- Data.API.Doc: call_auth_required :: Call -> Bool
- Data.API.Doc: call_body :: Call -> Maybe (APIType, String)
- Data.API.Doc: call_description :: Call -> String
- Data.API.Doc: call_headers :: Call -> [Header]
- Data.API.Doc: call_http_method :: Call -> HTTPMethod
- Data.API.Doc: call_params :: Call -> [Param]
- Data.API.Doc: call_path :: Call -> [String]
- Data.API.Doc: call_samples :: Call -> [Sample]
- Data.API.Doc: call_views :: Call -> [View]
- Data.API.Doc: doc_info_call_url :: DocInfo -> HTTPMethod -> [String] -> URL
- Data.API.Doc: doc_info_type_url :: DocInfo -> TypeName -> URL
- Data.API.Doc: header_desc :: Header -> String
- Data.API.Doc: header_expl :: Header -> String
- Data.API.Doc: header_name :: Header -> String
- Data.API.Doc: header_required :: Header -> Bool
- Data.API.Doc: header_type :: Header -> APIType
- Data.API.Doc: param_desc :: Param -> String
- Data.API.Doc: param_expl :: Param -> String
- Data.API.Doc: param_name :: Param -> String
- Data.API.Doc: param_required :: Param -> Bool
- Data.API.Doc: param_type :: Param -> Either String APIType
- Data.API.Doc: sample_response :: Sample -> Maybe String
- Data.API.Doc: sample_status :: Sample -> StatusCode
- Data.API.Doc: sample_type :: Sample -> Body APIType
- Data.API.Doc: view_doc :: View -> String
- Data.API.Doc: view_id :: View -> String
- Data.API.Doc: view_params :: View -> [Param]
- Data.API.Doc: view_type :: View -> APIType
- Data.API.JSON: instance Alternative ParserWithErrs
- Data.API.JSON: instance Applicative ParserWithErrs
- Data.API.JSON: instance Eq Expected
- Data.API.JSON: instance Eq FormatExpected
- Data.API.JSON: instance Eq JSONError
- Data.API.JSON: instance Eq Step
- Data.API.JSON: instance FromJSON Expected
- Data.API.JSON: instance FromJSON FormatExpected
- Data.API.JSON: instance FromJSON JSONError
- Data.API.JSON: instance FromJSON Step
- Data.API.JSON: instance FromJSONWithErrs ()
- Data.API.JSON: instance FromJSONWithErrs Binary
- Data.API.JSON: instance FromJSONWithErrs Bool
- Data.API.JSON: instance FromJSONWithErrs Int
- Data.API.JSON: instance FromJSONWithErrs Integer
- Data.API.JSON: instance FromJSONWithErrs Text
- Data.API.JSON: instance FromJSONWithErrs UTCTime
- Data.API.JSON: instance FromJSONWithErrs Value
- Data.API.JSON: instance FromJSONWithErrs Version
- Data.API.JSON: instance FromJSONWithErrs a => FromJSONWithErrs (Maybe a)
- Data.API.JSON: instance FromJSONWithErrs a => FromJSONWithErrs [a]
- Data.API.JSON: instance Functor ParserWithErrs
- Data.API.JSON: instance Monad ParserWithErrs
- Data.API.JSON: instance SafeCopy Step
- Data.API.JSON: instance Show Expected
- Data.API.JSON: instance Show FormatExpected
- Data.API.JSON: instance Show JSONError
- Data.API.JSON: instance Show Step
- Data.API.JSON: instance ToJSON Expected
- Data.API.JSON: instance ToJSON FormatExpected
- Data.API.JSON: instance ToJSON JSONError
- Data.API.JSON: instance ToJSON Step
- Data.API.Markdown: mdmFieldDefault :: MarkdownMethods -> FieldName -> APIType -> Maybe DefaultValue
- Data.API.Markdown: mdmLink :: MarkdownMethods -> TypeName -> MDComment
- Data.API.Markdown: mdmPp :: MarkdownMethods -> MDComment -> MDComment -> MDComment
- Data.API.Markdown: mdmSummaryPostfix :: MarkdownMethods -> TypeName -> MDComment
- Data.API.NormalForm: instance Eq NormTypeDecl
- Data.API.NormalForm: instance PPLines NormTypeDecl
- Data.API.NormalForm: instance Show NormTypeDecl
- Data.API.PP: instance (PPLines s, PPLines t) => PPLines (s, t)
- Data.API.PP: instance PP APIType
- Data.API.PP: instance PP BasicType
- Data.API.PP: instance PP DefaultValue
- Data.API.PP: instance PP FieldName
- Data.API.PP: instance PP Text
- Data.API.PP: instance PP TypeName
- Data.API.PP: instance PP Version
- Data.API.PP: instance PP [Char]
- Data.API.PP: instance PP t => PP (Set t)
- Data.API.PP: instance PPLines Step
- Data.API.PP: instance PPLines Value
- Data.API.PP: instance PPLines t => PPLines [t]
- Data.API.Tools.Combinators: instance Monoid (Tool a)
- Data.API.Tools.Example: instance Example Binary
- Data.API.Tools.Example: instance Example Bool
- Data.API.Tools.Example: instance Example Int
- Data.API.Tools.Example: instance Example Text
- Data.API.Tools.Example: instance Example UTCTime
- Data.API.Tools.Example: instance Example Value
- Data.API.Tools.Example: instance Example a => Example (Maybe a)
- Data.API.Tools.Example: instance Example a => Example [a]
- Data.API.Tools.QuickCheck: instance Arbitrary UTCTime
- Data.API.Tools.SafeCopy: instance SafeCopy Binary
- Data.API.Types: _Binary :: Binary -> ByteString
- Data.API.Types: _FieldName :: FieldName -> String
- Data.API.Types: _TypeName :: TypeName -> String
- Data.API.Types: anComment :: APINode -> MDComment
- Data.API.Types: anConvert :: APINode -> Conversion
- Data.API.Types: anName :: APINode -> TypeName
- Data.API.Types: anPrefix :: APINode -> Prefix
- Data.API.Types: anSpec :: APINode -> Spec
- Data.API.Types: ftComment :: FieldType -> MDComment
- Data.API.Types: ftDefault :: FieldType -> Maybe DefaultValue
- Data.API.Types: ftReadOnly :: FieldType -> Bool
- Data.API.Types: ftType :: FieldType -> APIType
- Data.API.Types: instance Arbitrary Binary
- Data.API.Types: instance Arbitrary Text
- Data.API.Types: instance Eq APIType
- Data.API.Types: instance Eq BasicType
- Data.API.Types: instance Eq Binary
- Data.API.Types: instance Eq DefaultValue
- Data.API.Types: instance Eq FieldName
- Data.API.Types: instance Eq IntRange
- Data.API.Types: instance Eq RegEx
- Data.API.Types: instance Eq TypeName
- Data.API.Types: instance Eq UTCRange
- Data.API.Types: instance FromJSON APINode
- Data.API.Types: instance FromJSON APIType
- Data.API.Types: instance FromJSON BasicType
- Data.API.Types: instance FromJSON Binary
- Data.API.Types: instance FromJSON DefaultValue
- Data.API.Types: instance FromJSON FieldName
- Data.API.Types: instance FromJSON FieldType
- Data.API.Types: instance FromJSON Filter
- Data.API.Types: instance FromJSON IntRange
- Data.API.Types: instance FromJSON RegEx
- Data.API.Types: instance FromJSON Spec
- Data.API.Types: instance FromJSON SpecEnum
- Data.API.Types: instance FromJSON SpecNewtype
- Data.API.Types: instance FromJSON SpecRecord
- Data.API.Types: instance FromJSON SpecUnion
- Data.API.Types: instance FromJSON Thing
- Data.API.Types: instance FromJSON TypeName
- Data.API.Types: instance FromJSON UTCRange
- Data.API.Types: instance FromJSON s0 => FromJSON (CI s0)
- Data.API.Types: instance IsString APIType
- Data.API.Types: instance IsString FieldName
- Data.API.Types: instance IsString TypeName
- Data.API.Types: instance Lift DefaultValue
- Data.API.Types: instance Lift IntRange
- Data.API.Types: instance Lift RegEx
- Data.API.Types: instance Lift UTCRange
- Data.API.Types: instance NFData Binary
- Data.API.Types: instance Ord Binary
- Data.API.Types: instance Ord FieldName
- Data.API.Types: instance Ord TypeName
- Data.API.Types: instance Show APINode
- Data.API.Types: instance Show APIType
- Data.API.Types: instance Show BasicType
- Data.API.Types: instance Show Binary
- Data.API.Types: instance Show DefaultValue
- Data.API.Types: instance Show FieldName
- Data.API.Types: instance Show FieldType
- Data.API.Types: instance Show Filter
- Data.API.Types: instance Show IntRange
- Data.API.Types: instance Show RegEx
- Data.API.Types: instance Show Spec
- Data.API.Types: instance Show SpecEnum
- Data.API.Types: instance Show SpecNewtype
- Data.API.Types: instance Show SpecRecord
- Data.API.Types: instance Show SpecUnion
- Data.API.Types: instance Show Thing
- Data.API.Types: instance Show TypeName
- Data.API.Types: instance Show UTCRange
- Data.API.Types: instance ToJSON APINode
- Data.API.Types: instance ToJSON APIType
- Data.API.Types: instance ToJSON BasicType
- Data.API.Types: instance ToJSON Binary
- Data.API.Types: instance ToJSON DefaultValue
- Data.API.Types: instance ToJSON FieldName
- Data.API.Types: instance ToJSON FieldType
- Data.API.Types: instance ToJSON Filter
- Data.API.Types: instance ToJSON IntRange
- Data.API.Types: instance ToJSON RegEx
- Data.API.Types: instance ToJSON Spec
- Data.API.Types: instance ToJSON SpecEnum
- Data.API.Types: instance ToJSON SpecNewtype
- Data.API.Types: instance ToJSON SpecRecord
- Data.API.Types: instance ToJSON SpecUnion
- Data.API.Types: instance ToJSON Thing
- Data.API.Types: instance ToJSON TypeName
- Data.API.Types: instance ToJSON UTCRange
- Data.API.Types: instance ToJSON s0 => ToJSON (CI s0)
- Data.API.Types: ir_hi :: IntRange -> Maybe Int
- Data.API.Types: ir_lo :: IntRange -> Maybe Int
- Data.API.Types: re_regex :: RegEx -> Regex
- Data.API.Types: re_text :: RegEx -> Text
- Data.API.Types: seAlts :: SpecEnum -> [(FieldName, MDComment)]
- Data.API.Types: snFilter :: SpecNewtype -> Maybe Filter
- Data.API.Types: snType :: SpecNewtype -> BasicType
- Data.API.Types: srFields :: SpecRecord -> [(FieldName, FieldType)]
- Data.API.Types: suFields :: SpecUnion -> [(FieldName, (APIType, MDComment))]
- Data.API.Types: ur_hi :: UTCRange -> Maybe UTCTime
- Data.API.Types: ur_lo :: UTCRange -> Maybe UTCTime
+ Data.API.API: convertAPI :: API -> APISpec
+ Data.API.API: instance Data.API.JSON.FromJSONWithErrs Data.API.Types.Thing
+ Data.API.API: unconvertAPI :: APISpec -> API
+ Data.API.API.DSL: apiAPI :: API
+ Data.API.API.Gen: [_RegularExpression] :: RegularExpression -> Text
+ Data.API.API.Gen: [_TypeRef] :: TypeRef -> Text
+ Data.API.API.Gen: [_an_comment] :: APINode -> !Text
+ Data.API.API.Gen: [_an_convert] :: APINode -> !(Maybe Conversion)
+ Data.API.API.Gen: [_an_name] :: APINode -> !Text
+ Data.API.API.Gen: [_an_prefix] :: APINode -> !Text
+ Data.API.API.Gen: [_an_spec] :: APINode -> !Spec
+ Data.API.API.Gen: [_cv_injection] :: Conversion -> !Text
+ Data.API.API.Gen: [_cv_projection] :: Conversion -> !Text
+ Data.API.API.Gen: [_fd_comment] :: Field -> !Text
+ Data.API.API.Gen: [_fd_default] :: Field -> !(Maybe DefaultValue)
+ Data.API.API.Gen: [_fd_name] :: Field -> !Text
+ Data.API.API.Gen: [_fd_readonly] :: Field -> !Bool
+ Data.API.API.Gen: [_fd_type] :: Field -> !APIType
+ Data.API.API.Gen: [_ir_hi] :: IntRange -> !(Maybe Int)
+ Data.API.API.Gen: [_ir_lo] :: IntRange -> !(Maybe Int)
+ Data.API.API.Gen: [_sn_filter] :: SpecNewtype -> !(Maybe Filter)
+ Data.API.API.Gen: [_sn_type] :: SpecNewtype -> !BasicType
+ Data.API.API.Gen: [_ur_hi] :: UTCRange -> !(Maybe UTCTime)
+ Data.API.API.Gen: [_ur_lo] :: UTCRange -> !(Maybe UTCTime)
+ Data.API.API.Gen: apiAPITestsCBOR :: [(String, Property)]
+ Data.API.API.Gen: apiAPITestsCBORToJSON :: [(String, Property)]
+ Data.API.API.Gen: apiAPITestsJSON :: [(String, Property)]
+ Data.API.API.Gen: apiAPITestsJSONToCBOR :: [(String, Property)]
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.APINode
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.APIType
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.Conversion
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.DefaultValue
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.Field
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.Filter
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.IntRange
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.RegularExpression
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.Spec
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.SpecNewtype
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.TypeRef
+ Data.API.API.Gen: instance Codec.Serialise.Class.Serialise Data.API.API.Gen.UTCRange
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.APINode
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.APIType
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.Conversion
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.DefaultValue
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.Field
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.Filter
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.IntRange
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.RegularExpression
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.Spec
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.SpecNewtype
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.TypeRef
+ Data.API.API.Gen: instance Control.DeepSeq.NFData Data.API.API.Gen.UTCRange
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.APINode
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.APIType
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.Conversion
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.DefaultValue
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.Field
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.Filter
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.IntRange
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.RegularExpression
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.Spec
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.SpecNewtype
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.TypeRef
+ Data.API.API.Gen: instance Data.API.JSON.FromJSONWithErrs Data.API.API.Gen.UTCRange
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.APINode
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.APIType
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.Conversion
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.DefaultValue
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.Field
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.Filter
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.IntRange
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.RegularExpression
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.Spec
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.SpecNewtype
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.TypeRef
+ Data.API.API.Gen: instance Data.API.Tools.Example.Example Data.API.API.Gen.UTCRange
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.APINode
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.APIType
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.Conversion
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.DefaultValue
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.Field
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.Filter
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.IntRange
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.RegularExpression
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.Spec
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.SpecNewtype
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.TypeRef
+ Data.API.API.Gen: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.API.Gen.UTCRange
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.APINode
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.APIType
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.Conversion
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.DefaultValue
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.Field
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.Filter
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.IntRange
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.RegularExpression
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.Spec
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.SpecNewtype
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.TypeRef
+ Data.API.API.Gen: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.API.Gen.UTCRange
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.APINode
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.APIType
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.Conversion
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.DefaultValue
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.Field
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.Filter
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.IntRange
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.RegularExpression
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.Spec
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.SpecNewtype
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.TypeRef
+ Data.API.API.Gen: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.API.Gen.UTCRange
+ Data.API.API.Gen: instance Data.String.IsString Data.API.API.Gen.RegularExpression
+ Data.API.API.Gen: instance Data.String.IsString Data.API.API.Gen.TypeRef
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.APINode
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.APIType
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.Conversion
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.DefaultValue
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.Field
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.Filter
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.IntRange
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.RegularExpression
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.Spec
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.SpecNewtype
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.TypeRef
+ Data.API.API.Gen: instance GHC.Classes.Eq Data.API.API.Gen.UTCRange
+ Data.API.API.Gen: instance GHC.Classes.Ord Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance GHC.Classes.Ord Data.API.API.Gen.RegularExpression
+ Data.API.API.Gen: instance GHC.Classes.Ord Data.API.API.Gen.TypeRef
+ Data.API.API.Gen: instance GHC.Enum.Bounded Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance GHC.Enum.Enum Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.APINode
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.APIType
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.Conversion
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.DefaultValue
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.Field
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.Filter
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.IntRange
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.RegularExpression
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.Spec
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.SpecNewtype
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.TypeRef
+ Data.API.API.Gen: instance GHC.Show.Show Data.API.API.Gen.UTCRange
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.APINode
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.APIType
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.BasicType
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.Conversion
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.DefaultValue
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.Field
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.Filter
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.IntRange
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.RegularExpression
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.Spec
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.SpecNewtype
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.TypeRef
+ Data.API.API.Gen: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.API.Gen.UTCRange
+ Data.API.Changes: [afBadDefault] :: ApplyFailure -> DefaultValue
+ Data.API.Changes: [afCustomMessage] :: ApplyFailure -> String
+ Data.API.Changes: [afDecl] :: ApplyFailure -> NormTypeDecl
+ Data.API.Changes: [afExistingField] :: ApplyFailure -> FieldName
+ Data.API.Changes: [afExistingType] :: ApplyFailure -> TypeName
+ Data.API.Changes: [afExpectedKind] :: ApplyFailure -> TypeKind
+ Data.API.Changes: [afFieldName] :: ApplyFailure -> FieldName
+ Data.API.Changes: [afFieldType] :: ApplyFailure -> APIType
+ Data.API.Changes: [afMissingField] :: ApplyFailure -> FieldName
+ Data.API.Changes: [afMissingType] :: ApplyFailure -> TypeName
+ Data.API.Changes: [afMissingTypes] :: ApplyFailure -> Set TypeName
+ Data.API.Changes: [afTypeKind] :: ApplyFailure -> TypeKind
+ Data.API.Changes: [afTypeName] :: ApplyFailure -> TypeName
+ Data.API.Changes: [afType] :: ApplyFailure -> APIType
+ Data.API.Changes: [databaseMigrationSchema] :: CustomMigrations o v db ty fld -> db -> NormAPI -> Either ApplyFailure (Maybe NormAPI)
+ Data.API.Changes: [databaseMigration] :: CustomMigrations o v db ty fld -> db -> o -> Either ValueError o
+ Data.API.Changes: [fieldMigration] :: CustomMigrations o v db ty fld -> fld -> v -> Either ValueError v
+ Data.API.Changes: [typeMigrationSchema] :: CustomMigrations o v db ty fld -> ty -> NormTypeDecl -> Either ApplyFailure (Maybe NormTypeDecl)
+ Data.API.Changes: [typeMigration] :: CustomMigrations o v db ty fld -> ty -> v -> Either ValueError v
+ Data.API.Changes: [vfApplyFailure] :: ValidateFailure -> ApplyFailure
+ Data.API.Changes: [vfChangelogVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Changes: [vfDifferences] :: ValidateFailure -> Map TypeName (MergeResult NormTypeDecl NormTypeDecl)
+ Data.API.Changes: [vfEarlierVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Changes: [vfFailedToApply] :: ValidateFailure -> APIChange
+ Data.API.Changes: [vfFromVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Changes: [vfInvalidVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Changes: [vfLaterVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Changes: [vfMissingDeclarations] :: ValidateFailure -> Set TypeName
+ Data.API.Changes: [vfSuccessfullyApplied] :: ValidateFailure -> [APITableChange]
+ Data.API.Changes: [vfTargetVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Changes: [vfToVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Changes: instance GHC.Classes.Eq Data.API.Changes.DataChecks
+ Data.API.Changes: instance GHC.Classes.Ord Data.API.Changes.DataChecks
+ Data.API.Changes: migrateDataDump' :: (Read db, Read rec, Read fld) => (API, Version) -> (API, VersionExtra) -> APIChangelog -> CustomMigrations Record Value db rec fld -> TypeName -> DataChecks -> Value -> Either MigrateFailure (Value, [MigrateWarning])
+ Data.API.Changes: mkRecordMigration' :: (Record -> Either ValueError Record) -> (Value -> Either ValueError Value)
+ Data.API.Changes.Types: APIChange :: NormAPI -> APIChange -> (Map TypeName UpdateDeclPos) -> APITableChange
+ Data.API.Changes.Types: ChAddEnumVal :: TypeName -> FieldName -> APIChange
+ Data.API.Changes.Types: ChAddField :: TypeName -> FieldName -> APIType -> (Maybe DefaultValue) -> APIChange
+ Data.API.Changes.Types: ChAddType :: TypeName -> NormTypeDecl -> APIChange
+ Data.API.Changes.Types: ChAddUnionAlt :: TypeName -> FieldName -> APIType -> APIChange
+ Data.API.Changes.Types: ChChangeField :: TypeName -> FieldName -> APIType -> MigrationTag -> APIChange
+ Data.API.Changes.Types: ChCustomAll :: MigrationTag -> APIChange
+ Data.API.Changes.Types: ChCustomType :: TypeName -> MigrationTag -> APIChange
+ Data.API.Changes.Types: ChDeleteEnumVal :: TypeName -> FieldName -> APIChange
+ Data.API.Changes.Types: ChDeleteField :: TypeName -> FieldName -> APIChange
+ Data.API.Changes.Types: ChDeleteType :: TypeName -> APIChange
+ Data.API.Changes.Types: ChDeleteUnionAlt :: TypeName -> FieldName -> APIChange
+ Data.API.Changes.Types: ChRenameEnumVal :: TypeName -> FieldName -> FieldName -> APIChange
+ Data.API.Changes.Types: ChRenameField :: TypeName -> FieldName -> FieldName -> APIChange
+ Data.API.Changes.Types: ChRenameType :: TypeName -> TypeName -> APIChange
+ Data.API.Changes.Types: ChRenameUnionAlt :: TypeName -> FieldName -> FieldName -> APIChange
+ Data.API.Changes.Types: ChangesStart :: Version -> APIChangelog
+ Data.API.Changes.Types: ChangesUpTo :: VersionExtra -> [APIChange] -> APIChangelog -> APIChangelog
+ Data.API.Changes.Types: DevVersion :: VersionExtra
+ Data.API.Changes.Types: Release :: Version -> VersionExtra
+ Data.API.Changes.Types: UpdateHere :: (Maybe UpdateDeclPos) -> UpdateDeclPos
+ Data.API.Changes.Types: UpdateList :: UpdateTypePos -> UpdateTypePos
+ Data.API.Changes.Types: UpdateMaybe :: UpdateTypePos -> UpdateTypePos
+ Data.API.Changes.Types: UpdateNamed :: TypeName -> UpdateTypePos
+ Data.API.Changes.Types: UpdateRecord :: (Map FieldName (Maybe UpdateTypePos)) -> UpdateDeclPos
+ Data.API.Changes.Types: UpdateType :: UpdateTypePos -> UpdateDeclPos
+ Data.API.Changes.Types: UpdateUnion :: (Map FieldName (Maybe UpdateTypePos)) -> UpdateDeclPos
+ Data.API.Changes.Types: ValidateData :: NormAPI -> APITableChange
+ Data.API.Changes.Types: data APIChange
+ Data.API.Changes.Types: data APIChangelog
+ Data.API.Changes.Types: data APITableChange
+ Data.API.Changes.Types: data UpdateDeclPos
+ Data.API.Changes.Types: data UpdateTypePos
+ Data.API.Changes.Types: data VersionExtra
+ Data.API.Changes.Types: instance Data.API.PP.PP Data.API.Changes.Types.VersionExtra
+ Data.API.Changes.Types: instance Data.API.PP.PPLines Data.API.Changes.Types.APIChange
+ Data.API.Changes.Types: instance Data.API.PP.PPLines Data.API.Changes.Types.APITableChange
+ Data.API.Changes.Types: instance GHC.Classes.Eq Data.API.Changes.Types.APIChange
+ Data.API.Changes.Types: instance GHC.Classes.Eq Data.API.Changes.Types.APIChangelog
+ Data.API.Changes.Types: instance GHC.Classes.Eq Data.API.Changes.Types.APITableChange
+ Data.API.Changes.Types: instance GHC.Classes.Eq Data.API.Changes.Types.UpdateDeclPos
+ Data.API.Changes.Types: instance GHC.Classes.Eq Data.API.Changes.Types.UpdateTypePos
+ Data.API.Changes.Types: instance GHC.Classes.Eq Data.API.Changes.Types.VersionExtra
+ Data.API.Changes.Types: instance GHC.Classes.Ord Data.API.Changes.Types.VersionExtra
+ Data.API.Changes.Types: instance GHC.Show.Show Data.API.Changes.Types.APIChange
+ Data.API.Changes.Types: instance GHC.Show.Show Data.API.Changes.Types.APIChangelog
+ Data.API.Changes.Types: instance GHC.Show.Show Data.API.Changes.Types.APITableChange
+ Data.API.Changes.Types: instance GHC.Show.Show Data.API.Changes.Types.UpdateDeclPos
+ Data.API.Changes.Types: instance GHC.Show.Show Data.API.Changes.Types.UpdateTypePos
+ Data.API.Changes.Types: instance GHC.Show.Show Data.API.Changes.Types.VersionExtra
+ Data.API.Changes.Types: showVersionExtra :: VersionExtra -> String
+ Data.API.Changes.Types: type APIWithChangelog = (API, APIChangelog)
+ Data.API.Changes.Types: type MigrationTag = String
+ Data.API.Doc: [call_auth_required] :: Call -> Bool
+ Data.API.Doc: [call_body] :: Call -> Maybe (APIType, String)
+ Data.API.Doc: [call_description] :: Call -> String
+ Data.API.Doc: [call_headers] :: Call -> [Header]
+ Data.API.Doc: [call_http_method] :: Call -> HTTPMethod
+ Data.API.Doc: [call_params] :: Call -> [Param]
+ Data.API.Doc: [call_path] :: Call -> [String]
+ Data.API.Doc: [call_samples] :: Call -> [Sample]
+ Data.API.Doc: [call_views] :: Call -> [View]
+ Data.API.Doc: [doc_info_call_url] :: DocInfo -> HTTPMethod -> [String] -> URL
+ Data.API.Doc: [doc_info_type_url] :: DocInfo -> TypeName -> URL
+ Data.API.Doc: [header_desc] :: Header -> String
+ Data.API.Doc: [header_expl] :: Header -> String
+ Data.API.Doc: [header_name] :: Header -> String
+ Data.API.Doc: [header_required] :: Header -> Bool
+ Data.API.Doc: [header_type] :: Header -> APIType
+ Data.API.Doc: [param_desc] :: Param -> String
+ Data.API.Doc: [param_expl] :: Param -> String
+ Data.API.Doc: [param_name] :: Param -> String
+ Data.API.Doc: [param_required] :: Param -> Bool
+ Data.API.Doc: [param_type] :: Param -> Either String APIType
+ Data.API.Doc: [sample_response] :: Sample -> Maybe String
+ Data.API.Doc: [sample_status] :: Sample -> StatusCode
+ Data.API.Doc: [sample_type] :: Sample -> Body APIType
+ Data.API.Doc: [view_doc] :: View -> String
+ Data.API.Doc: [view_id] :: View -> String
+ Data.API.Doc: [view_params] :: View -> [Param]
+ Data.API.Doc: [view_type] :: View -> APIType
+ Data.API.Error: ApiInvalid :: VersionExtra -> Set TypeName -> ValidateFailure
+ Data.API.Error: BadFormat :: FormatExpected -> String -> Text -> JSONError
+ Data.API.Error: CannotDowngrade :: VersionExtra -> VersionExtra -> ValidateFailure
+ Data.API.Error: ChangelogEntryInvalid :: [APITableChange] -> APIChange -> ApplyFailure -> ValidateFailure
+ Data.API.Error: ChangelogIncomplete :: VersionExtra -> VersionExtra -> Map TypeName (MergeResult NormTypeDecl NormTypeDecl) -> ValidateFailure
+ Data.API.Error: ChangelogOutOfOrder :: VersionExtra -> VersionExtra -> ValidateFailure
+ Data.API.Error: CustomMigrationError :: String -> Value -> ValueError
+ Data.API.Error: DeclMalformed :: TypeName -> NormTypeDecl -> Set TypeName -> ApplyFailure
+ Data.API.Error: DefaultMissing :: TypeName -> FieldName -> ApplyFailure
+ Data.API.Error: ExpArray :: Expected
+ Data.API.Error: ExpBool :: Expected
+ Data.API.Error: ExpInt :: Expected
+ Data.API.Error: ExpObject :: Expected
+ Data.API.Error: ExpString :: Expected
+ Data.API.Error: Expected :: Expected -> String -> Value -> JSONError
+ Data.API.Error: FieldBadDefaultValue :: TypeName -> FieldName -> APIType -> DefaultValue -> ApplyFailure
+ Data.API.Error: FieldDoesNotExist :: TypeName -> TypeKind -> FieldName -> ApplyFailure
+ Data.API.Error: FieldExists :: TypeName -> TypeKind -> FieldName -> ApplyFailure
+ Data.API.Error: FmtBinary :: FormatExpected
+ Data.API.Error: FmtOther :: FormatExpected
+ Data.API.Error: FmtUTC :: FormatExpected
+ Data.API.Error: InElem :: Int -> Step
+ Data.API.Error: InField :: Text -> Step
+ Data.API.Error: IntRangeError :: String -> Int -> IntRange -> JSONError
+ Data.API.Error: InvalidAPI :: ApplyFailure -> ValueError
+ Data.API.Error: JSONError :: JSONError -> ValueError
+ Data.API.Error: MissingAlt :: [String] -> JSONError
+ Data.API.Error: MissingField :: JSONError
+ Data.API.Error: RegexError :: String -> Text -> RegEx -> JSONError
+ Data.API.Error: SyntaxError :: String -> JSONError
+ Data.API.Error: TKEnum :: TypeKind
+ Data.API.Error: TKNewtype :: TypeKind
+ Data.API.Error: TKRecord :: TypeKind
+ Data.API.Error: TKTypeSynonym :: TypeKind
+ Data.API.Error: TKUnion :: TypeKind
+ Data.API.Error: TableChangeError :: String -> ApplyFailure
+ Data.API.Error: TypeDoesNotExist :: TypeName -> ApplyFailure
+ Data.API.Error: TypeExists :: TypeName -> ApplyFailure
+ Data.API.Error: TypeInUse :: TypeName -> ApplyFailure
+ Data.API.Error: TypeMalformed :: APIType -> Set TypeName -> ApplyFailure
+ Data.API.Error: TypeWrongKind :: TypeName -> TypeKind -> ApplyFailure
+ Data.API.Error: UTCRangeError :: String -> UTCTime -> UTCRange -> JSONError
+ Data.API.Error: UnexpectedEnumVal :: [Text] -> Text -> JSONError
+ Data.API.Error: UnexpectedField :: JSONError
+ Data.API.Error: ValidateFailure :: ValidateFailure -> MigrateFailure
+ Data.API.Error: ValueError :: ValueError -> Position -> MigrateFailure
+ Data.API.Error: [afBadDefault] :: ApplyFailure -> DefaultValue
+ Data.API.Error: [afCustomMessage] :: ApplyFailure -> String
+ Data.API.Error: [afDecl] :: ApplyFailure -> NormTypeDecl
+ Data.API.Error: [afExistingField] :: ApplyFailure -> FieldName
+ Data.API.Error: [afExistingType] :: ApplyFailure -> TypeName
+ Data.API.Error: [afExpectedKind] :: ApplyFailure -> TypeKind
+ Data.API.Error: [afFieldName] :: ApplyFailure -> FieldName
+ Data.API.Error: [afFieldType] :: ApplyFailure -> APIType
+ Data.API.Error: [afMissingField] :: ApplyFailure -> FieldName
+ Data.API.Error: [afMissingType] :: ApplyFailure -> TypeName
+ Data.API.Error: [afMissingTypes] :: ApplyFailure -> Set TypeName
+ Data.API.Error: [afTypeKind] :: ApplyFailure -> TypeKind
+ Data.API.Error: [afTypeName] :: ApplyFailure -> TypeName
+ Data.API.Error: [afType] :: ApplyFailure -> APIType
+ Data.API.Error: [vfApplyFailure] :: ValidateFailure -> ApplyFailure
+ Data.API.Error: [vfChangelogVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Error: [vfDifferences] :: ValidateFailure -> Map TypeName (MergeResult NormTypeDecl NormTypeDecl)
+ Data.API.Error: [vfEarlierVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Error: [vfFailedToApply] :: ValidateFailure -> APIChange
+ Data.API.Error: [vfFromVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Error: [vfInvalidVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Error: [vfLaterVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Error: [vfMissingDeclarations] :: ValidateFailure -> Set TypeName
+ Data.API.Error: [vfSuccessfullyApplied] :: ValidateFailure -> [APITableChange]
+ Data.API.Error: [vfTargetVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Error: [vfToVersion] :: ValidateFailure -> VersionExtra
+ Data.API.Error: badFormat :: String -> Text -> JSONError
+ Data.API.Error: data ApplyFailure
+ Data.API.Error: data Expected
+ Data.API.Error: data FormatExpected
+ Data.API.Error: data JSONError
+ Data.API.Error: data MigrateFailure
+ Data.API.Error: data Step
+ Data.API.Error: data TypeKind
+ Data.API.Error: data ValidateFailure
+ Data.API.Error: data ValidateWarning
+ Data.API.Error: data ValueError
+ Data.API.Error: expectedArray :: Value -> JSONError
+ Data.API.Error: expectedBool :: Value -> JSONError
+ Data.API.Error: expectedInt :: Value -> JSONError
+ Data.API.Error: expectedObject :: Value -> JSONError
+ Data.API.Error: expectedString :: Value -> JSONError
+ Data.API.Error: inField :: FieldName -> Step
+ Data.API.Error: instance Data.API.PP.PP Data.API.Error.TypeKind
+ Data.API.Error: instance Data.API.PP.PPLines Data.API.Error.ApplyFailure
+ Data.API.Error: instance Data.API.PP.PPLines Data.API.Error.MigrateFailure
+ Data.API.Error: instance Data.API.PP.PPLines Data.API.Error.Step
+ Data.API.Error: instance Data.API.PP.PPLines Data.API.Error.ValidateFailure
+ Data.API.Error: instance Data.API.PP.PPLines Data.API.Error.ValueError
+ Data.API.Error: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Error.Expected
+ Data.API.Error: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Error.FormatExpected
+ Data.API.Error: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Error.JSONError
+ Data.API.Error: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Error.Step
+ Data.API.Error: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Error.Expected
+ Data.API.Error: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Error.FormatExpected
+ Data.API.Error: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Error.JSONError
+ Data.API.Error: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Error.Step
+ Data.API.Error: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.Error.Step
+ Data.API.Error: instance GHC.Classes.Eq Data.API.Error.ApplyFailure
+ Data.API.Error: instance GHC.Classes.Eq Data.API.Error.Expected
+ Data.API.Error: instance GHC.Classes.Eq Data.API.Error.FormatExpected
+ Data.API.Error: instance GHC.Classes.Eq Data.API.Error.JSONError
+ Data.API.Error: instance GHC.Classes.Eq Data.API.Error.MigrateFailure
+ Data.API.Error: instance GHC.Classes.Eq Data.API.Error.Step
+ Data.API.Error: instance GHC.Classes.Eq Data.API.Error.TypeKind
+ Data.API.Error: instance GHC.Classes.Eq Data.API.Error.ValidateFailure
+ Data.API.Error: instance GHC.Classes.Eq Data.API.Error.ValueError
+ Data.API.Error: instance GHC.Show.Show Data.API.Error.ApplyFailure
+ Data.API.Error: instance GHC.Show.Show Data.API.Error.Expected
+ Data.API.Error: instance GHC.Show.Show Data.API.Error.FormatExpected
+ Data.API.Error: instance GHC.Show.Show Data.API.Error.JSONError
+ Data.API.Error: instance GHC.Show.Show Data.API.Error.MigrateFailure
+ Data.API.Error: instance GHC.Show.Show Data.API.Error.Step
+ Data.API.Error: instance GHC.Show.Show Data.API.Error.TypeKind
+ Data.API.Error: instance GHC.Show.Show Data.API.Error.ValidateFailure
+ Data.API.Error: instance GHC.Show.Show Data.API.Error.ValidateWarning
+ Data.API.Error: instance GHC.Show.Show Data.API.Error.ValueError
+ Data.API.Error: prettyJSONError :: JSONError -> String
+ Data.API.Error: prettyJSONErrorPositions :: [(JSONError, Position)] -> String
+ Data.API.Error: prettyMigrateFailure :: MigrateFailure -> String
+ Data.API.Error: prettyStep :: Step -> String
+ Data.API.Error: prettyValidateFailure :: ValidateFailure -> String
+ Data.API.Error: prettyValueError :: ValueError -> String
+ Data.API.Error: prettyValueErrorPosition :: (ValueError, Position) -> String
+ Data.API.Error: type JSONWarning = JSONError
+ Data.API.Error: type MigrateWarning = ValidateWarning
+ Data.API.Error: type Position = [Step]
+ Data.API.JSON: instance Data.API.JSON.FromJSONWithErrs ()
+ Data.API.JSON: instance Data.API.JSON.FromJSONWithErrs Data.API.Types.Binary
+ Data.API.JSON: instance Data.API.JSON.FromJSONWithErrs Data.Aeson.Types.Internal.Value
+ Data.API.JSON: instance Data.API.JSON.FromJSONWithErrs Data.Text.Internal.Text
+ Data.API.JSON: instance Data.API.JSON.FromJSONWithErrs Data.Time.Clock.UTC.UTCTime
+ Data.API.JSON: instance Data.API.JSON.FromJSONWithErrs Data.Version.Version
+ Data.API.JSON: instance Data.API.JSON.FromJSONWithErrs GHC.Integer.Type.Integer
+ Data.API.JSON: instance Data.API.JSON.FromJSONWithErrs GHC.Types.Bool
+ Data.API.JSON: instance Data.API.JSON.FromJSONWithErrs GHC.Types.Int
+ Data.API.JSON: instance Data.API.JSON.FromJSONWithErrs a => Data.API.JSON.FromJSONWithErrs (GHC.Base.Maybe a)
+ Data.API.JSON: instance Data.API.JSON.FromJSONWithErrs a => Data.API.JSON.FromJSONWithErrs [a]
+ Data.API.JSON: instance GHC.Base.Alternative Data.API.JSON.ParserWithErrs
+ Data.API.JSON: instance GHC.Base.Applicative Data.API.JSON.ParserWithErrs
+ Data.API.JSON: instance GHC.Base.Functor Data.API.JSON.ParserWithErrs
+ Data.API.JSON: instance GHC.Base.Monad Data.API.JSON.ParserWithErrs
+ Data.API.JSONToCBOR: deserialiseJSONWithSchema :: API -> TypeName -> ByteString -> Value
+ Data.API.JSONToCBOR: jsonToCBORWithSchema :: API -> TypeName -> Value -> Term
+ Data.API.JSONToCBOR: postprocessJSON :: API -> TypeName -> Value -> Either ValueError Value
+ Data.API.JSONToCBOR: serialiseJSONWithSchema :: API -> TypeName -> Value -> ByteString
+ Data.API.Markdown: [mdmFieldDefault] :: MarkdownMethods -> FieldName -> APIType -> Maybe DefaultValue
+ Data.API.Markdown: [mdmLink] :: MarkdownMethods -> TypeName -> MDComment
+ Data.API.Markdown: [mdmPp] :: MarkdownMethods -> MDComment -> MDComment -> MDComment
+ Data.API.Markdown: [mdmSummaryPostfix] :: MarkdownMethods -> TypeName -> MDComment
+ Data.API.NormalForm: instance Control.DeepSeq.NFData Data.API.NormalForm.NormTypeDecl
+ Data.API.NormalForm: instance Data.API.PP.PPLines Data.API.NormalForm.NormTypeDecl
+ Data.API.NormalForm: instance GHC.Classes.Eq Data.API.NormalForm.NormTypeDecl
+ Data.API.NormalForm: instance GHC.Show.Show Data.API.NormalForm.NormTypeDecl
+ Data.API.PP: instance (Data.API.PP.PPLines s, Data.API.PP.PPLines t) => Data.API.PP.PPLines (s, t)
+ Data.API.PP: instance Data.API.PP.PP Data.API.Types.APIType
+ Data.API.PP: instance Data.API.PP.PP Data.API.Types.BasicType
+ Data.API.PP: instance Data.API.PP.PP Data.API.Types.DefaultValue
+ Data.API.PP: instance Data.API.PP.PP Data.API.Types.FieldName
+ Data.API.PP: instance Data.API.PP.PP Data.API.Types.TypeName
+ Data.API.PP: instance Data.API.PP.PP Data.Text.Internal.Text
+ Data.API.PP: instance Data.API.PP.PP Data.Version.Version
+ Data.API.PP: instance Data.API.PP.PP [GHC.Types.Char]
+ Data.API.PP: instance Data.API.PP.PP t => Data.API.PP.PP (Data.Set.Base.Set t)
+ Data.API.PP: instance Data.API.PP.PPLines Data.Aeson.Types.Internal.Value
+ Data.API.PP: instance Data.API.PP.PPLines t => Data.API.PP.PPLines [t]
+ Data.API.TH: fieldNameE :: FieldName -> ExpQ
+ Data.API.TH: fieldNameVarE :: FieldName -> ExpQ
+ Data.API.TH: mkNameText :: Text -> Name
+ Data.API.TH: typeNameE :: TypeName -> ExpQ
+ Data.API.Tools: cborGenericValueTestsTool :: Name -> Name -> APITool
+ Data.API.Tools: cborTestsTool :: Name -> APITool
+ Data.API.Tools: cborToJSONTestsTool :: Name -> Name -> APITool
+ Data.API.Tools: cborTool :: APITool
+ Data.API.Tools: jsonGenericValueTestsTool :: Name -> Name -> APITool
+ Data.API.Tools: jsonToCBORTestsTool :: Name -> Name -> APITool
+ Data.API.Tools.CBOR: cborTool :: APITool
+ Data.API.Tools.Combinators: instance GHC.Base.Monoid (Data.API.Tools.Combinators.Tool a)
+ Data.API.Tools.Datatypes: datatypesTool' :: (APINode -> [Name]) -> APITool
+ Data.API.Tools.Datatypes: defaultDerivedClasses :: APINode -> [Name]
+ Data.API.Tools.Datatypes: nodeFieldP :: APINode -> FieldName -> PatQ
+ Data.API.Tools.Example: instance Data.API.Tools.Example.Example Data.API.Types.Binary
+ Data.API.Tools.Example: instance Data.API.Tools.Example.Example Data.Aeson.Types.Internal.Value
+ Data.API.Tools.Example: instance Data.API.Tools.Example.Example Data.Text.Internal.Text
+ Data.API.Tools.Example: instance Data.API.Tools.Example.Example Data.Time.Clock.UTC.UTCTime
+ Data.API.Tools.Example: instance Data.API.Tools.Example.Example GHC.Types.Bool
+ Data.API.Tools.Example: instance Data.API.Tools.Example.Example GHC.Types.Int
+ Data.API.Tools.Example: instance Data.API.Tools.Example.Example a => Data.API.Tools.Example.Example (GHC.Base.Maybe a)
+ Data.API.Tools.Example: instance Data.API.Tools.Example.Example a => Data.API.Tools.Example.Example [a]
+ Data.API.Tools.JSONTests: cborGenericValueTestsTool :: Name -> Name -> APITool
+ Data.API.Tools.JSONTests: cborTestsTool :: Name -> APITool
+ Data.API.Tools.JSONTests: cborToJSONTestsTool :: Name -> Name -> APITool
+ Data.API.Tools.JSONTests: jsonGenericValueTestsTool :: Name -> Name -> APITool
+ Data.API.Tools.JSONTests: jsonToCBORTestsTool :: Name -> Name -> APITool
+ Data.API.Tools.JSONTests: prop_cborRoundtrip :: forall a. (Eq a, Serialise a) => a -> Bool
+ Data.API.Tools.JSONTests: prop_cborToJSON :: forall a. (Eq a, Serialise a, ToJSON a) => API -> TypeName -> a -> Result
+ Data.API.Tools.JSONTests: prop_jsonToCBOR :: forall a. (Eq a, Serialise a, ToJSON a) => API -> TypeName -> a -> Result
+ Data.API.Tools.QuickCheck: instance Test.QuickCheck.Arbitrary.Arbitrary Data.Time.Clock.UTC.UTCTime
+ Data.API.Types: [_Binary] :: Binary -> ByteString
+ Data.API.Types: [_FieldName] :: FieldName -> Text
+ Data.API.Types: [_TypeName] :: TypeName -> Text
+ Data.API.Types: [anComment] :: APINode -> MDComment
+ Data.API.Types: [anConvert] :: APINode -> Conversion
+ Data.API.Types: [anName] :: APINode -> TypeName
+ Data.API.Types: [anPrefix] :: APINode -> Prefix
+ Data.API.Types: [anSpec] :: APINode -> Spec
+ Data.API.Types: [ftComment] :: FieldType -> MDComment
+ Data.API.Types: [ftDefault] :: FieldType -> Maybe DefaultValue
+ Data.API.Types: [ftReadOnly] :: FieldType -> Bool
+ Data.API.Types: [ftType] :: FieldType -> APIType
+ Data.API.Types: [ir_hi] :: IntRange -> Maybe Int
+ Data.API.Types: [ir_lo] :: IntRange -> Maybe Int
+ Data.API.Types: [re_regex] :: RegEx -> Regex
+ Data.API.Types: [re_text] :: RegEx -> Text
+ Data.API.Types: [seAlts] :: SpecEnum -> [(FieldName, MDComment)]
+ Data.API.Types: [snFilter] :: SpecNewtype -> Maybe Filter
+ Data.API.Types: [snType] :: SpecNewtype -> BasicType
+ Data.API.Types: [srFields] :: SpecRecord -> [(FieldName, FieldType)]
+ Data.API.Types: [suFields] :: SpecUnion -> [(FieldName, (APIType, MDComment))]
+ Data.API.Types: [ur_hi] :: UTCRange -> Maybe UTCTime
+ Data.API.Types: [ur_lo] :: UTCRange -> Maybe UTCTime
+ Data.API.Types: base64ToBinary :: Text -> Either String Binary
+ Data.API.Types: instance Codec.Serialise.Class.Serialise Data.API.Types.Binary
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.APINode
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.APIType
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.BasicType
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.Binary
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.DefaultValue
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.FieldName
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.FieldType
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.Filter
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.IntRange
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.RegEx
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.Spec
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.SpecEnum
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.SpecNewtype
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.SpecRecord
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.SpecUnion
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.Thing
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.TypeName
+ Data.API.Types: instance Control.DeepSeq.NFData Data.API.Types.UTCRange
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.APINode
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.APIType
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.BasicType
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.Binary
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.DefaultValue
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.FieldName
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.FieldType
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.Filter
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.IntRange
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.RegEx
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.Spec
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.SpecEnum
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.SpecNewtype
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.SpecRecord
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.SpecUnion
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.Thing
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.TypeName
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON Data.API.Types.UTCRange
+ Data.API.Types: instance Data.Aeson.Types.FromJSON.FromJSON s0 => Data.Aeson.Types.FromJSON.FromJSON (Data.CaseInsensitive.Internal.CI s0)
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.APINode
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.APIType
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.BasicType
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.Binary
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.DefaultValue
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.FieldName
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.FieldType
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.Filter
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.IntRange
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.RegEx
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.Spec
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.SpecEnum
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.SpecNewtype
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.SpecRecord
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.SpecUnion
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.Thing
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.TypeName
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Types.UTCRange
+ Data.API.Types: instance Data.Aeson.Types.ToJSON.ToJSON s0 => Data.Aeson.Types.ToJSON.ToJSON (Data.CaseInsensitive.Internal.CI s0)
+ Data.API.Types: instance Data.SafeCopy.SafeCopy.SafeCopy Data.API.Types.Binary
+ Data.API.Types: instance Data.String.IsString Data.API.Types.APIType
+ Data.API.Types: instance Data.String.IsString Data.API.Types.FieldName
+ Data.API.Types: instance Data.String.IsString Data.API.Types.TypeName
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.APINode
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.APIType
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.BasicType
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.Binary
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.DefaultValue
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.FieldName
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.FieldType
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.Filter
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.IntRange
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.RegEx
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.Spec
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.SpecEnum
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.SpecNewtype
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.SpecRecord
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.SpecUnion
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.Thing
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.TypeName
+ Data.API.Types: instance GHC.Classes.Eq Data.API.Types.UTCRange
+ Data.API.Types: instance GHC.Classes.Ord Data.API.Types.Binary
+ Data.API.Types: instance GHC.Classes.Ord Data.API.Types.FieldName
+ Data.API.Types: instance GHC.Classes.Ord Data.API.Types.TypeName
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.APINode
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.APIType
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.BasicType
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.Binary
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.DefaultValue
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.FieldName
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.FieldType
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.Filter
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.IntRange
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.RegEx
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.Spec
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.SpecEnum
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.SpecNewtype
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.SpecRecord
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.SpecUnion
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.Thing
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.TypeName
+ Data.API.Types: instance GHC.Show.Show Data.API.Types.UTCRange
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.APINode
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.APIType
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.BasicType
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.DefaultValue
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.FieldName
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.FieldType
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.Filter
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.IntRange
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.RegEx
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.Spec
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.SpecEnum
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.SpecNewtype
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.SpecRecord
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.SpecUnion
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.Thing
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.TypeName
+ Data.API.Types: instance Language.Haskell.TH.Syntax.Lift Data.API.Types.UTCRange
+ Data.API.Types: instance Test.QuickCheck.Arbitrary.Arbitrary Data.API.Types.Binary
+ Data.API.Types: instance Test.QuickCheck.Arbitrary.Arbitrary Data.Text.Internal.Text
+ Data.API.Utils: InBoth :: a -> b -> MergeResult a b
+ Data.API.Utils: OnlyInLeft :: a -> MergeResult a b
+ Data.API.Utils: OnlyInRight :: b -> MergeResult a b
+ Data.API.Utils: data MergeResult a b
+ Data.API.Utils: diffMaps :: (Eq a, Ord k) => Map k a -> Map k a -> Map k (MergeResult a a)
+ Data.API.Utils: instance (GHC.Classes.Eq b, GHC.Classes.Eq a) => GHC.Classes.Eq (Data.API.Utils.MergeResult a b)
+ Data.API.Utils: instance (GHC.Show.Show b, GHC.Show.Show a) => GHC.Show.Show (Data.API.Utils.MergeResult a b)
+ Data.API.Utils: matchMaps :: Ord k => Map k a -> Map k b -> Either (k, Either a b) (Map k (a, b))
+ Data.API.Utils: mergeMaps :: Ord k => Map k a -> Map k b -> Map k (MergeResult a b)
+ Data.API.Value: Bool :: !Bool -> Value
+ Data.API.Value: Bytes :: !Binary -> Value
+ Data.API.Value: Enum :: !FieldName -> Value
+ Data.API.Value: Field :: FieldName -> Value -> Field
+ Data.API.Value: Int :: !Int -> Value
+ Data.API.Value: JSON :: !Value -> Value
+ Data.API.Value: List :: ![Value] -> Value
+ Data.API.Value: Maybe :: !(Maybe Value) -> Value
+ Data.API.Value: Record :: !Record -> Value
+ Data.API.Value: String :: !Text -> Value
+ Data.API.Value: UTCTime :: !UTCTime -> Value
+ Data.API.Value: Union :: !FieldName -> !Value -> Value
+ Data.API.Value: [fieldName] :: Field -> FieldName
+ Data.API.Value: [fieldValue] :: Field -> Value
+ Data.API.Value: arbitrary :: NormAPI -> Gen (APIType, Value)
+ Data.API.Value: arbitraryJSONValue :: Gen Value
+ Data.API.Value: arbitraryOfType :: NormAPI -> APIType -> Gen Value
+ Data.API.Value: data Field
+ Data.API.Value: data Value
+ Data.API.Value: decode :: NormAPI -> APIType -> Decoder s Value
+ Data.API.Value: deleteField :: FieldName -> Record -> Record
+ Data.API.Value: encode :: Value -> Encoding
+ Data.API.Value: expectEnum :: Value -> Position -> Either (ValueError, Position) FieldName
+ Data.API.Value: expectList :: Value -> Position -> Either (ValueError, Position) [Value]
+ Data.API.Value: expectMaybe :: Value -> Position -> Either (ValueError, Position) (Maybe Value)
+ Data.API.Value: expectRecord :: Value -> Position -> Either (ValueError, Position) Record
+ Data.API.Value: expectUnion :: Value -> Position -> Either (ValueError, Position) (FieldName, Value)
+ Data.API.Value: findField :: FieldName -> Record -> Maybe (Record, Value, Record)
+ Data.API.Value: fromDefaultValue :: NormAPI -> APIType -> DefaultValue -> Maybe Value
+ Data.API.Value: fromJSON :: NormAPI -> APIType -> Value -> Either [(JSONError, Position)] (Value, [(JSONWarning, Position)])
+ Data.API.Value: insertField :: FieldName -> Value -> Record -> Record
+ Data.API.Value: instance Control.DeepSeq.NFData Data.API.Value.Field
+ Data.API.Value: instance Control.DeepSeq.NFData Data.API.Value.Value
+ Data.API.Value: instance Data.Aeson.Types.ToJSON.ToJSON Data.API.Value.Value
+ Data.API.Value: instance GHC.Classes.Eq Data.API.Value.Field
+ Data.API.Value: instance GHC.Classes.Eq Data.API.Value.Value
+ Data.API.Value: instance GHC.Show.Show Data.API.Value.Field
+ Data.API.Value: instance GHC.Show.Show Data.API.Value.Value
+ Data.API.Value: joinRecords :: Record -> FieldName -> Value -> Record -> Record
+ Data.API.Value: lookupType :: TypeName -> NormAPI -> Either ApplyFailure NormTypeDecl
+ Data.API.Value: mapToRecord :: Map FieldName Value -> Record
+ Data.API.Value: matchesNormAPI :: NormAPI -> APIType -> Value -> Position -> Either (ValueError, Position) ()
+ Data.API.Value: parseJSON :: NormAPI -> APIType -> Value -> ParserWithErrs Value
+ Data.API.Value: prop_cborGeneric :: Serialise a => API -> TypeName -> a -> Result
+ Data.API.Value: prop_cborRoundTrip :: NormAPI -> Property
+ Data.API.Value: prop_jsonGeneric :: ToJSON a => API -> TypeName -> a -> Result
+ Data.API.Value: prop_jsonRoundTrip :: NormAPI -> Property
+ Data.API.Value: recordToMap :: Record -> Map FieldName Value
+ Data.API.Value: renameField :: FieldName -> FieldName -> Record -> Record
+ Data.API.Value: type Record = [Field]
+ Data.Binary.Serialise.CBOR.Extra: (<$!>) :: Monad m => (a -> b) -> m a -> m b
+ Data.Binary.Serialise.CBOR.Extra: decodeListWith :: Decoder s a -> Decoder s [a]
+ Data.Binary.Serialise.CBOR.Extra: decodeMaybeWith :: Decoder s a -> Decoder s (Maybe a)
+ Data.Binary.Serialise.CBOR.Extra: decodeUnion :: [(Text, Decoder s a)] -> Decoder s a
+ Data.Binary.Serialise.CBOR.Extra: encodeListWith :: (a -> Encoding) -> [a] -> Encoding
+ Data.Binary.Serialise.CBOR.Extra: encodeMaybeWith :: (a -> Encoding) -> Maybe a -> Encoding
+ Data.Binary.Serialise.CBOR.Extra: encodeRecordFields :: [Encoding] -> Encoding
+ Data.Binary.Serialise.CBOR.Extra: encodeUnion :: Text -> Encoding -> Encoding
+ Data.Binary.Serialise.CBOR.Extra: infixl 4 <$!>
+ Data.Binary.Serialise.CBOR.JSON: cborToJson :: Term -> Value
+ Data.Binary.Serialise.CBOR.JSON: decodeJSON :: Decoder s Value
+ Data.Binary.Serialise.CBOR.JSON: encodeJSON :: Value -> Encoding
+ Data.Binary.Serialise.CBOR.JSON: instance Codec.Serialise.Class.Serialise Data.Aeson.Types.Internal.Value
+ Data.Binary.Serialise.CBOR.JSON: jsonToCbor :: Value -> Term
- Data.API.Changes: CustomMigrations :: (db -> Object -> Either ValueError Object) -> (db -> NormAPI -> Either ApplyFailure (Maybe NormAPI)) -> (ty -> Value -> Either ValueError Value) -> (ty -> NormTypeDecl -> Either ApplyFailure (Maybe NormTypeDecl)) -> (fld -> Value -> Either ValueError Value) -> CustomMigrations db ty fld
+ Data.API.Changes: CustomMigrations :: (db -> o -> Either ValueError o) -> (db -> NormAPI -> Either ApplyFailure (Maybe NormAPI)) -> (ty -> v -> Either ValueError v) -> (ty -> NormTypeDecl -> Either ApplyFailure (Maybe NormTypeDecl)) -> (fld -> v -> Either ValueError v) -> CustomMigrations o v db ty fld
- Data.API.Changes: data CustomMigrations db ty fld
+ Data.API.Changes: data CustomMigrations o v db ty fld
- Data.API.Changes: migrateDataDump :: (Read db, Read rec, Read fld) => (API, Version) -> (API, VersionExtra) -> APIChangelog -> CustomMigrations db rec fld -> TypeName -> DataChecks -> Value -> Either MigrateFailure (Value, [MigrateWarning])
+ Data.API.Changes: migrateDataDump :: (Read db, Read rec, Read fld) => (API, Version) -> (API, VersionExtra) -> APIChangelog -> CustomMigrations Object Value db rec fld -> TypeName -> DataChecks -> Value -> Either MigrateFailure (Value, [MigrateWarning])
- Data.API.Changes: validateChanges :: (Read db, Read rec, Read fld) => (API, Version) -> (API, VersionExtra) -> APIChangelog -> CustomMigrations db rec fld -> TypeName -> DataChecks -> Either ValidateFailure [ValidateWarning]
+ Data.API.Changes: validateChanges :: (Read db, Read rec, Read fld) => (API, Version) -> (API, VersionExtra) -> APIChangelog -> CustomMigrations o v db rec fld -> TypeName -> DataChecks -> Either ValidateFailure [ValidateWarning]
- Data.API.JSON: parseJSONWithErrs :: FromJSONWithErrs a => Value -> ParserWithErrs a
+ Data.API.JSON: parseJSONWithErrs :: (FromJSONWithErrs a, FromJSON a) => Value -> ParserWithErrs a
- Data.API.Tools.Example: example :: Example a => Gen a
+ Data.API.Tools.Example: example :: (Example a, Arbitrary a) => Gen a
- Data.API.Tools.JSONTests: prop_decodesTo :: (Eq a, FromJSONWithErrs a) => Value -> a -> Bool
+ Data.API.Tools.JSONTests: prop_decodesTo :: forall a. (Eq a, FromJSONWithErrs a) => Value -> a -> Bool
- Data.API.Tools.JSONTests: prop_decodesTo' :: (Eq a, FromJSONWithErrs a) => ParseFlags -> Value -> a -> Bool
+ Data.API.Tools.JSONTests: prop_decodesTo' :: forall a. (Eq a, FromJSONWithErrs a) => ParseFlags -> Value -> a -> Bool
- Data.API.Tools.JSONTests: prop_resultsMatchRoundtrip :: (Eq a, ToJSON a, FromJSONWithErrs a) => a -> Bool
+ Data.API.Tools.JSONTests: prop_resultsMatchRoundtrip :: forall a. (Eq a, ToJSON a, FromJSONWithErrs a) => a -> Bool
- Data.API.Types: FieldName :: String -> FieldName
+ Data.API.Types: FieldName :: Text -> FieldName
- Data.API.Types: TypeName :: String -> TypeName
+ Data.API.Types: TypeName :: Text -> TypeName
Files
- api-tools.cabal +99/−39
- changelog +21/−0
- dist/build/Data/API/Parse.hs +0/−1802
- dist/build/Data/API/Scan.hs +0/−636
- main/Data/API/MigrationTool.hs +2/−1
- main/Data/API/PerfTest.hs +55/−0
- src/Data/API/API.hs +25/−17
- src/Data/API/API/Gen.hs +6/−1
- src/Data/API/Changes.hs +173/−400
- src/Data/API/Changes/Types.hs +145/−0
- src/Data/API/Doc/Types.hs +2/−1
- src/Data/API/Error.hs +372/−0
- src/Data/API/JSON.hs +32/−131
- src/Data/API/JSONToCBOR.hs +196/−0
- src/Data/API/Markdown.hs +9/−8
- src/Data/API/NormalForm.hs +8/−0
- src/Data/API/PP.hs +6/−6
- src/Data/API/Parse.y +5/−5
- src/Data/API/Scan.x +11/−2
- src/Data/API/TH.hs +25/−2
- src/Data/API/TH/Compat.hs +53/−0
- src/Data/API/Tools.hs +9/−2
- src/Data/API/Tools/CBOR.hs +200/−0
- src/Data/API/Tools/Combinators.hs +1/−0
- src/Data/API/Tools/Datatypes.hs +53/−34
- src/Data/API/Tools/DeepSeq.hs +4/−1
- src/Data/API/Tools/Enum.hs +3/−3
- src/Data/API/Tools/Example.hs +2/−1
- src/Data/API/Tools/JSON.hs +3/−9
- src/Data/API/Tools/JSONTests.hs +115/−10
- src/Data/API/Tools/QuickCheck.hs +4/−0
- src/Data/API/Tools/SafeCopy.hs +0/−4
- src/Data/API/Tools/Traversal.hs +6/−3
- src/Data/API/Tutorial.hs +60/−1
- src/Data/API/Types.hs +167/−42
- src/Data/API/Utils.hs +40/−1
- src/Data/API/Value.hs +532/−0
- src/Data/Binary/Serialise/CBOR/Extra.hs +73/−0
- src/Data/Binary/Serialise/CBOR/JSON.hs +184/−0
- tests/Data/API/Test/DSL.hs +27/−2
- tests/Data/API/Test/Gen.hs +45/−11
- tests/Data/API/Test/JSON.hs +40/−4
- tests/Data/API/Test/Main.hs +13/−0
- tests/Data/API/Test/Migration.hs +61/−2
api-tools.cabal view
@@ -1,5 +1,5 @@ Name: api-tools-Version: 0.5.2+Version: 0.8.0.1 Synopsis: DSL for generating API boilerplate and docs Description: api-tools provides a compact DSL for describing an API. It uses Template Haskell to generate the@@ -25,24 +25,32 @@ Source-Repository this Type: git Location: git://github.com/iconnect/api-tools.git- Tag: 0.5.2+ Tag: 0.8.0.0 +flag time15+ default: True+ Library Hs-Source-Dirs: src Exposed-modules: Data.API.API+ Data.API.API.DSL Data.API.API.Gen Data.API.Changes+ Data.API.Changes.Types Data.API.Doc Data.API.Doc.Subst+ Data.API.Error Data.API.JSON+ Data.API.JSONToCBOR Data.API.Markdown Data.API.NormalForm Data.API.Parse Data.API.PP Data.API.TH Data.API.Tools+ Data.API.Tools.CBOR Data.API.Tools.Combinators Data.API.Tools.Datatypes Data.API.Tools.DeepSeq@@ -57,38 +65,52 @@ Data.API.Tutorial Data.API.Types Data.API.Utils+ Data.API.Value+ Data.Binary.Serialise.CBOR.Extra+ Data.Binary.Serialise.CBOR.JSON Other-modules:- Data.API.API.DSL Data.API.Doc.Call Data.API.Doc.Dir Data.API.Doc.Types Data.API.Scan+ Data.API.TH.Compat Build-depends: Cabal >= 1.4 && < 2 ,- QuickCheck >= 2.5.1 && < 2.8 ,- aeson >= 0.6.2 && < 0.9 ,- aeson-pretty >= 0.1 && < 0.8 ,+ QuickCheck >= 2.5.1 && < 2.10 ,+ aeson >= 0.10 && < 1.3 ,+ aeson-pretty >= 0.1 && < 0.9 , array >= 0.4 && < 0.6 ,- attoparsec >= 0.10.4 && < 0.13 ,+ attoparsec >= 0.10.4 && < 0.14 , base >= 4 && < 5 ,+ base16-bytestring >= 0.1 && < 0.2 , base64-bytestring >= 1.0 && < 1.1 ,+ binary, bytestring >= 0.9 && < 0.11 , case-insensitive >= 1.0 && < 1.3 ,+ cborg >= 0.1.1.0 && < 0.2 , containers >= 0.5 && < 0.6 ,- deepseq >= 1.1 && < 1.4 ,- lens >= 3.8.7 && < 4.4 ,- old-locale >= 1.0.0.4 && < 1.1 ,+ deepseq >= 1.1 && < 1.5 ,+ lens >= 3.8.7 && < 4.16 , regex-compat-tdfa >= 0.95.1 && < 0.96 , safe >= 0.3.3 && < 0.4 ,- safecopy >= 0.8.1 && < 0.9 ,- time >= 1.4 && < 1.5 ,- template-haskell >= 2.7 && < 2.10 ,- text >= 0.11.3 && < 1.2 ,+ safecopy >= 0.8.1 && < 0.10 ,+ scientific >= 0.3 && < 0.4 ,+ serialise >= 0.1.0.0 && < 0.2 ,+ template-haskell >= 2.7 && < 2.12 ,+ text >= 0.11.3 && < 1.3 , unordered-containers >= 0.2.3.0 && < 0.3 ,- vector >= 0.10.0.1 && < 0.11+ vector >= 0.10.0.1 && < 0.12 + if flag(time15)+ Build-depends:+ time >= 1.5.0 && < 1.7+ else+ Build-depends:+ old-locale >= 1 && < 1.1,+ time >= 1.1.4 && < 1.5+ Build-tools: alex, happy@@ -107,26 +129,24 @@ Build-depends: api-tools,- QuickCheck >= 2.5.1 && < 2.8 ,- aeson >= 0.6.2 && < 0.9 ,- aeson-pretty >= 0.1 && < 0.8 ,+ QuickCheck >= 2.5.1 && < 2.10 ,+ aeson ,+ aeson-pretty >= 0.1 && < 0.9 , array >= 0.4 && < 0.6 ,- attoparsec >= 0.10.4 && < 0.13 ,+ attoparsec >= 0.10.4 && < 0.14 , base >= 4 && < 5 , base64-bytestring >= 1.0 && < 1.1 , bytestring >= 0.9 && < 0.11 , case-insensitive >= 1.0 && < 1.3 , containers >= 0.5 && < 0.6 ,- lens >= 3.8.7 && < 4.4 ,- old-locale >= 1.0.0.4 && < 1.1 ,+ lens >= 3.8.7 && < 4.16 , regex-compat-tdfa >= 0.95.1 && < 0.96 , safe >= 0.3.3 && < 0.4 ,- safecopy >= 0.8.1 && < 0.9 ,- time >= 1.4 && < 1.5 ,- template-haskell >= 2.7 && < 2.10 ,- text >= 0.11.3 && < 1.2 ,+ safecopy >= 0.8.1 && < 0.10 ,+ template-haskell >= 2.7 && < 2.12 ,+ text >= 0.11.3 && < 1.3 , unordered-containers >= 0.2.3.0 && < 0.3 ,- vector >= 0.10.0.1 && < 0.11+ vector >= 0.10.0.1 && < 0.12 GHC-Options: -main-is Data.API.MigrationTool@@ -136,6 +156,45 @@ Default-Language: Haskell2010 +Executable perf-test+ Hs-Source-Dirs: main++ Main-is: Data/API/PerfTest.hs++ Build-depends:+ api-tools,+ QuickCheck >= 2.5.1 && < 2.10 ,+ aeson ,+ aeson-pretty >= 0.1 && < 0.9 ,+ array >= 0.4 && < 0.6 ,+ attoparsec >= 0.10.4 && < 0.14 ,+ base >= 4 && < 5 ,+ base64-bytestring >= 1.0 && < 1.1 ,+ bytestring >= 0.9 && < 0.11 ,+ case-insensitive >= 1.0 && < 1.3 ,+ cborg >= 0.1.1.0 && < 0.2 ,+ containers >= 0.5 && < 0.6 ,+ deepseq >= 1.1 && < 1.5 ,+ lens >= 3.8.7 && < 4.16 ,+ regex-compat-tdfa >= 0.95.1 && < 0.96 ,+ safe >= 0.3.3 && < 0.4 ,+ safecopy >= 0.8.1 && < 0.10 ,+ serialise >= 0.1.0.0 && < 0.2 ,+ template-haskell >= 2.7 && < 2.12 ,+ text >= 0.11.3 && < 1.3 ,+ unordered-containers >= 0.2.3.0 && < 0.3 ,+ vector >= 0.10.0.1 && < 0.12,+ time++ GHC-Options:+ -main-is Data.API.PerfTest+ -Wall+ -fwarn-tabs+ -rtsopts++ Default-Language: Haskell2010++ Test-Suite test-api-tools Hs-Source-Dirs: tests @@ -153,29 +212,30 @@ Build-depends: api-tools, Cabal >= 1.4 && < 2 ,- QuickCheck >= 2.5.1 && < 2.8 ,- aeson >= 0.6.2 && < 0.9 ,- aeson-pretty >= 0.1 && < 0.8 ,+ QuickCheck >= 2.5.1 && < 2.10 ,+ aeson ,+ aeson-pretty >= 0.1 && < 0.9 , array >= 0.4 && < 0.6 ,- attoparsec >= 0.10.4 && < 0.13 ,+ attoparsec >= 0.10.4 && < 0.14 , base >= 4 && < 5 , base64-bytestring >= 1.0 && < 1.1 , bytestring >= 0.9 && < 0.11 , case-insensitive >= 1.0 && < 1.3 ,+ cborg >= 0.1.1.0 && < 0.2 , containers >= 0.5 && < 0.6 ,- lens >= 3.8.7 && < 4.4 ,- old-locale >= 1.0.0.4 && < 1.1 ,+ lens >= 3.8.7 && < 4.16 , regex-compat-tdfa >= 0.95.1 && < 0.96 , safe >= 0.3.3 && < 0.4 ,- safecopy >= 0.8.1 && < 0.9 ,- tasty >= 0.3 && < 0.9 ,- tasty-hunit >= 0.2 && < 0.9 ,+ safecopy >= 0.8.1 && < 0.10 ,+ serialise >= 0.1.0.0 && < 0.2 ,+ tasty >= 0.10.1 && < 0.12 ,+ tasty-hunit >= 0.2 && < 10.0 , tasty-quickcheck >= 0.3 && < 0.9 ,- time >= 1.4 && < 1.5 ,- template-haskell >= 2.7 && < 2.10 ,- text >= 0.11.3 && < 1.2 ,+ time,+ template-haskell >= 2.7 && < 2.12 ,+ text >= 0.11.3 && < 1.3 , unordered-containers >= 0.2.3.0 && < 0.3 ,- vector >= 0.10.0.1 && < 0.11+ vector >= 0.10.0.1 && < 0.12 GHC-Options: -main-is Data.API.Test.Main
changelog view
@@ -1,5 +1,26 @@ -*-change-log-*- +0.8.0.1 Adam Gundry <adam@well-typed.com> October 2017+ * Silently truncate floating point numbers to integers++0.8.0.0 Mikolaj Konarski <mikolaj@well-typed.com> August 2017+ * Update to match the published cborg 0.1 API++0.7.0.1 Adam Gundry <adam@well-typed.com> April 2017+ * Add support for GHC 8.0 and drop 7.6+ * Tweak generated Markdown headers++0.7.0.0 Adam Gundry <adam@well-typed.com> January 2016+ * Implement more efficient data migrations+ * Change FieldName and TypeName to use Text instead of String+ * Adapt to changes in binary-serialise-cbor++0.6.0.1 Adam Gundry <adam@well-typed.com> October 2015+ * Support building on GHC 7.10.2 and relax dependencies++0.6 Adam Gundry <adam@well-typed.com> August 2015+ * Add tool to generate CBOR Serialise instances, and related code+ 0.5.2 Adam Gundry <adam@well-typed.com> December 2014 * Fix bug in DeepSeq tool: records not reduced to normal form * Add instance for NFData Binary
− dist/build/Data/API/Parse.hs
@@ -1,1802 +0,0 @@-{-# OPTIONS_GHC -w #-}-{-# OPTIONS -fglasgow-exts -cpp #-}-{-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE TemplateHaskell #-}---module Data.API.Parse- ( parseAPI- , parseAPIWithChangelog- , api- , apiWithChangelog- ) where--import Data.API.Types-import Data.API.Scan-import Data.API.Changes-import Data.Char-import Data.String-import qualified Data.Text as T-import qualified Data.CaseInsensitive as CI-import qualified Data.Version as V-import Distribution.Text (simpleParse)-import Language.Haskell.TH-import Language.Haskell.TH.Quote-import Text.Printf-import Text.Regex-import qualified Data.Array as Happy_Data_Array-import qualified GHC.Exts as Happy_GHC_Exts-import Control.Applicative(Applicative(..))---- parser produced by Happy Version 1.19.4--newtype HappyAbsSyn = HappyAbsSyn HappyAny-#if __GLASGOW_HASKELL__ >= 607-type HappyAny = Happy_GHC_Exts.Any-#else-type HappyAny = forall a . a-#endif-happyIn5 :: (APIWithChangelog) -> (HappyAbsSyn )-happyIn5 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn5 #-}-happyOut5 :: (HappyAbsSyn ) -> (APIWithChangelog)-happyOut5 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut5 #-}-happyIn6 :: (API) -> (HappyAbsSyn )-happyIn6 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn6 #-}-happyOut6 :: (HappyAbsSyn ) -> (API)-happyOut6 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut6 #-}-happyIn7 :: ([Thing]) -> (HappyAbsSyn )-happyIn7 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn7 #-}-happyOut7 :: (HappyAbsSyn ) -> ([Thing])-happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut7 #-}-happyIn8 :: (Thing) -> (HappyAbsSyn )-happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn8 #-}-happyOut8 :: (HappyAbsSyn ) -> (Thing)-happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut8 #-}-happyIn9 :: (APINode) -> (HappyAbsSyn )-happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn9 #-}-happyOut9 :: (HappyAbsSyn ) -> (APINode)-happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut9 #-}-happyIn10 :: (Spec) -> (HappyAbsSyn )-happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn10 #-}-happyOut10 :: (HappyAbsSyn ) -> (Spec)-happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut10 #-}-happyIn11 :: (Conversion) -> (HappyAbsSyn )-happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn11 #-}-happyOut11 :: (HappyAbsSyn ) -> (Conversion)-happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut11 #-}-happyIn12 :: (MDComment) -> (HappyAbsSyn )-happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn12 #-}-happyOut12 :: (HappyAbsSyn ) -> (MDComment)-happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut12 #-}-happyIn13 :: ([MDComment]) -> (HappyAbsSyn )-happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn13 #-}-happyOut13 :: (HappyAbsSyn ) -> ([MDComment])-happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut13 #-}-happyIn14 :: (Prefix) -> (HappyAbsSyn )-happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn14 #-}-happyOut14 :: (HappyAbsSyn ) -> (Prefix)-happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut14 #-}-happyIn15 :: (SpecRecord) -> (HappyAbsSyn )-happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn15 #-}-happyOut15 :: (HappyAbsSyn ) -> (SpecRecord)-happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut15 #-}-happyIn16 :: (SpecUnion) -> (HappyAbsSyn )-happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn16 #-}-happyOut16 :: (HappyAbsSyn ) -> (SpecUnion)-happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut16 #-}-happyIn17 :: ([(FieldName, FieldType)]) -> (HappyAbsSyn )-happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn17 #-}-happyOut17 :: (HappyAbsSyn ) -> ([(FieldName, FieldType)])-happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut17 #-}-happyIn18 :: (FieldType) -> (HappyAbsSyn )-happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn18 #-}-happyOut18 :: (HappyAbsSyn ) -> (FieldType)-happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut18 #-}-happyIn19 :: (Bool) -> (HappyAbsSyn )-happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn19 #-}-happyOut19 :: (HappyAbsSyn ) -> (Bool)-happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut19 #-}-happyIn20 :: ([(FieldName,(APIType,MDComment))]) -> (HappyAbsSyn )-happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn20 #-}-happyOut20 :: (HappyAbsSyn ) -> ([(FieldName,(APIType,MDComment))])-happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut20 #-}-happyIn21 :: (SpecEnum) -> (HappyAbsSyn )-happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn21 #-}-happyOut21 :: (HappyAbsSyn ) -> (SpecEnum)-happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut21 #-}-happyIn22 :: ([(FieldName,MDComment)]) -> (HappyAbsSyn )-happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn22 #-}-happyOut22 :: (HappyAbsSyn ) -> ([(FieldName,MDComment)])-happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut22 #-}-happyIn23 :: (SpecNewtype) -> (HappyAbsSyn )-happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn23 #-}-happyOut23 :: (HappyAbsSyn ) -> (SpecNewtype)-happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut23 #-}-happyIn24 :: (Maybe Filter) -> (HappyAbsSyn )-happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn24 #-}-happyOut24 :: (HappyAbsSyn ) -> (Maybe Filter)-happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut24 #-}-happyIn25 :: (Filter) -> (HappyAbsSyn )-happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn25 #-}-happyOut25 :: (HappyAbsSyn ) -> (Filter)-happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut25 #-}-happyIn26 :: (RegEx) -> (HappyAbsSyn )-happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn26 #-}-happyOut26 :: (HappyAbsSyn ) -> (RegEx)-happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut26 #-}-happyIn27 :: (APIType) -> (HappyAbsSyn )-happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn27 #-}-happyOut27 :: (HappyAbsSyn ) -> (APIType)-happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut27 #-}-happyIn28 :: (Maybe DefaultValue) -> (HappyAbsSyn )-happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn28 #-}-happyOut28 :: (HappyAbsSyn ) -> (Maybe DefaultValue)-happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut28 #-}-happyIn29 :: (BasicType) -> (HappyAbsSyn )-happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn29 #-}-happyOut29 :: (HappyAbsSyn ) -> (BasicType)-happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut29 #-}-happyIn30 :: (FieldName) -> (HappyAbsSyn )-happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn30 #-}-happyOut30 :: (HappyAbsSyn ) -> (FieldName)-happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut30 #-}-happyIn31 :: (String) -> (HappyAbsSyn )-happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn31 #-}-happyOut31 :: (HappyAbsSyn ) -> (String)-happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut31 #-}-happyIn32 :: (TypeName) -> (HappyAbsSyn )-happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn32 #-}-happyOut32 :: (HappyAbsSyn ) -> (TypeName)-happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut32 #-}-happyIn33 :: (APIChangelog) -> (HappyAbsSyn )-happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn33 #-}-happyOut33 :: (HappyAbsSyn ) -> (APIChangelog)-happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut33 #-}-happyIn34 :: (V.Version) -> (HappyAbsSyn )-happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn34 #-}-happyOut34 :: (HappyAbsSyn ) -> (V.Version)-happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut34 #-}-happyIn35 :: (VersionExtra) -> (HappyAbsSyn )-happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn35 #-}-happyOut35 :: (HappyAbsSyn ) -> (VersionExtra)-happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut35 #-}-happyIn36 :: ([APIChange]) -> (HappyAbsSyn )-happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn36 #-}-happyOut36 :: (HappyAbsSyn ) -> ([APIChange])-happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut36 #-}-happyIn37 :: ([[APIChange]]) -> (HappyAbsSyn )-happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn37 #-}-happyOut37 :: (HappyAbsSyn ) -> ([[APIChange]])-happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut37 #-}-happyIn38 :: ([APIChange]) -> (HappyAbsSyn )-happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn38 #-}-happyOut38 :: (HappyAbsSyn ) -> ([APIChange])-happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut38 #-}-happyIn39 :: ([FieldChange]) -> (HappyAbsSyn )-happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn39 #-}-happyOut39 :: (HappyAbsSyn ) -> ([FieldChange])-happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut39 #-}-happyIn40 :: ([FieldChange]) -> (HappyAbsSyn )-happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn40 #-}-happyOut40 :: (HappyAbsSyn ) -> ([FieldChange])-happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut40 #-}-happyIn41 :: (Maybe DefaultValue) -> (HappyAbsSyn )-happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn41 #-}-happyOut41 :: (HappyAbsSyn ) -> (Maybe DefaultValue)-happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut41 #-}-happyIn42 :: (DefaultValue) -> (HappyAbsSyn )-happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn42 #-}-happyOut42 :: (HappyAbsSyn ) -> (DefaultValue)-happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut42 #-}-happyIn43 :: ([UnionChange]) -> (HappyAbsSyn )-happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn43 #-}-happyOut43 :: (HappyAbsSyn ) -> ([UnionChange])-happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut43 #-}-happyIn44 :: ([UnionChange]) -> (HappyAbsSyn )-happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn44 #-}-happyOut44 :: (HappyAbsSyn ) -> ([UnionChange])-happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut44 #-}-happyIn45 :: ([EnumChange]) -> (HappyAbsSyn )-happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn45 #-}-happyOut45 :: (HappyAbsSyn ) -> ([EnumChange])-happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut45 #-}-happyIn46 :: ([EnumChange]) -> (HappyAbsSyn )-happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn46 #-}-happyOut46 :: (HappyAbsSyn ) -> ([EnumChange])-happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut46 #-}-happyIn47 :: (MigrationTag) -> (HappyAbsSyn )-happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn47 #-}-happyOut47 :: (HappyAbsSyn ) -> (MigrationTag)-happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut47 #-}-happyInTok :: (PToken) -> (HappyAbsSyn )-happyInTok x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyInTok #-}-happyOutTok :: (HappyAbsSyn ) -> (PToken)-happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOutTok #-}---happyActOffsets :: HappyAddr-happyActOffsets = HappyA# "\x00\x00\x00\x00\x00\x00\xf8\x00\x0c\x01\xe5\x00\xe5\x00\x47\x00\x01\x01\x08\x01\xe7\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe3\x00\x00\x00\x00\x00\xdd\x00\x00\x00\xf9\x00\x00\x00\x02\x01\x3a\x00\x00\x00\xfc\x00\x00\x00\xe2\x00\xe2\x00\xe2\x00\x6e\x00\xf2\xff\x00\x00\xf4\x00\x00\x00\x00\x00\xdc\x00\x00\x00\xdc\x00\xdc\x00\xdc\x00\xe1\x00\x00\x00\x00\x00\xff\xff\xff\xff\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x00\xfb\x00\xfa\x00\x60\x00\x00\x00\x00\x00\xd7\x00\x43\x00\x3c\x00\xfd\xff\xd6\x00\x00\x00\xfd\xff\x00\x00\x50\x00\x00\x00\x3c\x00\x00\x00\x66\x00\x00\x00\x1f\x00\x00\x00\x63\x00\x00\x00\x00\x00\xf7\x00\xf6\x00\x47\x00\xf5\x00\x47\x00\x47\x00\xf1\x00\x00\x00\x00\x00\xf0\x00\x00\x00\x47\x00\xed\x00\x00\x00\x26\x00\xee\x00\xec\x00\x47\x00\x00\x00\x47\x00\x00\x00\xfa\xff\x47\x00\x47\x00\x47\x00\x00\x00\x47\x00\x47\x00\x47\x00\x00\x00\x47\x00\x47\x00\x47\x00\x47\x00\x00\x00\xeb\x00\xd2\x00\x00\x00\xea\x00\xce\x00\x00\x00\xe8\x00\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x00\x4c\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x26\x00\x26\x00\x00\x00\xc8\x00\x47\x00\x00\x00\xfe\xff\x00\x00\x00\x00\x00\x00\x26\x00\x00\x00\xe0\x00\xdf\x00\x00\x00\x00\x00\x47\x00\x26\x00\x47\x00\x26\x00\x47\x00\x26\x00\xc7\x00\x00\x00\xc9\x00\x00\x00\x00\x00\x00\x00\xdb\x00\xda\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x00\xb6\x00\x00\x00\xfe\xff\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--happyGotoOffsets :: HappyAddr-happyGotoOffsets = HappyA# "\xd1\x00\x78\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x28\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\xba\x00\xc0\x00\x00\x00\x00\x00\xc4\x00\xc3\x00\xc2\x00\x00\x00\xad\x00\x00\x00\x02\x00\x00\x00\x00\x00\xc1\x00\x00\x00\xbf\x00\xbe\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x46\x00\x36\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\xc6\x00\x99\x00\xbc\x00\x00\x00\x00\x00\x76\x00\x9d\x00\xa3\x00\xa1\x00\x69\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x67\x00\x00\x00\x00\x00\x00\x00\x5b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x00\x00\x00\xa8\x00\x00\x00\xa6\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x4a\x00\x00\x00\x00\x00\xa0\x00\xb0\x00\x9c\x00\x00\x00\x9f\x00\x98\x00\x96\x00\x94\x00\x00\x00\x92\x00\x8f\x00\x8d\x00\x00\x00\x8b\x00\x89\x00\x87\x00\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\x00\x00\x00\x00\x00\x74\x00\x2f\x00\x00\x00\x35\x00\x81\x00\x00\x00\xf4\xff\x00\x00\x00\x00\x91\x00\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\x70\x00\x7b\x00\x6f\x00\xee\xff\x37\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\xf8\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--happyDefActions :: HappyAddr-happyDefActions = HappyA# "\xfa\xff\xfa\xff\x00\x00\x00\x00\xfc\xff\x00\x00\x00\x00\xed\xff\xed\xff\x00\x00\xef\xff\xfd\xff\x00\x00\xfb\xff\xf9\xff\xf8\xff\x00\x00\xec\xff\xc6\xff\xc5\xff\xc4\xff\xc3\xff\xc7\xff\x00\x00\xc0\xff\xba\xff\xbd\xff\xee\xff\xed\xff\xbf\xff\x00\x00\xbc\xff\xed\xff\x00\x00\xbb\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\xff\xed\xff\xc1\xff\xb2\xff\x00\x00\x94\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc2\xff\xb8\xff\x00\x00\x00\x00\xf0\xff\xf6\xff\xf5\xff\xf4\xff\xf3\xff\xf2\xff\xd1\xff\x00\x00\x00\x00\xca\xff\xcb\xff\xc9\xff\xcd\xff\xcc\xff\xd0\xff\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xff\xb9\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\xff\xb6\xff\xaf\xff\x00\x00\xaa\xff\xb5\xff\x9f\xff\x00\x00\x9b\xff\xb4\xff\x99\xff\x00\x00\x95\xff\xb7\xff\xdd\xff\xe2\xff\x00\x00\xea\xff\x00\x00\xeb\xff\x00\x00\xc8\xff\xd4\xff\x00\x00\xf7\xff\x00\x00\x00\x00\xd3\xff\x00\x00\x00\x00\x00\x00\x00\x00\xed\xff\x00\x00\xdf\xff\x00\x00\x00\x00\x00\x00\x00\x00\x9a\xff\x00\x00\x00\x00\x00\x00\xa0\xff\x00\x00\x00\x00\x00\x00\x00\x00\xb0\xff\x00\x00\x00\x00\xad\xff\x00\x00\x00\x00\x9d\xff\x00\x00\x00\x00\x97\xff\x98\xff\xde\xff\xdc\xff\x00\x00\x00\x00\xd5\xff\xed\xff\xe0\xff\x00\x00\x00\x00\x00\x00\xe8\xff\xe5\xff\x00\x00\xf1\xff\xce\xff\xe6\xff\xe9\xff\xed\xff\x00\x00\xe1\xff\xdb\xff\xd8\xff\xd9\xff\xd6\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\xff\xa8\xff\x9c\xff\x9e\xff\x96\xff\x00\x00\x00\x00\xed\xff\xe3\xff\xed\xff\xcf\xff\x00\x00\xa6\xff\xa2\xff\xa5\xff\xa4\xff\xa3\xff\xa1\xff\xa7\xff\xe7\xff\xe4\xff\x00\x00\x00\x00\xae\xff\x00\x00\x00\x00\xab\xff\xa9\xff\xd7\xff\xda\xff"#--happyCheck :: HappyAddr-happyCheck = HappyA# "\xff\xff\x03\x00\x03\x00\x09\x00\x0a\x00\x13\x00\x07\x00\x19\x00\x1a\x00\x07\x00\x08\x00\x17\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x24\x00\x03\x00\x04\x00\x25\x00\x1d\x00\x07\x00\x08\x00\x09\x00\x1c\x00\x21\x00\x23\x00\x27\x00\x2a\x00\x24\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x03\x00\x07\x00\x08\x00\x0c\x00\x07\x00\x1a\x00\x07\x00\x08\x00\x07\x00\x08\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x19\x00\x1a\x00\x05\x00\x0d\x00\x1e\x00\x25\x00\x1c\x00\x0a\x00\x0b\x00\x23\x00\x0e\x00\x1c\x00\x16\x00\x10\x00\x18\x00\x12\x00\x24\x00\x24\x00\x05\x00\x16\x00\x16\x00\x18\x00\x18\x00\x0a\x00\x0b\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x10\x00\x0d\x00\x12\x00\x1f\x00\x1e\x00\x13\x00\x16\x00\x23\x00\x18\x00\x23\x00\x16\x00\x1e\x00\x18\x00\x1c\x00\x1d\x00\x1e\x00\x23\x00\x20\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x25\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x26\x00\x26\x00\x07\x00\x08\x00\x2a\x00\x2a\x00\x00\x00\x01\x00\x02\x00\x18\x00\x19\x00\x1a\x00\x18\x00\x19\x00\x1a\x00\x13\x00\x14\x00\x15\x00\x29\x00\x16\x00\x16\x00\x18\x00\x18\x00\x16\x00\x16\x00\x18\x00\x18\x00\x16\x00\x27\x00\x18\x00\x16\x00\x1b\x00\x18\x00\x2a\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x07\x00\x08\x00\x19\x00\x1a\x00\x07\x00\x08\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x11\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x14\x00\x15\x00\x19\x00\x1a\x00\x07\x00\x08\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x19\x00\x1a\x00\x22\x00\x23\x00\x28\x00\x29\x00\x07\x00\x08\x00\x26\x00\x27\x00\x1f\x00\x20\x00\x23\x00\x1d\x00\x1e\x00\x01\x00\x02\x00\x01\x00\x02\x00\x18\x00\x0f\x00\x06\x00\x2a\x00\x1b\x00\x1b\x00\x1b\x00\x21\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00\x2a\x00\x26\x00\x04\x00\x09\x00\x09\x00\x1c\x00\x1f\x00\x08\x00\x08\x00\x24\x00\x22\x00\x05\x00\x20\x00\x05\x00\x20\x00\x05\x00\x05\x00\x05\x00\x20\x00\x05\x00\x04\x00\x08\x00\x05\x00\x02\x00\x02\x00\x02\x00\x24\x00\x24\x00\x02\x00\x02\x00\x0c\x00\x0b\x00\x24\x00\x20\x00\x06\x00\x01\x00\x0b\x00\x05\x00\x24\x00\x24\x00\x2b\x00\x01\x00\x23\x00\x27\x00\x0b\x00\x01\x00\xff\xff\x17\x00\x2b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#--happyTable :: HappyAddr-happyTable = HappyA# "\x00\x00\xb6\x00\x3e\x00\x8e\x00\x8f\x00\x2d\x00\x3f\x00\xaa\x00\x65\x00\x09\x00\x0a\x00\xb3\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x2e\x00\x0d\x00\x0e\x00\xb4\x00\x54\x00\x0f\x00\x0a\x00\x10\x00\x2a\x00\xb7\x00\x55\x00\x90\x00\xc4\x00\x4a\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\x3e\x00\x09\x00\x0a\x00\x63\x00\x3f\x00\x11\x00\x09\x00\x0a\x00\xbd\x00\x0a\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x64\x00\x65\x00\x36\x00\x9b\x00\x5c\x00\xc5\x00\x1d\x00\x37\x00\x38\x00\x5d\x00\x99\x00\x0b\x00\x96\x00\x39\x00\x3c\x00\x3a\x00\xc1\x00\x4a\x00\x4a\x00\x3b\x00\xa9\x00\x3c\x00\x3c\x00\x37\x00\x38\x00\x24\x00\x25\x00\x26\x00\x27\x00\x39\x00\x95\x00\x3a\x00\x28\x00\x58\x00\x72\x00\x3b\x00\x29\x00\x3c\x00\x59\x00\x96\x00\x5c\x00\x3c\x00\x13\x00\x14\x00\x15\x00\x5d\x00\x16\x00\x7d\x00\x7e\x00\x7f\x00\x80\x00\x17\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\xa0\x00\xa2\x00\xbe\x00\x0a\x00\xa1\x00\xa3\x00\x05\x00\x03\x00\x04\x00\x75\x00\x76\x00\x77\x00\x79\x00\x7a\x00\x7b\x00\x2f\x00\x30\x00\x31\x00\x77\x00\xab\x00\xad\x00\x3c\x00\x3c\x00\xb1\x00\x9c\x00\x3c\x00\x3c\x00\x66\x00\x7b\x00\x3c\x00\x67\x00\x5d\x00\x3c\x00\x50\x00\xac\x00\x65\x00\xae\x00\x65\x00\xb2\x00\x0a\x00\x98\x00\x65\x00\x9e\x00\x0a\x00\x81\x00\x65\x00\x82\x00\x65\x00\x83\x00\x65\x00\x84\x00\x65\x00\x85\x00\x65\x00\x86\x00\x65\x00\x5f\x00\x87\x00\x65\x00\x88\x00\x65\x00\x89\x00\x65\x00\x8a\x00\x65\x00\x8b\x00\x8c\x00\x90\x00\x65\x00\x91\x00\x0a\x00\x92\x00\x65\x00\x6a\x00\x65\x00\x6d\x00\x65\x00\x6e\x00\x65\x00\x70\x00\x65\x00\x51\x00\x52\x00\x59\x00\x5a\x00\x21\x00\x0a\x00\x55\x00\x56\x00\x1e\x00\x1f\x00\x80\x00\x18\x00\x19\x00\x03\x00\x04\x00\x06\x00\x04\x00\x5e\x00\x61\x00\x68\x00\x2b\x00\x4c\x00\x4d\x00\x4e\x00\x22\x00\x4f\x00\x31\x00\x33\x00\x34\x00\xc7\x00\xc8\x00\xbd\x00\xc0\x00\xc1\x00\xc3\x00\xc4\x00\xb0\x00\xb1\x00\x2e\x00\x9b\x00\x9e\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa9\x00\x94\x00\xa8\x00\x95\x00\x6c\x00\x98\x00\x6d\x00\x70\x00\x72\x00\x74\x00\x2e\x00\x33\x00\x61\x00\x63\x00\x6a\x00\x0d\x00\x33\x00\x4c\x00\x36\x00\x2a\x00\x0d\x00\x18\x00\x33\x00\x21\x00\xbe\xff\x1d\x00\x1c\x00\x1b\x00\x0d\x00\x08\x00\x00\x00\x09\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--happyReduceArr = Happy_Data_Array.array (2, 107) [- (2 , happyReduce_2),- (3 , happyReduce_3),- (4 , happyReduce_4),- (5 , happyReduce_5),- (6 , happyReduce_6),- (7 , happyReduce_7),- (8 , happyReduce_8),- (9 , happyReduce_9),- (10 , happyReduce_10),- (11 , happyReduce_11),- (12 , happyReduce_12),- (13 , happyReduce_13),- (14 , happyReduce_14),- (15 , happyReduce_15),- (16 , happyReduce_16),- (17 , happyReduce_17),- (18 , happyReduce_18),- (19 , happyReduce_19),- (20 , happyReduce_20),- (21 , happyReduce_21),- (22 , happyReduce_22),- (23 , happyReduce_23),- (24 , happyReduce_24),- (25 , happyReduce_25),- (26 , happyReduce_26),- (27 , happyReduce_27),- (28 , happyReduce_28),- (29 , happyReduce_29),- (30 , happyReduce_30),- (31 , happyReduce_31),- (32 , happyReduce_32),- (33 , happyReduce_33),- (34 , happyReduce_34),- (35 , happyReduce_35),- (36 , happyReduce_36),- (37 , happyReduce_37),- (38 , happyReduce_38),- (39 , happyReduce_39),- (40 , happyReduce_40),- (41 , happyReduce_41),- (42 , happyReduce_42),- (43 , happyReduce_43),- (44 , happyReduce_44),- (45 , happyReduce_45),- (46 , happyReduce_46),- (47 , happyReduce_47),- (48 , happyReduce_48),- (49 , happyReduce_49),- (50 , happyReduce_50),- (51 , happyReduce_51),- (52 , happyReduce_52),- (53 , happyReduce_53),- (54 , happyReduce_54),- (55 , happyReduce_55),- (56 , happyReduce_56),- (57 , happyReduce_57),- (58 , happyReduce_58),- (59 , happyReduce_59),- (60 , happyReduce_60),- (61 , happyReduce_61),- (62 , happyReduce_62),- (63 , happyReduce_63),- (64 , happyReduce_64),- (65 , happyReduce_65),- (66 , happyReduce_66),- (67 , happyReduce_67),- (68 , happyReduce_68),- (69 , happyReduce_69),- (70 , happyReduce_70),- (71 , happyReduce_71),- (72 , happyReduce_72),- (73 , happyReduce_73),- (74 , happyReduce_74),- (75 , happyReduce_75),- (76 , happyReduce_76),- (77 , happyReduce_77),- (78 , happyReduce_78),- (79 , happyReduce_79),- (80 , happyReduce_80),- (81 , happyReduce_81),- (82 , happyReduce_82),- (83 , happyReduce_83),- (84 , happyReduce_84),- (85 , happyReduce_85),- (86 , happyReduce_86),- (87 , happyReduce_87),- (88 , happyReduce_88),- (89 , happyReduce_89),- (90 , happyReduce_90),- (91 , happyReduce_91),- (92 , happyReduce_92),- (93 , happyReduce_93),- (94 , happyReduce_94),- (95 , happyReduce_95),- (96 , happyReduce_96),- (97 , happyReduce_97),- (98 , happyReduce_98),- (99 , happyReduce_99),- (100 , happyReduce_100),- (101 , happyReduce_101),- (102 , happyReduce_102),- (103 , happyReduce_103),- (104 , happyReduce_104),- (105 , happyReduce_105),- (106 , happyReduce_106),- (107 , happyReduce_107)- ]--happy_n_terms = 44 :: Int-happy_n_nonterms = 43 :: Int--happyReduce_2 = happySpecReduce_3 0# happyReduction_2-happyReduction_2 happy_x_3- happy_x_2- happy_x_1- = case happyOut6 happy_x_1 of { happy_var_1 -> - case happyOut33 happy_x_3 of { happy_var_3 -> - happyIn5- ((happy_var_1, happy_var_3)- )}}--happyReduce_3 = happySpecReduce_1 1# happyReduction_3-happyReduction_3 happy_x_1- = case happyOut7 happy_x_1 of { happy_var_1 -> - happyIn6- (reverse happy_var_1- )}--happyReduce_4 = happySpecReduce_3 2# happyReduction_4-happyReduction_4 happy_x_3- happy_x_2- happy_x_1- = case happyOut7 happy_x_1 of { happy_var_1 -> - case happyOut8 happy_x_3 of { happy_var_3 -> - happyIn7- (happy_var_3 : happy_var_1- )}}--happyReduce_5 = happySpecReduce_0 2# happyReduction_5-happyReduction_5 = happyIn7- ([]- )--happyReduce_6 = happySpecReduce_1 3# happyReduction_6-happyReduction_6 happy_x_1- = case happyOut9 happy_x_1 of { happy_var_1 -> - happyIn8- (ThNode happy_var_1- )}--happyReduce_7 = happySpecReduce_1 3# happyReduction_7-happyReduction_7 happy_x_1- = case happyOut12 happy_x_1 of { happy_var_1 -> - happyIn8- (ThComment happy_var_1- )}--happyReduce_8 = happyReduce 7# 4# happyReduction_8-happyReduction_8 (happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut14 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_3 of { ((,) _ (TypeIden happy_var_3)) -> - case happyOut12 happy_x_4 of { happy_var_4 -> - case happyOut10 happy_x_6 of { happy_var_6 -> - case happyOut11 happy_x_7 of { happy_var_7 -> - happyIn9- (APINode (TypeName happy_var_3) happy_var_4 happy_var_1 happy_var_6 happy_var_7- ) `HappyStk` happyRest}}}}}--happyReduce_9 = happySpecReduce_1 5# happyReduction_9-happyReduction_9 happy_x_1- = case happyOut15 happy_x_1 of { happy_var_1 -> - happyIn10- (SpRecord happy_var_1- )}--happyReduce_10 = happySpecReduce_1 5# happyReduction_10-happyReduction_10 happy_x_1- = case happyOut16 happy_x_1 of { happy_var_1 -> - happyIn10- (SpUnion happy_var_1- )}--happyReduce_11 = happySpecReduce_1 5# happyReduction_11-happyReduction_11 happy_x_1- = case happyOut21 happy_x_1 of { happy_var_1 -> - happyIn10- (SpEnum happy_var_1- )}--happyReduce_12 = happySpecReduce_1 5# happyReduction_12-happyReduction_12 happy_x_1- = case happyOut23 happy_x_1 of { happy_var_1 -> - happyIn10- (SpNewtype happy_var_1- )}--happyReduce_13 = happySpecReduce_1 5# happyReduction_13-happyReduction_13 happy_x_1- = case happyOut27 happy_x_1 of { happy_var_1 -> - happyIn10- (SpSynonym happy_var_1- )}--happyReduce_14 = happyReduce 4# 6# happyReduction_14-happyReduction_14 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut30 happy_x_2 of { happy_var_2 -> - case happyOut30 happy_x_4 of { happy_var_4 -> - happyIn11- (Just (happy_var_2,happy_var_4)- ) `HappyStk` happyRest}}--happyReduce_15 = happySpecReduce_0 6# happyReduction_15-happyReduction_15 = happyIn11- (Nothing- )--happyReduce_16 = happySpecReduce_1 7# happyReduction_16-happyReduction_16 happy_x_1- = case happyOut13 happy_x_1 of { happy_var_1 -> - happyIn12- (unlines $ reverse happy_var_1- )}--happyReduce_17 = happySpecReduce_2 8# happyReduction_17-happyReduction_17 happy_x_2- happy_x_1- = case happyOut13 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { ((,) _ (Comment happy_var_2)) -> - happyIn13- (happy_var_2 : happy_var_1- )}}--happyReduce_18 = happySpecReduce_0 8# happyReduction_18-happyReduction_18 = happyIn13- ([]- )--happyReduce_19 = happySpecReduce_1 9# happyReduction_19-happyReduction_19 happy_x_1- = case happyOut31 happy_x_1 of { happy_var_1 -> - happyIn14- (CI.mk happy_var_1- )}--happyReduce_20 = happySpecReduce_2 10# happyReduction_20-happyReduction_20 happy_x_2- happy_x_1- = case happyOut17 happy_x_2 of { happy_var_2 -> - happyIn15- (SpecRecord $ reverse happy_var_2- )}--happyReduce_21 = happySpecReduce_2 11# happyReduction_21-happyReduction_21 happy_x_2- happy_x_1- = case happyOut20 happy_x_2 of { happy_var_2 -> - happyIn16- (SpecUnion $ reverse happy_var_2- )}--happyReduce_22 = happyReduce 4# 12# happyReduction_22-happyReduction_22 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut17 happy_x_1 of { happy_var_1 -> - case happyOut30 happy_x_2 of { happy_var_2 -> - case happyOut18 happy_x_4 of { happy_var_4 -> - happyIn17- ((happy_var_2,happy_var_4) : happy_var_1- ) `HappyStk` happyRest}}}--happyReduce_23 = happySpecReduce_3 12# happyReduction_23-happyReduction_23 happy_x_3- happy_x_2- happy_x_1- = case happyOut30 happy_x_1 of { happy_var_1 -> - case happyOut18 happy_x_3 of { happy_var_3 -> - happyIn17- ([(happy_var_1,happy_var_3)]- )}}--happyReduce_24 = happyReduce 4# 13# happyReduction_24-happyReduction_24 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut27 happy_x_1 of { happy_var_1 -> - case happyOut19 happy_x_2 of { happy_var_2 -> - case happyOut28 happy_x_3 of { happy_var_3 -> - case happyOut12 happy_x_4 of { happy_var_4 -> - happyIn18- (FieldType happy_var_1 happy_var_2 happy_var_3 happy_var_4- ) `HappyStk` happyRest}}}}--happyReduce_25 = happySpecReduce_1 14# happyReduction_25-happyReduction_25 happy_x_1- = happyIn19- (True- )--happyReduce_26 = happySpecReduce_0 14# happyReduction_26-happyReduction_26 = happyIn19- (False- )--happyReduce_27 = happyReduce 6# 15# happyReduction_27-happyReduction_27 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut20 happy_x_1 of { happy_var_1 -> - case happyOut30 happy_x_3 of { happy_var_3 -> - case happyOut27 happy_x_5 of { happy_var_5 -> - case happyOut12 happy_x_6 of { happy_var_6 -> - happyIn20- ((happy_var_3,(happy_var_5,happy_var_6)) : happy_var_1- ) `HappyStk` happyRest}}}}--happyReduce_28 = happyReduce 5# 15# happyReduction_28-happyReduction_28 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut30 happy_x_2 of { happy_var_2 -> - case happyOut27 happy_x_4 of { happy_var_4 -> - case happyOut12 happy_x_5 of { happy_var_5 -> - happyIn20- ([(happy_var_2,(happy_var_4,happy_var_5))]- ) `HappyStk` happyRest}}}--happyReduce_29 = happySpecReduce_2 16# happyReduction_29-happyReduction_29 happy_x_2- happy_x_1- = case happyOut22 happy_x_2 of { happy_var_2 -> - happyIn21- (SpecEnum $ reverse happy_var_2- )}--happyReduce_30 = happyReduce 4# 17# happyReduction_30-happyReduction_30 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut22 happy_x_1 of { happy_var_1 -> - case happyOut30 happy_x_3 of { happy_var_3 -> - case happyOut12 happy_x_4 of { happy_var_4 -> - happyIn22- ((happy_var_3,happy_var_4) : happy_var_1- ) `HappyStk` happyRest}}}--happyReduce_31 = happySpecReduce_3 17# happyReduction_31-happyReduction_31 happy_x_3- happy_x_2- happy_x_1- = case happyOut30 happy_x_2 of { happy_var_2 -> - case happyOut12 happy_x_3 of { happy_var_3 -> - happyIn22- ([(happy_var_2,happy_var_3)]- )}}--happyReduce_32 = happySpecReduce_3 18# happyReduction_32-happyReduction_32 happy_x_3- happy_x_2- happy_x_1- = case happyOut29 happy_x_2 of { happy_var_2 -> - case happyOut24 happy_x_3 of { happy_var_3 -> - happyIn23- (SpecNewtype happy_var_2 happy_var_3- )}}--happyReduce_33 = happySpecReduce_2 19# happyReduction_33-happyReduction_33 happy_x_2- happy_x_1- = case happyOut25 happy_x_2 of { happy_var_2 -> - happyIn24- (Just happy_var_2- )}--happyReduce_34 = happySpecReduce_0 19# happyReduction_34-happyReduction_34 = happyIn24- (Nothing- )--happyReduce_35 = happySpecReduce_1 20# happyReduction_35-happyReduction_35 happy_x_1- = case happyOut26 happy_x_1 of { happy_var_1 -> - happyIn25- (FtrStrg happy_var_1- )}--happyReduce_36 = happySpecReduce_2 20# happyReduction_36-happyReduction_36 happy_x_2- happy_x_1- = case happyOutTok happy_x_2 of { ((,) _ (Intg happy_var_2)) -> - happyIn25- (FtrIntg $ IntRange (Just happy_var_2) Nothing- )}--happyReduce_37 = happyReduce 5# 20# happyReduction_37-happyReduction_37 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_2 of { ((,) _ (Intg happy_var_2)) -> - case happyOutTok happy_x_5 of { ((,) _ (Intg happy_var_5)) -> - happyIn25- (FtrIntg $ IntRange (Just happy_var_2) (Just happy_var_5)- ) `HappyStk` happyRest}}--happyReduce_38 = happySpecReduce_2 20# happyReduction_38-happyReduction_38 happy_x_2- happy_x_1- = case happyOutTok happy_x_2 of { ((,) _ (Intg happy_var_2)) -> - happyIn25- (FtrIntg $ IntRange Nothing (Just happy_var_2)- )}--happyReduce_39 = happySpecReduce_2 20# happyReduction_39-happyReduction_39 happy_x_2- happy_x_1- = case happyOutTok happy_x_2 of { ((,) _ (UTCTIME happy_var_2)) -> - happyIn25- (FtrUTC $ UTCRange (Just happy_var_2) Nothing- )}--happyReduce_40 = happyReduce 5# 20# happyReduction_40-happyReduction_40 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOutTok happy_x_2 of { ((,) _ (UTCTIME happy_var_2)) -> - case happyOutTok happy_x_5 of { ((,) _ (UTCTIME happy_var_5)) -> - happyIn25- (FtrUTC $ UTCRange (Just happy_var_2) (Just happy_var_5)- ) `HappyStk` happyRest}}--happyReduce_41 = happySpecReduce_2 20# happyReduction_41-happyReduction_41 happy_x_2- happy_x_1- = case happyOutTok happy_x_2 of { ((,) _ (UTCTIME happy_var_2)) -> - happyIn25- (FtrUTC $ UTCRange Nothing (Just happy_var_2)- )}--happyReduce_42 = happySpecReduce_1 21# happyReduction_42-happyReduction_42 happy_x_1- = case happyOutTok happy_x_1 of { ((,) _ (Strg happy_var_1)) -> - happyIn26- (RegEx (T.pack happy_var_1) $ mkRegexWithOpts happy_var_1 False True- )}--happyReduce_43 = happySpecReduce_2 22# happyReduction_43-happyReduction_43 happy_x_2- happy_x_1- = case happyOut27 happy_x_2 of { happy_var_2 -> - happyIn27- (TyMaybe happy_var_2- )}--happyReduce_44 = happySpecReduce_3 22# happyReduction_44-happyReduction_44 happy_x_3- happy_x_2- happy_x_1- = case happyOut27 happy_x_2 of { happy_var_2 -> - happyIn27- (TyList happy_var_2- )}--happyReduce_45 = happySpecReduce_1 22# happyReduction_45-happyReduction_45 happy_x_1- = case happyOutTok happy_x_1 of { ((,) _ (TypeIden happy_var_1)) -> - happyIn27- (TyName (TypeName happy_var_1)- )}--happyReduce_46 = happySpecReduce_1 22# happyReduction_46-happyReduction_46 happy_x_1- = case happyOut29 happy_x_1 of { happy_var_1 -> - happyIn27- (TyBasic happy_var_1- )}--happyReduce_47 = happySpecReduce_1 22# happyReduction_47-happyReduction_47 happy_x_1- = happyIn27- (TyJSON- )--happyReduce_48 = happySpecReduce_1 23# happyReduction_48-happyReduction_48 happy_x_1- = case happyOut42 happy_x_1 of { happy_var_1 -> - happyIn28- (Just happy_var_1- )}--happyReduce_49 = happySpecReduce_0 23# happyReduction_49-happyReduction_49 = happyIn28- (Nothing- )--happyReduce_50 = happySpecReduce_1 24# happyReduction_50-happyReduction_50 happy_x_1- = happyIn29- (BTstring- )--happyReduce_51 = happySpecReduce_1 24# happyReduction_51-happyReduction_51 happy_x_1- = happyIn29- (BTbinary- )--happyReduce_52 = happySpecReduce_1 24# happyReduction_52-happyReduction_52 happy_x_1- = happyIn29- (BTbool- )--happyReduce_53 = happySpecReduce_1 24# happyReduction_53-happyReduction_53 happy_x_1- = happyIn29- (BTint- )--happyReduce_54 = happySpecReduce_1 24# happyReduction_54-happyReduction_54 happy_x_1- = happyIn29- (BTutc- )--happyReduce_55 = happySpecReduce_1 25# happyReduction_55-happyReduction_55 happy_x_1- = case happyOut31 happy_x_1 of { happy_var_1 -> - happyIn30- (FieldName happy_var_1- )}--happyReduce_56 = happySpecReduce_1 26# happyReduction_56-happyReduction_56 happy_x_1- = case happyOutTok happy_x_1 of { ((,) _ (VarIden happy_var_1)) -> - happyIn31- (happy_var_1- )}--happyReduce_57 = happySpecReduce_1 26# happyReduction_57-happyReduction_57 happy_x_1- = happyIn31- ("default"- )--happyReduce_58 = happySpecReduce_1 26# happyReduction_58-happyReduction_58 happy_x_1- = happyIn31- ("field"- )--happyReduce_59 = happySpecReduce_1 26# happyReduction_59-happyReduction_59 happy_x_1- = happyIn31- ("alternative"- )--happyReduce_60 = happySpecReduce_1 26# happyReduction_60-happyReduction_60 happy_x_1- = happyIn31- ("to"- )--happyReduce_61 = happySpecReduce_1 27# happyReduction_61-happyReduction_61 happy_x_1- = case happyOutTok happy_x_1 of { ((,) _ (TypeIden happy_var_1)) -> - happyIn32- (TypeName happy_var_1- )}--happyReduce_62 = happyReduce 5# 28# happyReduction_62-happyReduction_62 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut35 happy_x_2 of { happy_var_2 -> - case happyOut36 happy_x_3 of { happy_var_3 -> - case happyOut33 happy_x_5 of { happy_var_5 -> - happyIn33- (ChangesUpTo happy_var_2 happy_var_3 happy_var_5- ) `HappyStk` happyRest}}}--happyReduce_63 = happySpecReduce_2 28# happyReduction_63-happyReduction_63 happy_x_2- happy_x_1- = case happyOut34 happy_x_2 of { happy_var_2 -> - happyIn33- (ChangesStart happy_var_2- )}--happyReduce_64 = happySpecReduce_3 28# happyReduction_64-happyReduction_64 happy_x_3- happy_x_2- happy_x_1- = case happyOut33 happy_x_3 of { happy_var_3 -> - happyIn33- (happy_var_3- )}--happyReduce_65 = happySpecReduce_1 29# happyReduction_65-happyReduction_65 happy_x_1- = case happyOutTok happy_x_1 of { ((,) _ (Strg happy_var_1)) -> - happyIn34- (parseVer happy_var_1- )}--happyReduce_66 = happySpecReduce_1 30# happyReduction_66-happyReduction_66 happy_x_1- = case happyOutTok happy_x_1 of { ((,) _ (Strg happy_var_1)) -> - happyIn35- (parseVersionExtra happy_var_1- )}--happyReduce_67 = happySpecReduce_1 31# happyReduction_67-happyReduction_67 happy_x_1- = case happyOut37 happy_x_1 of { happy_var_1 -> - happyIn36- (concat (reverse happy_var_1)- )}--happyReduce_68 = happySpecReduce_2 32# happyReduction_68-happyReduction_68 happy_x_2- happy_x_1- = case happyOut37 happy_x_1 of { happy_var_1 -> - case happyOut38 happy_x_2 of { happy_var_2 -> - happyIn37- (happy_var_2 : happy_var_1- )}}--happyReduce_69 = happySpecReduce_0 32# happyReduction_69-happyReduction_69 = happyIn37- ([]- )--happyReduce_70 = happySpecReduce_3 33# happyReduction_70-happyReduction_70 happy_x_3- happy_x_2- happy_x_1- = case happyOut32 happy_x_2 of { happy_var_2 -> - case happyOut10 happy_x_3 of { happy_var_3 -> - happyIn38- ([ChAddType happy_var_2 (declNF happy_var_3)]- )}}--happyReduce_71 = happySpecReduce_2 33# happyReduction_71-happyReduction_71 happy_x_2- happy_x_1- = case happyOut32 happy_x_2 of { happy_var_2 -> - happyIn38- ([ChDeleteType happy_var_2]- )}--happyReduce_72 = happyReduce 4# 33# happyReduction_72-happyReduction_72 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut32 happy_x_2 of { happy_var_2 -> - case happyOut32 happy_x_4 of { happy_var_4 -> - happyIn38- ([ChRenameType happy_var_2 happy_var_4]- ) `HappyStk` happyRest}}--happyReduce_73 = happyReduce 4# 33# happyReduction_73-happyReduction_73 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut32 happy_x_3 of { happy_var_3 -> - case happyOut39 happy_x_4 of { happy_var_4 -> - happyIn38- (map (fldChangeToAPIChange happy_var_3) (reverse happy_var_4)- ) `HappyStk` happyRest}}--happyReduce_74 = happyReduce 4# 33# happyReduction_74-happyReduction_74 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut32 happy_x_3 of { happy_var_3 -> - case happyOut43 happy_x_4 of { happy_var_4 -> - happyIn38- (map (unionChangeToAPIChange happy_var_3) (reverse happy_var_4)- ) `HappyStk` happyRest}}--happyReduce_75 = happyReduce 4# 33# happyReduction_75-happyReduction_75 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut32 happy_x_3 of { happy_var_3 -> - case happyOut45 happy_x_4 of { happy_var_4 -> - happyIn38- (map (enumChangeToAPIChange happy_var_3) (reverse happy_var_4)- ) `HappyStk` happyRest}}--happyReduce_76 = happyReduce 4# 33# happyReduction_76-happyReduction_76 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut32 happy_x_3 of { happy_var_3 -> - case happyOut47 happy_x_4 of { happy_var_4 -> - happyIn38- ([ChCustomType happy_var_3 happy_var_4]- ) `HappyStk` happyRest}}--happyReduce_77 = happySpecReduce_2 33# happyReduction_77-happyReduction_77 happy_x_2- happy_x_1- = case happyOut47 happy_x_2 of { happy_var_2 -> - happyIn38- ([ChCustomAll happy_var_2]- )}--happyReduce_78 = happySpecReduce_1 33# happyReduction_78-happyReduction_78 happy_x_1- = happyIn38- ([]- )--happyReduce_79 = happySpecReduce_2 34# happyReduction_79-happyReduction_79 happy_x_2- happy_x_1- = case happyOut39 happy_x_1 of { happy_var_1 -> - case happyOut40 happy_x_2 of { happy_var_2 -> - happyIn39- (happy_var_2 ++ happy_var_1- )}}--happyReduce_80 = happySpecReduce_1 34# happyReduction_80-happyReduction_80 happy_x_1- = case happyOut40 happy_x_1 of { happy_var_1 -> - happyIn39- (happy_var_1- )}--happyReduce_81 = happyReduce 6# 35# happyReduction_81-happyReduction_81 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut30 happy_x_3 of { happy_var_3 -> - case happyOut27 happy_x_5 of { happy_var_5 -> - case happyOut41 happy_x_6 of { happy_var_6 -> - happyIn40- ([FldChAdd happy_var_3 happy_var_5 happy_var_6]- ) `HappyStk` happyRest}}}--happyReduce_82 = happySpecReduce_3 35# happyReduction_82-happyReduction_82 happy_x_3- happy_x_2- happy_x_1- = case happyOut30 happy_x_3 of { happy_var_3 -> - happyIn40- ([FldChDelete happy_var_3]- )}--happyReduce_83 = happyReduce 5# 35# happyReduction_83-happyReduction_83 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut30 happy_x_3 of { happy_var_3 -> - case happyOut30 happy_x_5 of { happy_var_5 -> - happyIn40- ([FldChRename happy_var_3 happy_var_5]- ) `HappyStk` happyRest}}--happyReduce_84 = happyReduce 7# 35# happyReduction_84-happyReduction_84 (happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut30 happy_x_3 of { happy_var_3 -> - case happyOut27 happy_x_5 of { happy_var_5 -> - case happyOut47 happy_x_7 of { happy_var_7 -> - happyIn40- ([FldChChange happy_var_3 happy_var_5 happy_var_7]- ) `HappyStk` happyRest}}}--happyReduce_85 = happySpecReduce_1 35# happyReduction_85-happyReduction_85 happy_x_1- = happyIn40- ([]- )--happyReduce_86 = happySpecReduce_2 36# happyReduction_86-happyReduction_86 happy_x_2- happy_x_1- = case happyOut42 happy_x_2 of { happy_var_2 -> - happyIn41- (Just happy_var_2- )}--happyReduce_87 = happySpecReduce_0 36# happyReduction_87-happyReduction_87 = happyIn41- (Nothing- )--happyReduce_88 = happySpecReduce_2 37# happyReduction_88-happyReduction_88 happy_x_2- happy_x_1- = happyIn42- (DefValList- )--happyReduce_89 = happySpecReduce_1 37# happyReduction_89-happyReduction_89 happy_x_1- = happyIn42- (DefValMaybe- )--happyReduce_90 = happySpecReduce_1 37# happyReduction_90-happyReduction_90 happy_x_1- = case happyOutTok happy_x_1 of { ((,) _ (Strg happy_var_1)) -> - happyIn42- (DefValString (T.pack happy_var_1)- )}--happyReduce_91 = happySpecReduce_1 37# happyReduction_91-happyReduction_91 happy_x_1- = happyIn42- (DefValBool True- )--happyReduce_92 = happySpecReduce_1 37# happyReduction_92-happyReduction_92 happy_x_1- = happyIn42- (DefValBool False- )--happyReduce_93 = happySpecReduce_1 37# happyReduction_93-happyReduction_93 happy_x_1- = case happyOutTok happy_x_1 of { ((,) _ (Intg happy_var_1)) -> - happyIn42- (DefValInt happy_var_1- )}--happyReduce_94 = happySpecReduce_1 37# happyReduction_94-happyReduction_94 happy_x_1- = case happyOutTok happy_x_1 of { ((,) _ (UTCTIME happy_var_1)) -> - happyIn42- (DefValUtc happy_var_1- )}--happyReduce_95 = happySpecReduce_2 38# happyReduction_95-happyReduction_95 happy_x_2- happy_x_1- = case happyOut43 happy_x_1 of { happy_var_1 -> - case happyOut44 happy_x_2 of { happy_var_2 -> - happyIn43- (happy_var_2 ++ happy_var_1- )}}--happyReduce_96 = happySpecReduce_1 38# happyReduction_96-happyReduction_96 happy_x_1- = case happyOut44 happy_x_1 of { happy_var_1 -> - happyIn43- (happy_var_1- )}--happyReduce_97 = happyReduce 5# 39# happyReduction_97-happyReduction_97 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut30 happy_x_3 of { happy_var_3 -> - case happyOut27 happy_x_5 of { happy_var_5 -> - happyIn44- ([UnChAdd happy_var_3 happy_var_5]- ) `HappyStk` happyRest}}--happyReduce_98 = happySpecReduce_3 39# happyReduction_98-happyReduction_98 happy_x_3- happy_x_2- happy_x_1- = case happyOut30 happy_x_3 of { happy_var_3 -> - happyIn44- ([UnChDelete happy_var_3]- )}--happyReduce_99 = happyReduce 5# 39# happyReduction_99-happyReduction_99 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut30 happy_x_3 of { happy_var_3 -> - case happyOut30 happy_x_5 of { happy_var_5 -> - happyIn44- ([UnChRename happy_var_3 happy_var_5]- ) `HappyStk` happyRest}}--happyReduce_100 = happySpecReduce_1 39# happyReduction_100-happyReduction_100 happy_x_1- = happyIn44- ([]- )--happyReduce_101 = happySpecReduce_2 40# happyReduction_101-happyReduction_101 happy_x_2- happy_x_1- = case happyOut45 happy_x_1 of { happy_var_1 -> - case happyOut46 happy_x_2 of { happy_var_2 -> - happyIn45- (happy_var_2 ++ happy_var_1- )}}--happyReduce_102 = happySpecReduce_1 40# happyReduction_102-happyReduction_102 happy_x_1- = case happyOut46 happy_x_1 of { happy_var_1 -> - happyIn45- (happy_var_1- )}--happyReduce_103 = happySpecReduce_3 41# happyReduction_103-happyReduction_103 happy_x_3- happy_x_2- happy_x_1- = case happyOut30 happy_x_3 of { happy_var_3 -> - happyIn46- ([EnChAdd happy_var_3]- )}--happyReduce_104 = happySpecReduce_3 41# happyReduction_104-happyReduction_104 happy_x_3- happy_x_2- happy_x_1- = case happyOut30 happy_x_3 of { happy_var_3 -> - happyIn46- ([EnChDelete happy_var_3]- )}--happyReduce_105 = happyReduce 5# 41# happyReduction_105-happyReduction_105 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut30 happy_x_3 of { happy_var_3 -> - case happyOut30 happy_x_5 of { happy_var_5 -> - happyIn46- ([EnChRename happy_var_3 happy_var_5]- ) `HappyStk` happyRest}}--happyReduce_106 = happySpecReduce_1 41# happyReduction_106-happyReduction_106 happy_x_1- = happyIn46- ([]- )--happyReduce_107 = happySpecReduce_1 42# happyReduction_107-happyReduction_107 happy_x_1- = case happyOutTok happy_x_1 of { ((,) _ (TypeIden happy_var_1)) -> - happyIn47- (happy_var_1- )}--happyNewToken action sts stk [] =- happyDoAction 43# notHappyAtAll action sts stk []--happyNewToken action sts stk (tk:tks) =- let cont i = happyDoAction i tk action sts stk tks in- case tk of {- (,) _ Semi -> cont 1#;- (,) _ Bar -> cont 2#;- (,) _ Bra -> cont 3#;- (,) _ Ket -> cont 4#;- (,) _ ColCol -> cont 5#;- (,) _ Equals -> cont 6#;- (,) _ Query -> cont 7#;- (,) _ Comma -> cont 8#;- (,) _ LtEq -> cont 9#;- (,) _ GtEq -> cont 10#;- (,) _ Version -> cont 11#;- (,) _ With -> cont 12#;- (,) _ Integer -> cont 13#;- (,) _ Boolean -> cont 14#;- (,) _ UTC -> cont 15#;- (,) _ String -> cont 16#;- (,) _ BInary -> cont 17#;- (,) _ Json -> cont 18#;- (,) _ Record -> cont 19#;- (,) _ Union -> cont 20#;- (,) _ Enum -> cont 21#;- (,) _ Basic -> cont 22#;- (,) _ Changes -> cont 23#;- (,) _ Added -> cont 24#;- (,) _ Removed -> cont 25#;- (,) _ Renamed -> cont 26#;- (,) _ Changed -> cont 27#;- (,) _ Default -> cont 28#;- (,) _ Field -> cont 29#;- (,) _ Alternative -> cont 30#;- (,) _ Migration -> cont 31#;- (,) _ To -> cont 32#;- (,) _ NOTHING -> cont 33#;- (,) _ Readonly -> cont 34#;- (,) _ (Comment happy_dollar_dollar) -> cont 35#;- (,) _ (TypeIden happy_dollar_dollar) -> cont 36#;- (,) _ (VarIden happy_dollar_dollar) -> cont 37#;- (,) _ (Intg happy_dollar_dollar) -> cont 38#;- (,) _ (Strg happy_dollar_dollar) -> cont 39#;- (,) _ TRUE -> cont 40#;- (,) _ FALSE -> cont 41#;- (,) _ (UTCTIME happy_dollar_dollar) -> cont 42#;- _ -> happyError' (tk:tks)- }--happyError_ 43# tk tks = happyError' tks-happyError_ _ tk tks = happyError' (tk:tks)--happyThen :: () => ParseM a -> (a -> ParseM b) -> ParseM b-happyThen = (>>=)-happyReturn :: () => a -> ParseM a-happyReturn = (return)-happyThen1 m k tks = (>>=) m (\a -> k a tks)-happyReturn1 :: () => a -> b -> ParseM a-happyReturn1 = \a tks -> (return) a-happyError' :: () => [(PToken)] -> ParseM a-happyError' = happyError--parse tks = happySomeParser where- happySomeParser = happyThen (happyParse 0# tks) (\x -> happyReturn (happyOut6 x))--parse_with_changelog tks = happySomeParser where- happySomeParser = happyThen (happyParse 1# tks) (\x -> happyReturn (happyOut5 x))--happySeq = happyDontSeq---type ParseM = Either [PToken]--happyError :: [PToken] -> ParseM a-happyError = Left--parseAPI :: String -> (Int, Int) -> String -> API-parseAPI = wrap parse--wrap :: ([PToken] -> ParseM a) -> String -> (Int, Int) -> String -> a-wrap parser fn (start_ln,_start_cn) s = case parser (scan s) of- Right v -> v- Left tks -> error $ printf "Syntax error at %s of %s:\n %s\n" (loc tks) fn $ show (take 5 tks)- where- loc tks = case tks of- [] -> "<EOF>"- (AlexPn ad ln cn,_):_ -> printf "line %d, column %d (@%d)" (start_ln+ln-1) (cn-1) ad--parseAPIWithChangelog :: String -> (Int, Int) -> String -> APIWithChangelog-parseAPIWithChangelog = wrap parse_with_changelog---data FieldChange = FldChAdd FieldName APIType (Maybe DefaultValue)- | FldChDelete FieldName- | FldChRename FieldName FieldName- | FldChChange FieldName APIType MigrationTag--fldChangeToAPIChange :: TypeName -> FieldChange -> APIChange-fldChangeToAPIChange t (FldChAdd f ty def) = ChAddField t f ty def-fldChangeToAPIChange t (FldChDelete f) = ChDeleteField t f-fldChangeToAPIChange t (FldChRename f f') = ChRenameField t f f'-fldChangeToAPIChange t (FldChChange f ty m) = ChChangeField t f ty m--data UnionChange = UnChAdd FieldName APIType- | UnChDelete FieldName- | UnChRename FieldName FieldName--unionChangeToAPIChange :: TypeName -> UnionChange -> APIChange-unionChangeToAPIChange t (UnChAdd f ty) = ChAddUnionAlt t f ty-unionChangeToAPIChange t (UnChDelete f) = ChDeleteUnionAlt t f-unionChangeToAPIChange t (UnChRename f f') = ChRenameUnionAlt t f f'--data EnumChange = EnChAdd FieldName- | EnChDelete FieldName- | EnChRename FieldName FieldName--enumChangeToAPIChange :: TypeName -> EnumChange -> APIChange-enumChangeToAPIChange t (EnChAdd f) = ChAddEnumVal t f-enumChangeToAPIChange t (EnChDelete f) = ChDeleteEnumVal t f-enumChangeToAPIChange t (EnChRename f f') = ChRenameEnumVal t f f'---parseVer :: String -> V.Version-parseVer x = case simpleParse x of- Just v -> v- Nothing -> error $ "Syntax error while parsing version " ++ x--parseVersionExtra :: String -> VersionExtra-parseVersionExtra "development" = DevVersion-parseVersionExtra s = Release $ parseVer s---api :: QuasiQuoter-api =- QuasiQuoter- { quoteExp = located [|parseAPI|]- , quotePat = error "api QuasiQuoter used in patten context"- , quoteType = error "api QuasiQuoter used in type context"- , quoteDec = error "api QuasiQuoter used in declaration context"- }--apiWithChangelog :: QuasiQuoter-apiWithChangelog =- QuasiQuoter- { quoteExp = located [|parseAPIWithChangelog|]- , quotePat = error "apiWithChangelog QuasiQuoter used in patten context"- , quoteType = error "apiWithChangelog QuasiQuoter used in type context"- , quoteDec = error "apiWithChangelog QuasiQuoter used in declaration context"- }--located :: ExpQ -> String -> ExpQ-located e s = do- l <- location- let fn = loc_filename l- ls = loc_start l- [|$(e) fn ls s|]-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "<command-line>" #-}-{-# LINE 10 "<command-line>" #-}-# 1 "/usr/include/stdc-predef.h" 1 3 4--# 17 "/usr/include/stdc-predef.h" 3 4---------------# 1 "/usr/include/x86_64-linux-gnu/bits/predefs.h" 1 3 4--# 18 "/usr/include/x86_64-linux-gnu/bits/predefs.h" 3 4-------------# 31 "/usr/include/stdc-predef.h" 2 3 4---------{-# LINE 10 "<command-line>" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}--- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp --{-# LINE 13 "templates/GenericTemplate.hs" #-}-------- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.-#if __GLASGOW_HASKELL__ > 706-#define LT(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.<# m)) :: Bool)-#define GTE(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.>=# m)) :: Bool)-#define EQ(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.==# m)) :: Bool)-#else-#define LT(n,m) (n Happy_GHC_Exts.<# m)-#define GTE(n,m) (n Happy_GHC_Exts.>=# m)-#define EQ(n,m) (n Happy_GHC_Exts.==# m)-#endif-{-# LINE 46 "templates/GenericTemplate.hs" #-}---data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList------{-# LINE 67 "templates/GenericTemplate.hs" #-}--{-# LINE 77 "templates/GenericTemplate.hs" #-}--{-# LINE 86 "templates/GenericTemplate.hs" #-}--infixr 9 `HappyStk`-data HappyStk a = HappyStk a (HappyStk a)---------------------------------------------------------------------------------- starting the parse--happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll---------------------------------------------------------------------------------- Accepting the parse---- If the current token is 0#, it means we've just accepted a partial--- parse (a %partial parser). We must ignore the saved token on the top of--- the stack in this case.-happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =- happyReturn1 ans-happyAccept j tk st sts (HappyStk ans _) = - (happyTcHack j (happyTcHack st)) (happyReturn1 ans)---------------------------------------------------------------------------------- Arrays only: do the next action----happyDoAction i tk st- = {- nothing -}--- case action of- 0# -> {- nothing -}- happyFail i tk st- -1# -> {- nothing -}- happyAccept i tk st- n | LT(n,(0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}-- (happyReduceArr Happy_Data_Array.! rule) i tk st- where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))- n -> {- nothing -}--- happyShift new_state i tk st- where new_state = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))- where off = indexShortOffAddr happyActOffsets st- off_i = (off Happy_GHC_Exts.+# i)- check = if GTE(off_i,(0# :: Happy_GHC_Exts.Int#))- then EQ(indexShortOffAddr happyCheck off_i, i)- else False- action- | check = indexShortOffAddr happyTable off_i- | otherwise = indexShortOffAddr happyDefActions st---indexShortOffAddr (HappyA# arr) off =- Happy_GHC_Exts.narrow16Int# i- where- i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)- high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))- low = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))- off' = off Happy_GHC_Exts.*# 2#------data HappyAddr = HappyA# Happy_GHC_Exts.Addr#------------------------------------------------------------------------------------- HappyState data type (not arrays)--{-# LINE 170 "templates/GenericTemplate.hs" #-}---------------------------------------------------------------------------------- Shifting a token--happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =- let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in--- trace "shifting the error token" $- happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)--happyShift new_state i tk st sts stk =- happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)---- happyReduce is specialised for the common cases.--happySpecReduce_0 i fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happySpecReduce_0 nt fn j tk st@((action)) sts stk- = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)--happySpecReduce_1 i fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')- = let r = fn v1 in- happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))--happySpecReduce_2 i fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')- = let r = fn v1 v2 in- happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))--happySpecReduce_3 i fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')- = let r = fn v1 v2 v3 in- happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))--happyReduce k i fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happyReduce k nt fn j tk st sts stk- = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of- sts1@((HappyCons (st1@(action)) (_))) ->- let r = fn stk in -- it doesn't hurt to always seq here...- happyDoSeq r (happyGoto nt j tk st1 sts1 r)--happyMonadReduce k nt fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happyMonadReduce k nt fn j tk st sts stk =- case happyDrop k (HappyCons (st) (sts)) of- sts1@((HappyCons (st1@(action)) (_))) ->- let drop_stk = happyDropStk k stk in- happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))--happyMonad2Reduce k nt fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happyMonad2Reduce k nt fn j tk st sts stk =- case happyDrop k (HappyCons (st) (sts)) of- sts1@((HappyCons (st1@(action)) (_))) ->- let drop_stk = happyDropStk k stk-- off = indexShortOffAddr happyGotoOffsets st1- off_i = (off Happy_GHC_Exts.+# nt)- new_state = indexShortOffAddr happyTable off_i---- in- happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))--happyDrop 0# l = l-happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t--happyDropStk 0# l = l-happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs---------------------------------------------------------------------------------- Moving to a new state after a reduction---happyGoto nt j tk st = - {- nothing -}- happyDoAction j tk new_state- where off = indexShortOffAddr happyGotoOffsets st- off_i = (off Happy_GHC_Exts.+# nt)- new_state = indexShortOffAddr happyTable off_i------------------------------------------------------------------------------------- Error recovery (0# is the error token)---- parse error if we are in recovery and we fail again-happyFail 0# tk old_st _ stk@(x `HappyStk` _) =- let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in--- trace "failing" $ - happyError_ i tk--{- We don't need state discarding for our restricted implementation of- "error". In fact, it can cause some bogus parses, so I've disabled it- for now --SDM---- discard a state-happyFail 0# tk old_st (HappyCons ((action)) (sts)) - (saved_tok `HappyStk` _ `HappyStk` stk) =--- trace ("discarding state, depth " ++ show (length stk)) $- happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))--}---- Enter error recovery: generate an error token,--- save the old token and carry on.-happyFail i tk (action) sts stk =--- trace "entering error recovery" $- happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)---- Internal happy errors:--notHappyAtAll :: a-notHappyAtAll = error "Internal Happy error\n"---------------------------------------------------------------------------------- Hack to get the typechecker to accept our action functions---happyTcHack :: Happy_GHC_Exts.Int# -> a -> a-happyTcHack x y = y-{-# INLINE happyTcHack #-}----------------------------------------------------------------------------------- Seq-ing. If the --strict flag is given, then Happy emits --- happySeq = happyDoSeq--- otherwise it emits--- happySeq = happyDontSeq--happyDoSeq, happyDontSeq :: a -> b -> b-happyDoSeq a b = a `seq` b-happyDontSeq a b = b---------------------------------------------------------------------------------- Don't inline any functions from the template. GHC has a nasty habit--- of deciding to inline happyGoto everywhere, which increases the size of--- the generated parser quite a bit.---{-# NOINLINE happyDoAction #-}-{-# NOINLINE happyTable #-}-{-# NOINLINE happyCheck #-}-{-# NOINLINE happyActOffsets #-}-{-# NOINLINE happyGotoOffsets #-}-{-# NOINLINE happyDefActions #-}--{-# NOINLINE happyShift #-}-{-# NOINLINE happySpecReduce_0 #-}-{-# NOINLINE happySpecReduce_1 #-}-{-# NOINLINE happySpecReduce_2 #-}-{-# NOINLINE happySpecReduce_3 #-}-{-# NOINLINE happyReduce #-}-{-# NOINLINE happyMonadReduce #-}-{-# NOINLINE happyGoto #-}-{-# NOINLINE happyFail #-}---- end of Happy Template.
− dist/build/Data/API/Scan.hs
@@ -1,636 +0,0 @@-{-# LANGUAGE CPP,MagicHash #-}-{-# LINE 1 "src/Data/API/Scan.x" #-}--{-# OPTIONS_GHC -w #-}--module Data.API.Scan- ( scan- , PToken- , AlexPosn(..)- , Token(..)- ) where--import Data.API.Types-import Data.API.Utils--import Data.Char-import Data.Time-import Safe--#if __GLASGOW_HASKELL__ >= 603-#include "ghcconfig.h"-#elif defined(__GLASGOW_HASKELL__)-#include "config.h"-#endif-#if __GLASGOW_HASKELL__ >= 503-import Data.Array-import Data.Char (ord)-import Data.Array.Base (unsafeAt)-#else-import Array-import Char (ord)-#endif-#if __GLASGOW_HASKELL__ >= 503-import GHC.Exts-#else-import GlaExts-#endif-{-# LINE 1 "templates/wrappers.hs" #-}-{-# LINE 1 "templates/wrappers.hs" #-}-{-# LINE 1 "<command-line>" #-}-------# 1 "/usr/include/stdc-predef.h" 1 3 4--# 17 "/usr/include/stdc-predef.h" 3 4---------------# 1 "/usr/include/x86_64-linux-gnu/bits/predefs.h" 1 3 4--# 18 "/usr/include/x86_64-linux-gnu/bits/predefs.h" 3 4-------------# 31 "/usr/include/stdc-predef.h" 2 3 4---------{-# LINE 6 "<command-line>" #-}-{-# LINE 1 "templates/wrappers.hs" #-}--- -------------------------------------------------------------------------------- Alex wrapper code.------ This code is in the PUBLIC DOMAIN; you may copy it freely and use--- it for any purpose whatsoever.--import Data.Word (Word8)-{-# LINE 22 "templates/wrappers.hs" #-}--import qualified Data.Bits---- | Encode a Haskell String to a list of Word8 values, in UTF8 format.-utf8Encode :: Char -> [Word8]-utf8Encode = map fromIntegral . go . ord- where- go oc- | oc <= 0x7f = [oc]-- | oc <= 0x7ff = [ 0xc0 + (oc `Data.Bits.shiftR` 6)- , 0x80 + oc Data.Bits..&. 0x3f- ]-- | oc <= 0xffff = [ 0xe0 + (oc `Data.Bits.shiftR` 12)- , 0x80 + ((oc `Data.Bits.shiftR` 6) Data.Bits..&. 0x3f)- , 0x80 + oc Data.Bits..&. 0x3f- ]- | otherwise = [ 0xf0 + (oc `Data.Bits.shiftR` 18)- , 0x80 + ((oc `Data.Bits.shiftR` 12) Data.Bits..&. 0x3f)- , 0x80 + ((oc `Data.Bits.shiftR` 6) Data.Bits..&. 0x3f)- , 0x80 + oc Data.Bits..&. 0x3f- ]----type Byte = Word8---- -------------------------------------------------------------------------------- The input type---type AlexInput = (AlexPosn, -- current position,- Char, -- previous char- [Byte], -- pending bytes on current char- String) -- current input string--ignorePendingBytes :: AlexInput -> AlexInput-ignorePendingBytes (p,c,ps,s) = (p,c,[],s)--alexInputPrevChar :: AlexInput -> Char-alexInputPrevChar (p,c,bs,s) = c--alexGetByte :: AlexInput -> Maybe (Byte,AlexInput)-alexGetByte (p,c,(b:bs),s) = Just (b,(p,c,bs,s))-alexGetByte (p,c,[],[]) = Nothing-alexGetByte (p,_,[],(c:s)) = let p' = alexMove p c - (b:bs) = utf8Encode c- in p' `seq` Just (b, (p', c, bs, s))---{-# LINE 92 "templates/wrappers.hs" #-}--{-# LINE 106 "templates/wrappers.hs" #-}--{-# LINE 121 "templates/wrappers.hs" #-}---- -------------------------------------------------------------------------------- Token positions---- `Posn' records the location of a token in the input text. It has three--- fields: the address (number of chacaters preceding the token), line number--- and column of a token within the file. `start_pos' gives the position of the--- start of the file and `eof_pos' a standard encoding for the end of file.--- `move_pos' calculates the new position after traversing a given character,--- assuming the usual eight character tab stops.---data AlexPosn = AlexPn !Int !Int !Int- deriving (Eq,Show)--alexStartPos :: AlexPosn-alexStartPos = AlexPn 0 1 1--alexMove :: AlexPosn -> Char -> AlexPosn-alexMove (AlexPn a l c) '\t' = AlexPn (a+1) l (((c+7) `div` 8)*8+1)-alexMove (AlexPn a l c) '\n' = AlexPn (a+1) (l+1) 1-alexMove (AlexPn a l c) _ = AlexPn (a+1) l (c+1)----- -------------------------------------------------------------------------------- Default monad--{-# LINE 242 "templates/wrappers.hs" #-}----- -------------------------------------------------------------------------------- Monad (with ByteString input)--{-# LINE 333 "templates/wrappers.hs" #-}----- -------------------------------------------------------------------------------- Basic wrapper--{-# LINE 360 "templates/wrappers.hs" #-}----- -------------------------------------------------------------------------------- Basic wrapper, ByteString version--{-# LINE 378 "templates/wrappers.hs" #-}--{-# LINE 392 "templates/wrappers.hs" #-}----- -------------------------------------------------------------------------------- Posn wrapper---- Adds text positions to the basic model.-----alexScanTokens :: String -> [token]-alexScanTokens str = go (alexStartPos,'\n',[],str)- where go inp@(pos,_,_,str) =- case alexScan inp 0 of- AlexEOF -> []- AlexError ((AlexPn _ line column),_,_,_) -> error $ "lexical error at line " ++ (show line) ++ ", column " ++ (show column)- AlexSkip inp' len -> go inp'- AlexToken inp' len act -> act pos (take len str) : go inp'------ -------------------------------------------------------------------------------- Posn wrapper, ByteString version--{-# LINE 424 "templates/wrappers.hs" #-}----- -------------------------------------------------------------------------------- GScan wrapper---- For compatibility with previous versions of Alex, and because we can.--alex_base :: AlexAddr-alex_base = AlexA# "\xf8\xff\xff\xff\xd9\xff\xff\xff\xfd\xff\xff\xff\xcb\xff\xff\xff\xd6\xff\xff\xff\x9b\xff\xff\xff\xd6\x00\x00\x00\x2a\x01\x00\x00\xe6\xff\xff\xff\x29\x01\x00\x00\xa9\x01\x00\x00\x7c\x02\x00\x00\x69\x02\x00\x00\xfc\x02\x00\x00\x7c\x03\x00\x00\xe9\xff\xff\xff\xfc\x03\x00\x00\x7c\x04\x00\x00\xfc\x04\x00\x00\xa8\xff\xff\xff\x7c\x05\x00\x00\xfc\x05\x00\x00\x7c\x06\x00\x00\xfc\x06\x00\x00\xec\xff\xff\xff\xb4\x02\x00\x00\xbe\x02\x00\x00\xcc\x07\x00\x00\xd6\x07\x00\x00\xc7\xff\xff\xff\xe0\x07\x00\x00\x00\x00\x00\x00\x8b\x07\x00\x00\x5b\x08\x00\x00\x00\x00\x00\x00\x06\x08\x00\x00\x00\x00\x00\x00\x47\x08\x00\x00\x00\x00\x00\x00\xb8\x08\x00\x00\xe2\xff\xff\xff\x00\x00\x00\x00\xf9\x08\x00\x00\xf9\x09\x00\x00\xf3\xff\xff\xff\xb9\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x0a\x00\x00\x00\x00\x00\x00\x6b\x0a\x00\x00\x3b\x0b\x00\x00\x45\x0b\x00\x00\xb0\xff\xff\xff\x7f\x0b\x00\x00\x3f\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x0b\x00\x00\x86\x0c\x00\x00\x00\x00\x00\x00\xf2\x0b\x00\x00\x86\x0d\x00\x00\xe4\x0d\x00\x00\x81\x0d\x00\x00\x00\x00\x00\x00\xc2\x0c\x00\x00\xcc\x0c\x00\x00\xb5\xff\xff\xff\x00\x00\x00\x00\xc2\x0d\x00\x00\xc2\x0e\x00\x00\x82\x0e\x00\x00\x00\x00\x00\x00\x78\x0f\x00\x00\xc8\xff\xff\xff\xfe\xff\xff\xff\x78\x10\x00\x00\x38\x10\x00\x00\x00\x00\x00\x00\xf5\x00\x00\x00\x2e\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\x0f\x00\x00\x09\x11\x00\x00\xfe\x11\x00\x00\x49\x12\x00\x00\x94\x12\x00\x00\xdf\x12\x00\x00\x2a\x13\x00\x00\x75\x13\x00\x00\xc0\x13\x00\x00\x0b\x14\x00\x00\x56\x14\x00\x00\xa1\x14\x00\x00\xec\x14\x00\x00\x37\x15\x00\x00\x82\x15\x00\x00\xcd\x15\x00\x00\x18\x16\x00\x00\x63\x16\x00\x00\xae\x16\x00\x00\xf9\x16\x00\x00\x44\x17\x00\x00\x8f\x17\x00\x00\xda\x17\x00\x00\x25\x18\x00\x00\x70\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x18\x00\x00\x00\x00\x00\x00\x06\x19\x00\x00\x51\x19\x00\x00\x9c\x19\x00\x00\xe7\x19\x00\x00\x32\x1a\x00\x00\x7d\x1a\x00\x00\xc8\x1a\x00\x00\x13\x1b\x00\x00\x5e\x1b\x00\x00\xa9\x1b\x00\x00\xf4\x1b\x00\x00\x3f\x1c\x00\x00\x8a\x1c\x00\x00\xd5\x1c\x00\x00\x20\x1d\x00\x00\x6b\x1d\x00\x00\xb6\x1d\x00\x00\x01\x1e\x00\x00\x4c\x1e\x00\x00\x97\x1e\x00\x00\xe2\x1e\x00\x00\x2d\x1f\x00\x00\x78\x1f\x00\x00\xc3\x1f\x00\x00\x0e\x20\x00\x00\x59\x20\x00\x00\xa4\x20\x00\x00\xef\x20\x00\x00\x3a\x21\x00\x00\x85\x21\x00\x00\xd0\x21\x00\x00\x1b\x22\x00\x00\x66\x22\x00\x00\xb1\x22\x00\x00\xfc\x22\x00\x00\x47\x23\x00\x00\x92\x23\x00\x00\xdd\x23\x00\x00\x28\x24\x00\x00\x73\x24\x00\x00\xbe\x24\x00\x00\x09\x25\x00\x00\x54\x25\x00\x00\x9f\x25\x00\x00\xea\x25\x00\x00\x35\x26\x00\x00\x80\x26\x00\x00\xcb\x26\x00\x00\x16\x27\x00\x00\x61\x27\x00\x00\xac\x27\x00\x00\xf7\x27\x00\x00\x42\x28\x00\x00\x8d\x28\x00\x00\xd8\x28\x00\x00\x23\x29\x00\x00\x6e\x29\x00\x00\xb9\x29\x00\x00\x04\x2a\x00\x00\x4f\x2a\x00\x00\x9a\x2a\x00\x00\xe8\x2a\x00\x00\x33\x2b\x00\x00\x7e\x2b\x00\x00\xc9\x2b\x00\x00\x14\x2c\x00\x00\x5f\x2c\x00\x00\xaa\x2c\x00\x00\xf5\x2c\x00\x00\x40\x2d\x00\x00\x8b\x2d\x00\x00\xd6\x2d\x00\x00\x21\x2e\x00\x00\x6c\x2e\x00\x00\xb7\x2e\x00\x00\x02\x2f\x00\x00\x4d\x2f\x00\x00\x98\x2f\x00\x00\xe3\x2f\x00\x00\x2e\x30\x00\x00\x79\x30\x00\x00\xc4\x30\x00\x00\x0f\x31\x00\x00\x5a\x31\x00\x00\xa5\x31\x00\x00\xf0\x31\x00\x00\x3b\x32\x00\x00\x86\x32\x00\x00\xd1\x32\x00\x00\x1c\x33\x00\x00\x67\x33\x00\x00\xb2\x33\x00\x00\xfd\x33\x00\x00\x48\x34\x00\x00\x93\x34\x00\x00\xde\x34\x00\x00\x29\x35\x00\x00\x74\x35\x00\x00\xbf\x35\x00\x00\x0a\x36\x00\x00\x55\x36\x00\x00\xa0\x36\x00\x00\xeb\x36\x00\x00\x36\x37\x00\x00\x81\x37\x00\x00\xcc\x37\x00\x00\x17\x38\x00\x00\x62\x38\x00\x00\xad\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdc\x0d\x00\x00\xe6\x0d\x00\x00\xf0\x0d\x00\x00\xfa\x0d\x00\x00\x04\x0e\x00\x00\xb3\x38\x00\x00\x00\x00\x00\x00"#--alex_table :: AlexAddr-alex_table = AlexA# "\x00\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x51\x00\xff\xff\x5a\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\x5b\x00\x77\x00\xef\x00\x0b\x00\x35\x00\x50\x00\x1b\x00\x4a\x00\x1e\x00\x34\x00\x3b\x00\x44\x00\x0c\x00\x2c\x00\x05\x00\x78\x00\x00\x00\x5d\x00\x01\x00\x00\x00\x08\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\x58\x00\x53\x00\x03\x00\x59\x00\x04\x00\x5c\x00\x33\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x55\x00\x57\x00\x56\x00\x00\x00\xb9\x00\x78\x00\xc9\x00\xa8\x00\xbf\x00\xb3\x00\xd1\x00\xac\x00\xb9\x00\xb9\x00\xc0\x00\x9a\x00\xb9\x00\xb9\x00\xb7\x00\xb4\x00\xb9\x00\xb9\x00\xb9\x00\xae\x00\xc3\x00\x82\x00\xd9\x00\xb2\x00\x95\x00\xb9\x00\xb9\x00\xb9\x00\x0f\x00\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x22\x00\x22\x00\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7a\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x00\x00\x00\x00\x00\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x50\x00\x00\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x00\x00\x00\x00\xff\xff\x00\x00\x06\x00\x00\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\xe8\x00\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2b\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2d\x00\x15\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x25\x00\x17\x00\x1f\x00\x1f\x00\x1f\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x02\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x37\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x16\x00\x22\x00\x22\x00\x22\x00\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x47\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x0a\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x3e\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x0d\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x36\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x38\x00\x10\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x2b\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x12\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x15\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x21\x00\x25\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x2a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x40\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2b\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2d\x00\x15\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x25\x00\x17\x00\x1f\x00\x1f\x00\x1f\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\x00\x00\x00\x00\x19\x00\x00\x00\x4a\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xed\x00\xed\x00\xed\x00\xed\x00\xed\x00\xed\x00\xed\x00\xed\x00\xed\x00\xed\x00\xee\x00\xee\x00\xee\x00\xee\x00\xee\x00\xee\x00\xee\x00\xee\x00\xee\x00\xee\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x4a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x3f\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3e\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x41\x00\x40\x00\x10\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x31\x00\x32\x00\x14\x00\x26\x00\x26\x00\x26\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4e\x00\x0a\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x46\x00\x0e\x00\x39\x00\x39\x00\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x79\x00\x00\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\x79\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\x62\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x63\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x64\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x68\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\x69\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\x6e\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x6a\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x71\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x73\x00\xb9\x00\xb9\x00\x92\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x74\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x75\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x76\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xe7\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xe5\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xe4\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xe3\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xe1\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x7e\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x7f\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x80\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xe0\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xdf\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xde\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xdb\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x84\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x85\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x86\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xda\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x87\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x88\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xd8\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xd7\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x89\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xd6\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x8a\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x8c\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x8d\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x90\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xd5\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xd4\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xd3\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x91\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xd2\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x94\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x96\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xba\x00\xb9\x00\x9b\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xa9\x00\xaa\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\x9d\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xcb\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xad\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xcf\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\x9f\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xa0\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xce\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xa1\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xcd\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xa7\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xca\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xc8\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xc7\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xc5\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xc2\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xc1\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xbd\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xbc\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb5\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x13\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb8\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb6\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xbe\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb1\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb0\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xaf\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xc4\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xc6\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xab\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xcc\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xa6\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xa5\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xa4\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xa3\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xa2\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xd0\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xbb\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x9e\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x99\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x98\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x97\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x93\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x8f\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\x8e\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x8b\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x83\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x81\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xdc\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xdd\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xe2\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x7d\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x7c\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x9c\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x7b\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xe6\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x72\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\x70\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x6f\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\x6d\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\x6c\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\x6b\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x67\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\x66\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x65\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x61\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x60\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xff\xff\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x5f\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x5e\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x47\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x48\x00\x0d\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3d\x00\x11\x00\x2f\x00\x2f\x00\x2f\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#--alex_check :: AlexAddr-alex_check = AlexA# "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x0a\x00\x3d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3d\x00\x79\x00\x2f\x00\x2d\x00\x6f\x00\x20\x00\x2d\x00\x22\x00\x54\x00\x3a\x00\x2a\x00\x6e\x00\x27\x00\x28\x00\x6c\x00\x5a\x00\xff\xff\x2c\x00\x2d\x00\xff\xff\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x3a\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x3a\x00\x5d\x00\xff\xff\x5f\x00\x5a\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7d\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x27\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\x0a\x00\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x27\x00\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x2d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x2a\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x22\x00\xff\xff\xff\xff\x2d\x00\xff\xff\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x5c\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x0a\x00\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00"#--alex_deflt :: AlexAddr-alex_deflt = AlexA# "\xff\xff\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\xff\xff\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x24\x00\x24\x00\xff\xff\x29\x00\x29\x00\x2e\x00\x2e\x00\x31\x00\x31\x00\xff\xff\x38\x00\x38\x00\x3b\x00\xff\xff\x3b\x00\x3b\x00\x3c\x00\x3c\x00\x41\x00\x41\x00\xff\xff\xff\xff\xff\xff\x0b\x00\x0b\x00\x0b\x00\x45\x00\x45\x00\x3b\x00\x49\x00\x49\x00\x4a\x00\xff\xff\x4a\x00\x4a\x00\xff\xff\xff\xff\xff\xff\x4f\x00\x4f\x00\xef\x00\xef\x00\xef\x00\x4a\x00\xff\xff\xff\xff\x51\x00\x51\x00\x51\x00\xff\xff\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xef\x00\xff\xff"#--alex_accept = listArray (0::Int,240) [AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccSkip,AlexAccSkip,AlexAccSkip,AlexAcc (alex_action_3),AlexAcc (alex_action_4),AlexAcc (alex_action_5),AlexAcc (alex_action_6),AlexAcc (alex_action_7),AlexAcc (alex_action_8),AlexAcc (alex_action_9),AlexAcc (alex_action_10),AlexAcc (alex_action_11),AlexAcc (alex_action_12),AlexAcc (alex_action_13),AlexAcc (alex_action_14),AlexAcc (alex_action_15),AlexAcc (alex_action_16),AlexAcc (alex_action_17),AlexAcc (alex_action_18),AlexAcc (alex_action_19),AlexAcc (alex_action_20),AlexAcc (alex_action_21),AlexAcc (alex_action_22),AlexAcc (alex_action_23),AlexAcc (alex_action_24),AlexAcc (alex_action_25),AlexAcc (alex_action_26),AlexAcc (alex_action_27),AlexAcc (alex_action_28),AlexAcc (alex_action_29),AlexAcc (alex_action_30),AlexAcc (alex_action_31),AlexAcc (alex_action_32),AlexAcc (alex_action_33),AlexAcc (alex_action_34),AlexAcc (alex_action_35),AlexAcc (alex_action_36),AlexAcc (alex_action_37),AlexAcc (alex_action_38),AlexAcc (alex_action_39),AlexAcc (alex_action_40),AlexAcc (alex_action_41),AlexAcc (alex_action_42),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_43),AlexAcc (alex_action_44),AlexAcc (alex_action_45),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_46),AlexAcc (alex_action_47),AlexAcc (alex_action_48)]-{-# LINE 80 "src/Data/API/Scan.x" #-}---type PToken = (AlexPosn,Token)--data Token- = Semi- | Bar- | BInary- | Bra- | Ket- | ColCol- | Colon- | Comma- | Equals- | LtEq- | GtEq- | Boolean- | Integer- | UTC- | Query- | Record- | String- | Json- | Union- | Version- | With- | Enum- | Basic- | Changes- | Added- | Removed- | Renamed- | Changed- | Default- | Field- | Alternative- | Migration- | To- | NOTHING- | TRUE- | FALSE- | Readonly- | UTCTIME UTCTime- | Comment String- | TypeIden String- | VarIden String- | Intg Int- | Strg String- | ERROR- deriving (Eq,Show)--utc_ :: AlexPosn -> String -> PToken-utc_ = mk $ \s -> maybe ERROR UTCTIME $ parseUTC_ s--line_comment :: AlexPosn -> String -> PToken-line_comment = mk $ Comment . munch_ws . tailSafe . tailSafe --block_comment :: AlexPosn -> String -> PToken-block_comment p (_:_:str) = - case reverse $ munch_ws str of- _:_:rc -> (p,Comment $ reverse $ munch_ws rc)- _ -> error "Scan.line_comment"-block_comment _ _ = error "Scan.line_comment" --strip_qs :: (String->Token) -> AlexPosn -> String -> PToken-strip_qs f p (_:s) = (p,f $ initNote "Scan.strip_qs" s)-strip_qs _ _ _ = error "Scan.strip_qs"--munch_ws :: String -> String-munch_ws = dropWhile isSpace--simple :: Token -> AlexPosn -> String -> PToken-simple tk = mk $ const tk--intg :: AlexPosn -> String -> PToken-intg p s = (p,Intg $ readNote "Data.API.Scan.intg" s)--string :: AlexPosn -> String -> PToken-string = mk (Strg . f . chop)- where- f "" = ""- f (c:s) = case c of- '\\' -> g s- _ -> c : f s-- g "" = ""- g (c:s) = c : f s--chop :: String -> String-chop "" = ""-chop (c:s) =- case reverse s of- "" -> ""- _:rs -> reverse rs--mk :: (String->Token) -> AlexPosn -> String -> PToken-mk f p s = (p,f s)--scan :: String -> [PToken]-scan = pp . alexScanTokens--pp :: [PToken] -> [PToken]-pp [] = []-pp (pt@(p@(AlexPn _ _ cn),_):inp) =- case cn of- 1 -> (p,Semi):pt:pp inp- _ -> pt:pp inp--test :: IO ()-test = - do s <- getContents- print (scan s)--alex_action_3 = simple Semi -alex_action_4 = simple Bar -alex_action_5 = simple Bra -alex_action_6 = simple Ket -alex_action_7 = simple ColCol -alex_action_8 = simple Colon -alex_action_9 = simple Equals -alex_action_10 = simple LtEq -alex_action_11 = simple GtEq -alex_action_12 = simple Query -alex_action_13 = simple Comma -alex_action_14 = simple Version -alex_action_15 = simple With -alex_action_16 = simple Integer -alex_action_17 = simple Boolean -alex_action_18 = simple UTC -alex_action_19 = simple String -alex_action_20 = simple BInary -alex_action_21 = simple Json -alex_action_22 = simple Record -alex_action_23 = simple Union -alex_action_24 = simple Enum -alex_action_25 = simple Basic -alex_action_26 = simple Changes -alex_action_27 = simple Added -alex_action_28 = simple Removed -alex_action_29 = simple Renamed -alex_action_30 = simple Changed -alex_action_31 = simple Default -alex_action_32 = simple Field -alex_action_33 = simple Alternative -alex_action_34 = simple Migration -alex_action_35 = simple To -alex_action_36 = simple NOTHING -alex_action_37 = simple TRUE -alex_action_38 = simple FALSE -alex_action_39 = simple Readonly -alex_action_40 = utc_ -alex_action_41 = mk TypeIden -alex_action_42 = strip_qs TypeIden -alex_action_43 = mk VarIden -alex_action_44 = strip_qs VarIden -alex_action_45 = string -alex_action_46 = intg -alex_action_47 = line_comment -alex_action_48 = block_comment -{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "<command-line>" #-}--------# 1 "/usr/include/stdc-predef.h" 1 3 4--# 17 "/usr/include/stdc-predef.h" 3 4---------------# 1 "/usr/include/x86_64-linux-gnu/bits/predefs.h" 1 3 4--# 18 "/usr/include/x86_64-linux-gnu/bits/predefs.h" 3 4-------------# 31 "/usr/include/stdc-predef.h" 2 3 4---------{-# LINE 7 "<command-line>" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}--- -------------------------------------------------------------------------------- ALEX TEMPLATE------ This code is in the PUBLIC DOMAIN; you may copy it freely and use--- it for any purpose whatsoever.---- -------------------------------------------------------------------------------- INTERNALS and main scanner engine--{-# LINE 21 "templates/GenericTemplate.hs" #-}-------- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.-#if __GLASGOW_HASKELL__ > 706-#define GTE(n,m) (tagToEnum# (n >=# m))-#define EQ(n,m) (tagToEnum# (n ==# m))-#else-#define GTE(n,m) (n >=# m)-#define EQ(n,m) (n ==# m)-#endif-{-# LINE 51 "templates/GenericTemplate.hs" #-}---data AlexAddr = AlexA# Addr#--- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.-#if __GLASGOW_HASKELL__ < 503-uncheckedShiftL# = shiftL#-#endif--{-# INLINE alexIndexInt16OffAddr #-}-alexIndexInt16OffAddr (AlexA# arr) off =-#ifdef WORDS_BIGENDIAN- narrow16Int# i- where- i = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)- high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))- low = int2Word# (ord# (indexCharOffAddr# arr off'))- off' = off *# 2#-#else- indexInt16OffAddr# arr off-#endif------{-# INLINE alexIndexInt32OffAddr #-}-alexIndexInt32OffAddr (AlexA# arr) off = -#ifdef WORDS_BIGENDIAN- narrow32Int# i- where- i = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`- (b2 `uncheckedShiftL#` 16#) `or#`- (b1 `uncheckedShiftL#` 8#) `or#` b0)- b3 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#)))- b2 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#)))- b1 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))- b0 = int2Word# (ord# (indexCharOffAddr# arr off'))- off' = off *# 4#-#else- indexInt32OffAddr# arr off-#endif-------#if __GLASGOW_HASKELL__ < 503-quickIndex arr i = arr ! i-#else--- GHC >= 503, unsafeAt is available from Data.Array.Base.-quickIndex = unsafeAt-#endif------- -------------------------------------------------------------------------------- Main lexing routines--data AlexReturn a- = AlexEOF- | AlexError !AlexInput- | AlexSkip !AlexInput !Int- | AlexToken !AlexInput !Int a---- alexScan :: AlexInput -> StartCode -> AlexReturn a-alexScan input (I# (sc))- = alexScanUser undefined input (I# (sc))--alexScanUser user input (I# (sc))- = case alex_scan_tkn user input 0# input sc AlexNone of- (AlexNone, input') ->- case alexGetByte input of- Nothing -> ---- AlexEOF- Just _ ->---- AlexError input'-- (AlexLastSkip input'' len, _) ->---- AlexSkip input'' len-- (AlexLastAcc k input''' len, _) ->---- AlexToken input''' len k----- Push the input through the DFA, remembering the most recent accepting--- state it encountered.--alex_scan_tkn user orig_input len input s last_acc =- input `seq` -- strict in the input- let - new_acc = (check_accs (alex_accept `quickIndex` (I# (s))))- in- new_acc `seq`- case alexGetByte input of- Nothing -> (new_acc, input)- Just (c, new_input) -> ---- case fromIntegral c of { (I# (ord_c)) ->- let- base = alexIndexInt32OffAddr alex_base s- offset = (base +# ord_c)- check = alexIndexInt16OffAddr alex_check offset- - new_s = if GTE(offset,0#) && EQ(check,ord_c)- then alexIndexInt16OffAddr alex_table offset- else alexIndexInt16OffAddr alex_deflt s- in- case new_s of- -1# -> (new_acc, input)- -- on an error, we want to keep the input *before* the- -- character that failed, not after.- _ -> alex_scan_tkn user orig_input (if c < 0x80 || c >= 0xC0 then (len +# 1#) else len)- -- note that the length is increased ONLY if this is the 1st byte in a char encoding)- new_input new_s new_acc- }- where- check_accs (AlexAccNone) = last_acc- check_accs (AlexAcc a ) = AlexLastAcc a input (I# (len))- check_accs (AlexAccSkip) = AlexLastSkip input (I# (len))-{-# LINE 198 "templates/GenericTemplate.hs" #-}--data AlexLastAcc a- = AlexNone- | AlexLastAcc a !AlexInput !Int- | AlexLastSkip !AlexInput !Int--instance Functor AlexLastAcc where- fmap f AlexNone = AlexNone- fmap f (AlexLastAcc x y z) = AlexLastAcc (f x) y z- fmap f (AlexLastSkip x y) = AlexLastSkip x y--data AlexAcc a user- = AlexAccNone- | AlexAcc a- | AlexAccSkip-{-# LINE 242 "templates/GenericTemplate.hs" #-}---- used by wrappers-iUnbox (I# (i)) = i
main/Data/API/MigrationTool.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE OverloadedStrings #-} module Data.API.MigrationTool ( main ) where@@ -73,7 +74,7 @@ data ChangeTag = None deriving (Read, Show) -customMigrations :: CustomMigrations ChangeTag ChangeTag ChangeTag+customMigrations :: CustomMigrations JS.Object JS.Value ChangeTag ChangeTag ChangeTag customMigrations = CustomMigrations (nope JS.Object) (const noSchemaChanges) (nope id) (const noSchemaChanges) (nope id)
+ main/Data/API/PerfTest.hs view
@@ -0,0 +1,55 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE OverloadedStrings #-}++module Data.API.PerfTest+ ( main+ ) where++import Data.API.API.DSL+import qualified Data.API.API.Gen as Gen+import Data.API.NormalForm+import Data.API.Types+import qualified Data.API.Value as Value++import Control.DeepSeq+import Control.Exception+import qualified Data.Aeson as JS+import qualified Codec.Serialise as CBOR+import Data.Binary.Serialise.CBOR.Extra+import System.Environment+import Test.QuickCheck++tyDesc :: APIType++{-+type T = [UTCTime]+tyDesc = TyList (TyBasic BTutc)+-}++type T = Gen.APISpec+tyDesc = TyName "APISpec"++newtype V = V { _V :: Value.Value }++instance CBOR.Serialise V where+ encode (V v) = Value.encode v+ decode = V <$!> Value.decode (apiNormalForm apiAPI) tyDesc++main :: IO ()+main = do+ args <- getArgs+ case args of+ ["read" , fp] -> do x <- CBOR.readFileDeserialise fp+ _ <- evaluate (force (x :: T))+ return ()+ ["read-aeson" , fp] -> do x <- CBOR.readFileDeserialise fp+ _ <- evaluate (force (x :: JS.Value))+ return ()+ ["read-generic", fp] -> do x <- CBOR.readFileDeserialise fp+ _ <- evaluate (force (_V x))+ return ()+ ["write" ,fp] -> do x <- generate (resize 500 arbitrary)+ CBOR.writeFileSerialise fp (x :: T)+ ["write" ,fp,i] -> do x <- generate (resize (read i) arbitrary)+ CBOR.writeFileSerialise fp (x :: T)+ _ -> error "perf-test (read|read-generic|write) <file>"
src/Data/API/API.hs view
@@ -6,6 +6,8 @@ module Data.API.API ( apiAPI , extractAPI+ , convertAPI+ , unconvertAPI ) where import Data.API.API.DSL@@ -18,17 +20,20 @@ import qualified Data.Text as T import Control.Applicative import Text.Regex+import Prelude -- | Take an API spec and generate a JSON description of the API- extractAPI :: API -> Value-extractAPI api = toJSON $ map convert [ an | ThNode an <- api ]+extractAPI = toJSON . convertAPI +convertAPI :: API -> D.APISpec+convertAPI api = [ convert an | ThNode an <- api ]+ convert :: APINode -> D.APINode convert (APINode{..}) = D.APINode- { D._an_name = T.pack $ _TypeName anName+ { D._an_name = _TypeName anName , D._an_comment = T.pack anComment , D._an_prefix = T.pack $ CI.original anPrefix , D._an_spec = convert_spec anSpec@@ -45,10 +50,10 @@ SpSynonym ty -> D.SP_synonym $ convert_type ty convert_conversion :: (FieldName,FieldName) -> D.Conversion-convert_conversion (i,p) =+convert_conversion (inj,prj) = D.Conversion- { D._cv_injection = T.pack $ _FieldName p- , D._cv_projection = T.pack $ _FieldName i+ { D._cv_injection = _FieldName inj+ , D._cv_projection = _FieldName prj } convert_specnt :: SpecNewtype -> D.SpecNewtype@@ -70,7 +75,7 @@ where f (fn,fty) = D.Field- { D._fd_name = T.pack $ _FieldName fn+ { D._fd_name = _FieldName fn , D._fd_type = convert_type $ ftType fty , D._fd_readonly = ftReadOnly fty , D._fd_default = convert_default <$> ftDefault fty@@ -82,7 +87,7 @@ where f (fn,(ty,co)) = D.Field- { D._fd_name = T.pack $ _FieldName fn+ { D._fd_name = _FieldName fn , D._fd_type = convert_type ty , D._fd_readonly = False , D._fd_default = Nothing@@ -90,7 +95,7 @@ } convert_alts :: [(FieldName,MDComment)] -> [T.Text]-convert_alts fns = map (T.pack . _FieldName . fst) fns+convert_alts fns = map (_FieldName . fst) fns convert_type :: APIType -> D.APIType convert_type ty0 =@@ -102,7 +107,7 @@ TyJSON -> D.TY_json 0 convert_ref :: TypeName -> D.TypeRef-convert_ref (TypeName tn) = D.TypeRef (T.pack tn)+convert_ref (TypeName tn) = D.TypeRef tn convert_basic :: BasicType -> D.BasicType convert_basic bt =@@ -128,10 +133,13 @@ instance FromJSONWithErrs Thing where parseJSONWithErrs v = (ThNode . unconvert) <$> parseJSONWithErrs v +unconvertAPI :: D.APISpec -> API+unconvertAPI = map (ThNode . unconvert)+ unconvert :: D.APINode -> APINode unconvert (D.APINode{..}) = APINode- { anName = TypeName $ T.unpack _an_name+ { anName = TypeName _an_name , anComment = T.unpack _an_comment , anPrefix = CI.mk $ T.unpack _an_prefix , anSpec = unconvert_spec _an_spec@@ -149,8 +157,8 @@ unconvert_conversion :: D.Conversion -> (FieldName, FieldName) unconvert_conversion c =- ( FieldName $ T.unpack $ D._cv_injection c- , FieldName $ T.unpack $ D._cv_projection c+ ( FieldName $ D._cv_injection c+ , FieldName $ D._cv_projection c ) unconvert_specnt :: D.SpecNewtype -> SpecNewtype@@ -170,7 +178,7 @@ unconvert_fields :: [D.Field] -> [(FieldName, FieldType)] unconvert_fields al = map f al where- f fld = ( FieldName $ T.unpack $ D._fd_name fld+ f fld = ( FieldName $ D._fd_name fld , FieldType { ftType = unconvert_type $ D._fd_type fld , ftReadOnly = D._fd_readonly fld , ftDefault = unconvert_default <$> D._fd_default fld@@ -181,13 +189,13 @@ unconvert_union :: [D.Field] -> [(FieldName, (APIType, MDComment))] unconvert_union al = map f al where- f fld = ( FieldName $ T.unpack $ D._fd_name fld+ f fld = ( FieldName $ D._fd_name fld , ( unconvert_type $ D._fd_type fld , T.unpack $ D._fd_comment fld )) unconvert_alts :: [T.Text] -> [(FieldName,MDComment)]-unconvert_alts fns = map ((\x -> (x, "")) . FieldName . T.unpack) fns+unconvert_alts fns = map ((\x -> (x, "")) . FieldName) fns unconvert_type :: D.APIType -> APIType unconvert_type ty0 =@@ -199,7 +207,7 @@ D.TY_json _ -> TyJSON unconvert_ref :: D.TypeRef -> TypeName-unconvert_ref (D.TypeRef tn) = TypeName $ T.unpack tn+unconvert_ref (D.TypeRef tn) = TypeName tn unconvert_basic :: D.BasicType -> BasicType unconvert_basic bt =
src/Data/API/API/Gen.hs view
@@ -18,10 +18,15 @@ $(generateAPITools apiAPI [ enumTool , jsonTool'+ , cborTool+ , deepSeqTool , quickCheckTool , lensTool , safeCopyTool , exampleTool , samplesTool (mkName "apiAPISamples")- , jsonTestsTool (mkName "apiAPISimpleTests")+ , jsonTestsTool (mkName "apiAPITestsJSON")+ , cborTestsTool (mkName "apiAPITestsCBOR")+ , cborToJSONTestsTool 'apiAPI (mkName "apiAPITestsCBORToJSON")+ , jsonToCBORTestsTool 'apiAPI (mkName "apiAPITestsJSONToCBOR") ])
src/Data/API/Changes.hs view
@@ -1,10 +1,10 @@-{-# OPTIONS_GHC -fno-warn-deprecations #-} {-# LANGUAGE TemplateHaskell #-} -- | This module deals with validating API changelogs and migrating -- JSON data between different versions of a schema. module Data.API.Changes ( migrateDataDump+ , migrateDataDump' -- * Validating changelogs , validateChanges@@ -23,6 +23,7 @@ -- * Custom migrations , CustomMigrations(..) , mkRecordMigration+ , mkRecordMigration' , mkRecordMigrationSchema , noDataChanges , noSchemaChanges@@ -53,17 +54,20 @@ , prettyValueErrorPosition ) where +import Data.API.Changes.Types+import Data.API.Error import Data.API.JSON import Data.API.NormalForm-import Data.API.PP+import Data.API.TH.Compat import Data.API.Types import Data.API.Utils+import Data.API.Value as Value+import Data.Binary.Serialise.CBOR.Extra import Control.Applicative-import Control.Monad+import Control.Monad (guard, foldM, void) import qualified Data.Aeson as JS-import qualified Data.ByteString.Char8 as B-import qualified Data.ByteString.Base64 as B64+import Data.List import Data.Map (Map) import qualified Data.Map as Map import Data.Maybe@@ -72,9 +76,8 @@ import qualified Data.HashMap.Strict as HMap import qualified Data.Vector as V import qualified Data.Text as T-import Data.Version import Data.Time-import Data.List+import Data.Version import Language.Haskell.TH import Safe @@ -95,7 +98,7 @@ => (API, Version) -- ^ Starting schema and version -> (API, VersionExtra) -- ^ Ending schema and version -> APIChangelog -- ^ Log of changes, containing both versions- -> CustomMigrations db rec fld -- ^ Custom migration functions+ -> CustomMigrations JS.Object JS.Value db rec fld -- ^ Custom migration functions -> TypeName -- ^ Name of the dataset's type -> DataChecks -- ^ How thoroughly to validate changes -> JS.Value -- ^ Dataset to be migrated@@ -107,60 +110,24 @@ db' <- applyChangesToDatabase root custom' db changes ?!? uncurry ValueError return (db', warnings) -data MigrateFailure- = ValidateFailure ValidateFailure- | ValueError ValueError Position- deriving (Eq, Show)+migrateDataDump' :: (Read db, Read rec, Read fld)+ => (API, Version) -- ^ Starting schema and version+ -> (API, VersionExtra) -- ^ Ending schema and version+ -> APIChangelog -- ^ Log of changes, containing both versions+ -> CustomMigrations Record Value db rec fld -- ^ Custom migration functions+ -> TypeName -- ^ Name of the dataset's type+ -> DataChecks -- ^ How thoroughly to validate changes+ -> Value.Value -- ^ Dataset to be migrated+ -> Either MigrateFailure (Value.Value, [MigrateWarning])+migrateDataDump' startApi endApi changelog custom root chks db = do+ let custom' = readCustomMigrations custom+ (changes, warnings) <- validateChanges' startApi endApi changelog custom' root chks+ ?!? ValidateFailure+ db' <- applyChangesToDatabase' root custom' db changes ?!? uncurry ValueError+ return (db', warnings) -type MigrateWarning = ValidateWarning ---------------------- The key types--- -type APIWithChangelog = (API, APIChangelog)---- | An API changelog, consisting of a list of versions with the--- changes from one version to the next. The versions must be in--- descending order (according to the 'Ord' 'Version' instance).-data APIChangelog =- -- | The changes from the previous version up to this version.- ChangesUpTo VersionExtra [APIChange] APIChangelog- -- | The initial version- | ChangesStart Version- deriving (Eq, Show)---- | A single change within a changelog-data APIChange- = ChAddType TypeName NormTypeDecl- | ChDeleteType TypeName- | ChRenameType TypeName TypeName-- -- Specific changes for record types- | ChAddField TypeName FieldName APIType (Maybe DefaultValue)- | ChDeleteField TypeName FieldName- | ChRenameField TypeName FieldName FieldName- | ChChangeField TypeName FieldName APIType MigrationTag-- -- Changes for union types- | ChAddUnionAlt TypeName FieldName APIType- | ChDeleteUnionAlt TypeName FieldName- | ChRenameUnionAlt TypeName FieldName FieldName-- -- Changes for enum types- | ChAddEnumVal TypeName FieldName- | ChDeleteEnumVal TypeName FieldName- | ChRenameEnumVal TypeName FieldName FieldName-- -- Custom migrations- | ChCustomType TypeName MigrationTag- | ChCustomAll MigrationTag- deriving (Eq, Show)---- | Within the changelog, custom migrations are represented as--- strings, so we have less type-safety.-type MigrationTag = String- -- | Custom migrations used in the changelog must be implemented in -- Haskell, and supplied in this record. There are three kinds: --@@ -179,17 +146,17 @@ -- the enumeration types generated by 'generateMigrationKinds', which -- correspond to the exact set of custom migration tags used in the -- changelog.-data CustomMigrations db ty fld = CustomMigrations- { databaseMigration :: db -> JS.Object -> Either ValueError JS.Object+data CustomMigrations o v db ty fld = CustomMigrations+ { databaseMigration :: db -> o -> Either ValueError o , databaseMigrationSchema :: db -> NormAPI -> Either ApplyFailure (Maybe NormAPI)- , typeMigration :: ty -> JS.Value -> Either ValueError JS.Value+ , typeMigration :: ty -> v -> Either ValueError v , typeMigrationSchema :: ty -> NormTypeDecl -> Either ApplyFailure (Maybe NormTypeDecl)- , fieldMigration :: fld -> JS.Value -> Either ValueError JS.Value }+ , fieldMigration :: fld -> v -> Either ValueError v } -type CustomMigrationsTagged = CustomMigrations MigrationTag MigrationTag MigrationTag+type CustomMigrationsTagged o v = CustomMigrations o v MigrationTag MigrationTag MigrationTag readCustomMigrations :: (Read db, Read ty, Read fld)- => CustomMigrations db ty fld -> CustomMigrationsTagged+ => CustomMigrations o v db ty fld -> CustomMigrationsTagged o v readCustomMigrations (CustomMigrations db dbs r rs f) = CustomMigrations (db . read) (dbs . read) (r . read) (rs . read) (f . read) @@ -199,6 +166,11 @@ mkRecordMigration f (JS.Object o) = JS.Object <$> f o mkRecordMigration _ v = Left $ JSONError $ expectedObject v +mkRecordMigration' :: (Record -> Either ValueError Record)+ -> (Value -> Either ValueError Value)+mkRecordMigration' f (Record xs) = Record <$> f xs+mkRecordMigration' _ v = Left $ JSONError $ expectedObject (JS.toJSON v)+ -- | Lift a schema change on record types to work on arbitrary type declarations mkRecordMigrationSchema :: TypeName -> (NormRecordType -> Either ApplyFailure (Maybe NormRecordType))@@ -238,20 +210,6 @@ -- Changelog utils -- --- | Represents either a released version (with a version number) or--- the version under development, which is newer than any release-data VersionExtra = Release Version- | DevVersion- deriving (Eq, Ord, Show)--showVersionExtra :: VersionExtra -> String-showVersionExtra (Release v) = showVersion v-showVersionExtra DevVersion = "development"--instance PP VersionExtra where- pp = showVersionExtra-- -- | The earliest version in the changelog changelogStartVersion :: APIChangelog -> Version changelogStartVersion (ChangesStart v) = v@@ -307,28 +265,6 @@ -- Representing update positions -- --- | Represents the positions in a declaration to apply an update-data UpdateDeclPos- = UpdateHere (Maybe UpdateDeclPos)- | UpdateRecord (Map FieldName (Maybe UpdateTypePos))- | UpdateUnion (Map FieldName (Maybe UpdateTypePos))- | UpdateType UpdateTypePos- deriving (Eq, Show)---- | Represents the positions in a type to apply an update-data UpdateTypePos- = UpdateList UpdateTypePos- | UpdateMaybe UpdateTypePos- | UpdateNamed TypeName- deriving (Eq, Show)--data APITableChange- -- | The pair of an APIChange and the positions in which to apply it- = APIChange APIChange (Map TypeName UpdateDeclPos)- -- | Request to validate the dataset against the given API- | ValidateData NormAPI- deriving (Eq, Show)- -- | Given a type to be modified, find the positions in which each -- type in the API must be updated findUpdatePos :: TypeName -> NormAPI -> Map TypeName UpdateDeclPos@@ -366,70 +302,13 @@ -- Validating API changes -- --- | Errors that may be discovered when validating a changelog-data ValidateFailure- -- | the changelog must be in descending order of versions- = ChangelogOutOfOrder { vfLaterVersion :: VersionExtra- , vfEarlierVersion :: VersionExtra }- -- | forbid migrating from one version to an earlier version- | CannotDowngrade { vfFromVersion :: VersionExtra- , vfToVersion :: VersionExtra }- -- | an API uses types that are not declared- | ApiInvalid { vfInvalidVersion :: VersionExtra- , vfMissingDeclarations :: Set TypeName }- -- | changelog entry does not apply- | ChangelogEntryInvalid { vfSuccessfullyApplied :: [APITableChange]- , vfFailedToApply :: APIChange- , vfApplyFailure :: ApplyFailure }- -- | changelog is incomplete- -- (ie all entries apply ok but result isn't the target api)- | ChangelogIncomplete { vfChangelogVersion :: VersionExtra- , vfTargetVersion :: VersionExtra- , vfDifferences :: Map TypeName (MergeResult NormTypeDecl NormTypeDecl) }- deriving (Eq, Show)--data ValidateWarning = ValidateWarning -- add warnings about bits we cannot check (opaque custom)- deriving Show---- | Errors that may occur applying a single API change-data ApplyFailure- = TypeExists { afExistingType :: TypeName } -- ^ for adding or renaming type- | TypeDoesNotExist { afMissingType :: TypeName } -- ^ for deleting or renaming a type- | TypeWrongKind { afTypeName :: TypeName- , afExpectedKind :: TypeKind } -- ^ e.g. it's not a record type- | TypeInUse { afTypeName :: TypeName } -- ^ cannot delete/modify types that are still used- | TypeMalformed { afType :: APIType- , afMissingTypes :: Set TypeName } -- ^ type refers to a non-existent type- | DeclMalformed { afTypeName :: TypeName- , afDecl :: NormTypeDecl- , afMissingTypes :: Set TypeName } -- ^ decl refers to a non-existent type- | FieldExists { afTypeName :: TypeName- , afTypeKind :: TypeKind- , afExistingField :: FieldName } -- ^ for adding or renaming a field- | FieldDoesNotExist { afTypeName :: TypeName- , afTypeKind :: TypeKind- , afMissingField :: FieldName } -- ^ for deleting or renaming a field- | FieldBadDefaultValue { afTypeName :: TypeName- , afFieldName :: FieldName- , afFieldType :: APIType- , afBadDefault :: DefaultValue } -- ^ for adding a field, must be a default- -- value compatible with the type- | DefaultMissing { afTypeName :: TypeName- , afFieldName :: FieldName } -- ^ for adding a field to a table- | TableChangeError { afCustomMessage :: String } -- ^ custom error in tableChange- deriving (Eq, Show)--data TypeKind = TKRecord | TKUnion | TKEnum | TKNewtype | TKTypeSynonym- deriving (Eq, Show)-- -- | Check that a changelog adequately describes how to migrate from -- one version to another. validateChanges :: (Read db, Read rec, Read fld) => (API, Version) -- ^ Starting schema and version -> (API, VersionExtra) -- ^ Ending schema and version -> APIChangelog -- ^ Changelog to be validated- -> CustomMigrations db rec fld -- ^ Custom migration functions+ -> CustomMigrations o v db rec fld -- ^ Custom migration functions -> TypeName -- ^ Name of the dataset's type -> DataChecks -- ^ How thoroughly to validate changes -> Either ValidateFailure [ValidateWarning]@@ -442,7 +321,7 @@ validateChanges' :: (API, Version) -- ^ Starting schema and version -> (API, VersionExtra) -- ^ Ending schema and version -> APIChangelog -- ^ Changelog to be validated- -> CustomMigrationsTagged -- ^ Custom migration functions+ -> CustomMigrationsTagged o v -- ^ Custom migration functions -> TypeName -- ^ Name of the dataset's type -> DataChecks -- ^ How thoroughly to validate changes -> Either ValidateFailure ([APITableChange], [ValidateWarning])@@ -481,7 +360,7 @@ -- a list of the changes with appropriate TableChanges interspersed. -- On failure, return the list of successfully applied changes, the -- change that failed and the reason for the failure.-applyAPIChangesToAPI :: TypeName -> CustomMigrationsTagged -> DataChecks+applyAPIChangesToAPI :: TypeName -> CustomMigrationsTagged o v -> DataChecks -> [APIChange] -> NormAPI -> Either ValidateFailure (NormAPI, [APITableChange]) applyAPIChangesToAPI root custom chks changes api = do@@ -494,13 +373,13 @@ addV a cs = ValidateData a : cs -- | Apply the API change-doChangeAPI :: TypeName -> CustomMigrationsTagged -> DataChecks+doChangeAPI :: TypeName -> CustomMigrationsTagged o v -> DataChecks -> (NormAPI, [APITableChange]) -> APIChange -> Either ValidateFailure (NormAPI, [APITableChange]) doChangeAPI root custom chks (api, changes) change = do (api', pos) <- applyAPIChangeToAPI root custom change api ?!? ChangelogEntryInvalid changes change- let changes' = APIChange change pos : changes+ let changes' = APIChange api change pos : changes changes'' | validateAfter chks change = ValidateData api' : changes' | otherwise = changes' return (api', changes'')@@ -510,7 +389,7 @@ -- each change in that context, and that we end up with the API we expect -- and (2) getting the intermediate APIs during data migration, because we need -- the schema of the intermediate data as part of applying the migration.-applyAPIChangeToAPI :: TypeName -> CustomMigrationsTagged -> APIChange -> NormAPI+applyAPIChangeToAPI :: TypeName -> CustomMigrationsTagged o v -> APIChange -> NormAPI -> Either ApplyFailure (NormAPI, Map TypeName UpdateDeclPos) applyAPIChangeToAPI _ _ (ChAddType tname tdecl) api = do@@ -635,9 +514,6 @@ , Map.singleton root (UpdateHere Nothing)) -lookupType :: TypeName -> NormAPI -> Either ApplyFailure NormTypeDecl-lookupType tname api = Map.lookup tname api ?! TypeDoesNotExist tname- expectRecordType :: NormTypeDecl -> Maybe (Map FieldName APIType) expectRecordType (NRecordType rinfo) = Just rinfo expectRecordType _ = Nothing@@ -660,16 +536,16 @@ -- We assume the changes have already been validated, and that the data -- matches the API. ---applyChangesToDatabase :: TypeName -> CustomMigrationsTagged+applyChangesToDatabase :: TypeName -> CustomMigrationsTagged JS.Object JS.Value -> JS.Value -> [APITableChange] -> Either (ValueError, Position) JS.Value applyChangesToDatabase root custom = foldM (applyChangeToDatabase root custom) -- just apply each of the individual changes in sequence to the whole dataset -applyChangeToDatabase :: TypeName -> CustomMigrationsTagged+applyChangeToDatabase :: TypeName -> CustomMigrationsTagged JS.Object JS.Value -> JS.Value -> APITableChange -> Either (ValueError, Position) JS.Value-applyChangeToDatabase root custom v (APIChange c upds) =+applyChangeToDatabase root custom v (APIChange _ c upds) = updateTypeAt upds (applyChangeToData c custom) (UpdateNamed root) v [] applyChangeToDatabase root _ v (ValidateData api) = do dataMatchesNormAPI root api v@@ -703,38 +579,36 @@ -- | This actually applies the change to the data value, assuming it -- is already in the correct place-applyChangeToData :: APIChange -> CustomMigrationsTagged+applyChangeToData :: APIChange -> CustomMigrationsTagged JS.Object JS.Value -> JS.Value -> Position -> Either (ValueError, Position) JS.Value applyChangeToData (ChAddField tname fname ftype mb_defval) _ = case mb_defval <|> defaultValueForType ftype of Just defval -> let newFieldValue = defaultValueAsJsValue defval- in withObject (\ v _ -> pure $ HMap.insert (fieldKey fname) newFieldValue v)+ in withObject (\ v _ -> pure $ HMap.insert (_FieldName fname) newFieldValue v) Nothing -> \ _ p -> Left (InvalidAPI (DefaultMissing tname fname), p) applyChangeToData (ChDeleteField _ fname) _ =- withObject (\ v _ -> pure $ HMap.delete (fieldKey fname) v)+ withObject (\ v _ -> pure $ HMap.delete (_FieldName fname) v) applyChangeToData (ChRenameField _ fname fname') _ =- withObject $ \rec p -> case HMap.lookup k_fname rec of- Just field -> renameField field rec- Nothing -> Left (JSONError MissingField, InField k_fname : p)+ withObject $ \rec p -> case HMap.lookup (_FieldName fname) rec of+ Just field -> rename field rec+ Nothing -> Left (JSONError MissingField, inField fname : p) where- k_fname = fieldKey fname- k_fname' = fieldKey fname'- renameField x = pure . HMap.insert k_fname' x . HMap.delete k_fname+ rename x = pure . HMap.insert (_FieldName fname') x . HMap.delete (_FieldName fname) applyChangeToData (ChChangeField _ fname _ftype tag) custom =- withObjectField (fieldKey fname) (liftMigration $ fieldMigration custom tag)+ withObjectField (_FieldName fname) (liftMigration $ fieldMigration custom tag) applyChangeToData (ChRenameUnionAlt _ fname fname') _ = withObject $ \un p -> case HMap.toList un of- [(k, r)] | k == fieldKey fname -> return $ HMap.singleton (fieldKey fname') r- | otherwise -> return un+ [(k, r)] | k == _FieldName fname -> return $ HMap.singleton (_FieldName fname') r+ | otherwise -> return un _ -> Left (JSONError $ SyntaxError "Not singleton", p) applyChangeToData (ChRenameEnumVal _ fname fname') _ = withString $ \s _ ->- if s == fieldKey fname then return (fieldKey fname')+ if s == _FieldName fname then return (_FieldName fname') else return s applyChangeToData (ChCustomType _ tag) custom = liftMigration $ typeMigration custom tag@@ -753,17 +627,119 @@ -> (a -> Position -> Either (ValueError, Position) b) liftMigration f v p = f v ?!? flip (,) p ++---------------------------------------------------------------------+-- Performing data transformation (new generic value representation)+--++applyChangesToDatabase' :: TypeName -> CustomMigrationsTagged Record Value+ -> Value.Value -> [APITableChange]+ -> Either (ValueError, Position) Value.Value+applyChangesToDatabase' root custom = foldM (applyChangeToDatabase' root custom)+ -- just apply each of the individual changes in sequence to the whole dataset++applyChangeToDatabase' :: TypeName -> CustomMigrationsTagged Record Value+ -> Value.Value -> APITableChange+ -> Either (ValueError, Position) Value.Value+applyChangeToDatabase' root custom v (APIChange api c upds) =+ updateTypeAt' upds (applyChangeToData' api c custom) (UpdateNamed root) v []+applyChangeToDatabase' root _ v (ValidateData api) = do+ matchesNormAPI api (TyName root) v []+ return v+++-- | Apply an update at the given position in a declaration's value+updateDeclAt' :: Map TypeName UpdateDeclPos+ -> (Value.Value -> Position -> Either (ValueError, Position) Value.Value)+ -> UpdateDeclPos+ -> Value.Value -> Position -> Either (ValueError, Position) Value.Value+updateDeclAt' _ alter (UpdateHere Nothing) v p = alter v p+updateDeclAt' upds alter (UpdateHere (Just upd)) v p = flip alter p =<< updateDeclAt' upds alter upd v p+updateDeclAt' upds alter (UpdateRecord upd_flds) v p = do+ xs <- expectRecord v p+ Record <$!> mapM update xs+ where+ update x@(Field fn v') = case Map.lookup fn upd_flds of+ Just Nothing -> pure x+ Just (Just utp) -> Field fn <$!> updateTypeAt' upds alter utp v' (inField fn : p)+ Nothing -> Left (JSONError UnexpectedField, inField fn : p)+updateDeclAt' upds alter (UpdateUnion upd_alts) v p = do+ (fn, v') <- expectUnion v p+ case Map.lookup fn upd_alts of+ Just Nothing -> pure v+ Just (Just utp) -> Union fn <$!> updateTypeAt' upds alter utp v' (inField fn : p)+ Nothing -> Left (JSONError UnexpectedField, inField fn : p)+updateDeclAt' upds alter (UpdateType upd) v p = updateTypeAt' upds alter upd v p++-- | Apply an update at the given position in a type's value+updateTypeAt' :: Map TypeName UpdateDeclPos+ -> (Value.Value -> Position -> Either (ValueError, Position) Value.Value)+ -> UpdateTypePos+ -> Value.Value -> Position -> Either (ValueError, Position) Value.Value+updateTypeAt' upds alter (UpdateList upd) v p = do+ xs <- expectList v p+ List <$!> mapM (\ (i, v') -> updateTypeAt' upds alter upd v' (InElem i : p)) (zip [0..] xs)+updateTypeAt' upds alter (UpdateMaybe upd) v p = do+ mb <- expectMaybe v p+ case mb of+ Nothing -> pure v+ Just v' -> Maybe . Just <$!> updateTypeAt' upds alter upd v' p+updateTypeAt' upds alter (UpdateNamed tname) v p = case Map.lookup tname upds of+ Just upd -> updateDeclAt' upds alter upd v p+ Nothing -> pure v+++-- | This actually applies the change to the data value, assuming it+-- is already in the correct place+applyChangeToData' :: NormAPI -> APIChange -> CustomMigrationsTagged Record Value+ -> Value.Value -> Position -> Either (ValueError, Position) Value.Value++applyChangeToData' api (ChAddField tname fname ftype mb_defval) _ v p =+ case mb_defval <|> defaultValueForType ftype of+ Just defval -> case fromDefaultValue api ftype defval of+ Just v' -> Record . insertField fname v' <$!> expectRecord v p+ Nothing -> Left (InvalidAPI (FieldBadDefaultValue tname fname ftype defval), p)+ Nothing -> Left (InvalidAPI (DefaultMissing tname fname), p)++applyChangeToData' _ (ChDeleteField _ fname) _ v p =+ Record . deleteField fname <$!> expectRecord v p++applyChangeToData' _ (ChRenameField _ fname fname') _ v p =+ Record . renameField fname fname' <$!> expectRecord v p++applyChangeToData' _ (ChChangeField _ fname _ftype tag) custom v p = do+ xs <- expectRecord v p+ case findField fname xs of+ Just (ys, v', zs) -> do v'' <- liftMigration (fieldMigration custom tag) v' (inField fname:p)+ pure (Record (joinRecords ys fname v'' zs))+ Nothing -> Left (JSONError MissingField, inField fname : p)++applyChangeToData' _ (ChRenameUnionAlt _ fname fname') _ v p = do+ (fn, v') <- expectUnion v p+ pure $! if fn == fname then Union fname' v' else v++applyChangeToData' _ (ChRenameEnumVal _ fname fname') _ v p = do+ fn <- expectEnum v p+ pure $! if fn == fname then Enum fname' else v++applyChangeToData' _ (ChCustomType _ tag) custom v p = liftMigration (typeMigration custom tag) v p+applyChangeToData' _ (ChCustomAll tag) custom v p = do+ xs <- expectRecord v p+ Record <$!> liftMigration (databaseMigration custom tag) xs p++applyChangeToData' _ (ChAddType _ _) _ v _ = pure v+applyChangeToData' _ (ChDeleteType _) _ v _ = pure v+applyChangeToData' _ (ChRenameType _ _) _ v _ = pure v+applyChangeToData' _ (ChAddUnionAlt _ _ _) _ v _ = pure v+applyChangeToData' _ (ChDeleteUnionAlt _ _) _ v _ = pure v+applyChangeToData' _ (ChAddEnumVal _ _) _ v _ = pure v+applyChangeToData' _ (ChDeleteEnumVal _ _) _ v _ = pure v++ ------------------------------------- -- Utils for manipulating JS.Values -- --- | Errors that can be discovered when migrating data values-data ValueError- = JSONError JSONError -- ^ Data doesn't match schema- | CustomMigrationError String JS.Value -- ^ Error generated during custom migration- | InvalidAPI ApplyFailure -- ^ An API change was invalid- deriving (Eq, Show)- withObject :: (JS.Object -> Position -> Either (ValueError, Position) JS.Object) -> JS.Value -> Position -> Either (ValueError, Position) JS.Value withObject alter (JS.Object obj) p = JS.Object <$> alter obj p@@ -783,7 +759,7 @@ -> (a -> JS.Value -> Position -> Either (ValueError, Position) JS.Value) -> JS.Value -> Position -> Either (ValueError, Position) JS.Value withObjectMatchingFields m f (JS.Object obj) p = do- zs <- matchMaps (Map.mapKeys fieldKey m) (hmapToMap obj) ?!? toErr+ zs <- matchMaps (Map.mapKeys _FieldName m) (hmapToMap obj) ?!? toErr obj' <- Map.traverseWithKey (\ k (ty, val) -> (f ty val (InField k : p))) zs return $ JS.Object $ mapToHMap obj' where@@ -801,7 +777,7 @@ -> JS.Value -> Position -> Either (ValueError, Position) JS.Value withObjectMatchingUnion m f (JS.Object obj) p | [(k, r)] <- HMap.toList obj- = do x <- Map.lookup (fromFieldKey k) m ?! (JSONError UnexpectedField, InField k : p)+ = do x <- Map.lookup (FieldName k) m ?! (JSONError UnexpectedField, InField k : p) r' <- f x r (InField k : p) return $ JS.Object $ HMap.singleton k r' withObjectMatchingUnion _ _ _ p = Left (JSONError $ SyntaxError "Not singleton", p)@@ -823,38 +799,9 @@ withString alter (JS.String s) p = JS.String <$> alter s p withString _ v p = Left (JSONError $ expectedString v, p) -fieldKey :: FieldName -> T.Text-fieldKey (FieldName fname) = T.pack fname -fromFieldKey :: T.Text -> FieldName-fromFieldKey = FieldName . T.unpack- compatibleDefaultValue :: NormAPI -> APIType -> DefaultValue -> Bool-compatibleDefaultValue _ (TyList _) DefValList = True-compatibleDefaultValue _ (TyMaybe _) DefValMaybe = True-compatibleDefaultValue api (TyMaybe ty) defval = compatibleDefaultValue api ty defval-compatibleDefaultValue _ (TyBasic bt) defval =- compatibleBasicDefaultValue bt defval-compatibleDefaultValue _ TyJSON _ = True-compatibleDefaultValue env (TyName tname) defval =- case Map.lookup tname env of- Just (NTypeSynonym t) -> compatibleDefaultValue env t defval- Just (NNewtype bt) -> compatibleBasicDefaultValue bt defval- Just (NEnumType vals) -> case defval of- DefValString s -> fromFieldKey s `Set.member` vals- _ -> False- _ -> False-compatibleDefaultValue _ _ _ = False--compatibleBasicDefaultValue :: BasicType -> DefaultValue -> Bool-compatibleBasicDefaultValue BTstring (DefValString _) = True-compatibleBasicDefaultValue BTbinary (DefValString v) = case B64.decode (B.pack (T.unpack v)) of- Left _ -> False- Right _ -> True-compatibleBasicDefaultValue BTbool (DefValBool _) = True-compatibleBasicDefaultValue BTint (DefValInt _) = True-compatibleBasicDefaultValue BTutc (DefValUtc _) = True-compatibleBasicDefaultValue _ _ = False+compatibleDefaultValue api ty dv = isJust (fromDefaultValue api ty dv) -- | Check if there is a "default" default value for a field of the -- given type: list and maybe have @[]@ and @nothing@ respectively.@@ -883,7 +830,7 @@ declMatches (NRecordType flds) = withObjectMatchingFields flds valueMatches declMatches (NUnionType alts) = withObjectMatchingUnion alts valueMatches declMatches (NEnumType vals) = withString $ \ s p ->- if fromFieldKey s `Set.member` vals+ if FieldName s `Set.member` vals then return s else Left (JSONError UnexpectedField, InField s : p) declMatches (NTypeSynonym t) = valueMatches t@@ -913,182 +860,8 @@ type Decode t = JS.Value -> Either [(JSONError, Position)] t ----------------------------------------- Utils for merging and diffing maps--- -data MergeResult a b = OnlyInLeft a | InBoth a b | OnlyInRight b- deriving (Eq, Show)--mergeMaps :: Ord k => Map k a -> Map k b -> Map k (MergeResult a b)-mergeMaps m1 m2 = Map.unionWith (\(OnlyInLeft a) (OnlyInRight b) -> InBoth a b)- (fmap OnlyInLeft m1) (fmap OnlyInRight m2)--diffMaps :: (Eq a, Ord k) => Map k a -> Map k a -> Map k (MergeResult a a)-diffMaps m1 m2 = Map.filter different $ mergeMaps m1 m2- where- different (InBoth a b) = a /= b- different _ = True---- Attempts to match the keys of the maps to produce a map from keys--- to pairs.-matchMaps :: Ord k => Map k a -> Map k b -> Either (k, Either a b) (Map k (a, b))-matchMaps m1 m2 = Map.traverseWithKey win $ mergeMaps m1 m2- where- win _ (InBoth x y) = return (x, y)- win k (OnlyInLeft x) = Left (k, Left x)- win k (OnlyInRight x) = Left (k, Right x)-- ---------------------------------------- Pretty-printing-----prettyMigrateFailure :: MigrateFailure -> String-prettyMigrateFailure = unlines . ppLines--prettyValidateFailure :: ValidateFailure -> String-prettyValidateFailure = unlines . ppLines--prettyValueError :: ValueError -> String-prettyValueError = unlines . ppLines--prettyValueErrorPosition :: (ValueError, Position) -> String-prettyValueErrorPosition = unlines . ppLines---instance PP TypeKind where- pp TKRecord = "record"- pp TKUnion = "union"- pp TKEnum = "enum"- pp TKNewtype = "newtype"- pp TKTypeSynonym = "type"--ppATypeKind :: TypeKind -> String-ppATypeKind TKRecord = "a record"-ppATypeKind TKUnion = "a union"-ppATypeKind TKEnum = "an enum"-ppATypeKind TKNewtype = "a newtype"-ppATypeKind TKTypeSynonym = "a type synonym"--ppMemberWord :: TypeKind -> String-ppMemberWord TKRecord = "field"-ppMemberWord TKUnion = "alternative"-ppMemberWord TKEnum = "value"-ppMemberWord TKNewtype = "member"-ppMemberWord TKTypeSynonym = "member"---instance PPLines APIChange where- ppLines (ChAddType t d) = ("added " ++ pp t ++ " ") `inFrontOf` ppLines d- ppLines (ChDeleteType t) = ["removed " ++ pp t]- ppLines (ChRenameType t t') = ["renamed " ++ pp t ++ " to " ++ pp t']- ppLines (ChAddField t f ty mb_v) = [ "changed record " ++ pp t- , " field added " ++ pp f ++ " :: " ++ pp ty- ++ maybe "" (\ v -> " default " ++ pp v) mb_v]- ppLines (ChDeleteField t f) = ["changed record " ++ pp t, " field removed " ++ pp f]- ppLines (ChRenameField t f f') = [ "changed record " ++ pp t- , " field renamed " ++ pp f ++ " to " ++ pp f']- ppLines (ChChangeField t f ty c) = [ "changed record " ++ pp t- , " field changed " ++ pp f ++ " :: " ++ pp ty- ++ " migration " ++ pp c]- ppLines (ChAddUnionAlt t f ty) = [ "changed union " ++ pp t- , " alternative added " ++ pp f ++ " :: " ++ pp ty]- ppLines (ChDeleteUnionAlt t f) = [ "changed union " ++ pp t- , " alternative removed " ++ pp f]- ppLines (ChRenameUnionAlt t f f') = [ "changed union " ++ pp t- , " alternative renamed " ++ pp f ++ " to " ++ pp f']- ppLines (ChAddEnumVal t f) = [ "changed enum " ++ pp t- , " alternative added " ++ pp f]- ppLines (ChDeleteEnumVal t f) = [ "changed enum " ++ pp t- , " alternative removed " ++ pp f]- ppLines (ChRenameEnumVal t f f') = [ "changed enum " ++ pp t- , " alternative renamed " ++ pp f ++ " to " ++ pp f']- ppLines (ChCustomType t c) = ["migration record " ++ pp t ++ " " ++ pp c]- ppLines (ChCustomAll c) = ["migration " ++ pp c]--instance PPLines MigrateFailure where- ppLines (ValidateFailure x) = ppLines x- ppLines (ValueError x ps) = ppLines x ++ map prettyStep ps--instance PPLines ValidateFailure where- ppLines (ChangelogOutOfOrder later earlier) =- ["Changelog out of order: version " ++ pp later- ++ " appears after version " ++ pp earlier]- ppLines (CannotDowngrade from to) =- ["Cannot downgrade from version " ++ pp from- ++ " to version " ++ pp to]- ppLines (ApiInvalid ver missing) =- ["Missing declarations in API version " ++ pp ver ++ ": " ++ pp missing]- ppLines (ChangelogEntryInvalid succs change af) =- ppLines af ++ ("when applying the change" : indent (ppLines change))- ++ if not (null succs)- then "after successfully applying the changes:"- : indent (ppLines succs)- else []- ppLines (ChangelogIncomplete ver ver' diffs) =- ("Changelog incomplete! Differences between log version ("- ++ showVersionExtra ver ++ ") and latest version (" ++ showVersionExtra ver' ++ "):")- : indent (concatMap (uncurry ppDiff) $ Map.toList diffs)--instance PPLines APITableChange where- ppLines (APIChange c _) = ppLines c- ppLines (ValidateData _) = []--ppDiff :: TypeName -> MergeResult NormTypeDecl NormTypeDecl -> [String]-ppDiff t (OnlyInLeft _) = ["removed " ++ pp t]-ppDiff t (OnlyInRight d) = ("added " ++ pp t ++ " ") `inFrontOf` ppLines d-ppDiff t (InBoth (NRecordType flds) (NRecordType flds')) =- ("changed record " ++ pp t)- : (concatMap (uncurry (ppDiffFields "field")) $ Map.toList $ diffMaps flds flds')-ppDiff t (InBoth (NUnionType alts) (NUnionType alts')) =- ("changed union " ++ pp t)- : (concatMap (uncurry (ppDiffFields "alternative")) $ Map.toList $ diffMaps alts alts')-ppDiff t (InBoth (NEnumType vals) (NEnumType vals')) =- ("changed enum " ++ pp t)- : (map (\ x -> " alternative removed " ++ pp x) $ Set.toList $ vals Set.\\ vals')- ++ (map (\ x -> " alternative added " ++ pp x) $ Set.toList $ vals' Set.\\ vals)-ppDiff t (InBoth _ _) = ["incompatible definitions of " ++ pp t]--ppDiffFields :: String -> FieldName -> MergeResult APIType APIType -> [String]-ppDiffFields s f (OnlyInLeft _) = [" " ++ s ++ " removed " ++ pp f]-ppDiffFields s f (OnlyInRight ty) = [" " ++ s ++ " added " ++ pp f ++ " :: " ++ pp ty]-ppDiffFields s f (InBoth ty ty') = [ " incompatible types for " ++ s ++ " " ++ pp f- , " changelog type: " ++ pp ty- , " latest version type: " ++ pp ty' ]---instance PPLines ApplyFailure where- ppLines (TypeExists t) = ["Type " ++ pp t ++ " already exists"]- ppLines (TypeDoesNotExist t) = ["Type " ++ pp t ++ " does not exist"]- ppLines (TypeWrongKind t k) = ["Type " ++ pp t ++ " is not " ++ ppATypeKind k]- ppLines (TypeInUse t) = ["Type " ++ pp t ++ " is in use, so it cannot be modified"]- ppLines (TypeMalformed ty xs) = ["Type " ++ pp ty- ++ " is malformed, missing declarations:"- , " " ++ pp xs]- ppLines (DeclMalformed t _ xs) = [ "Declaration of " ++ pp t- ++ " is malformed, missing declarations:"- , " " ++ pp xs]- ppLines (FieldExists t k f) = ["Type " ++ pp t ++ " already has the "- ++ ppMemberWord k ++ " " ++ pp f]- ppLines (FieldDoesNotExist t k f) = ["Type " ++ pp t ++ " does not have the "- ++ ppMemberWord k ++ " " ++ pp f]- ppLines (FieldBadDefaultValue _ _ ty v) = ["Default value " ++ pp v- ++ " is not compatible with the type " ++ pp ty]- ppLines (DefaultMissing t f) = ["Field " ++ pp f ++ " does not have a default value, but "- ++ pp t ++ " occurs in the database"]- ppLines (TableChangeError s) = ["Error when detecting changed tables:", " " ++ s]---instance PPLines ValueError where- ppLines (JSONError e) = [prettyJSONError e]- ppLines (CustomMigrationError e v) = [ "Custom migration error:", " " ++ e- , "when migrating value"] ++ indent (ppLines v)- ppLines (InvalidAPI af) = "Invalid API detected during value migration:"- : indent (ppLines af)---------------------------------------- -- Template Haskell -- @@ -1100,9 +873,9 @@ guardNoDups (all_tags `Set.intersection` fld_tags) guardNoDups (rec_tags `Set.intersection` fld_tags) - return [ DataD [] (mkName all_nm) [] (cons all_nm all_tags) derivs- , DataD [] (mkName rec_nm) [] (cons rec_nm rec_tags) derivs- , DataD [] (mkName fld_nm) [] (cons fld_nm fld_tags) derivs ]+ return [ mkDataD [] (mkName all_nm) [] (cons all_nm all_tags) derivs+ , mkDataD [] (mkName rec_nm) [] (cons rec_nm rec_tags) derivs+ , mkDataD [] (mkName fld_nm) [] (cons fld_nm fld_tags) derivs ] where (all_tags, rec_tags, fld_tags) = changelogTags changes
+ src/Data/API/Changes/Types.hs view
@@ -0,0 +1,145 @@+{-# LANGUAGE DefaultSignatures #-}+{-# LANGUAGE DeriveFunctor #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TemplateHaskell #-}++module Data.API.Changes.Types+ ( -- * Changelog representation+ APIWithChangelog+ , APIChangelog(..)+ , APIChange(..)+ , MigrationTag+ , VersionExtra(..)+ , showVersionExtra++ , UpdateTypePos(..)+ , UpdateDeclPos(..)+ , APITableChange(..)+ ) where++import Data.API.PP+import Data.API.NormalForm+import Data.API.Types++import Data.Map ( Map )+import Data.Version+++------------------+-- The key types+--++type APIWithChangelog = (API, APIChangelog)++-- | An API changelog, consisting of a list of versions with the+-- changes from one version to the next. The versions must be in+-- descending order (according to the 'Ord' 'Version' instance).+data APIChangelog =+ -- | The changes from the previous version up to this version.+ ChangesUpTo VersionExtra [APIChange] APIChangelog+ -- | The initial version+ | ChangesStart Version+ deriving (Eq, Show)++-- | A single change within a changelog+data APIChange+ = ChAddType TypeName NormTypeDecl+ | ChDeleteType TypeName+ | ChRenameType TypeName TypeName++ -- Specific changes for record types+ | ChAddField TypeName FieldName APIType (Maybe DefaultValue)+ | ChDeleteField TypeName FieldName+ | ChRenameField TypeName FieldName FieldName+ | ChChangeField TypeName FieldName APIType MigrationTag++ -- Changes for union types+ | ChAddUnionAlt TypeName FieldName APIType+ | ChDeleteUnionAlt TypeName FieldName+ | ChRenameUnionAlt TypeName FieldName FieldName++ -- Changes for enum types+ | ChAddEnumVal TypeName FieldName+ | ChDeleteEnumVal TypeName FieldName+ | ChRenameEnumVal TypeName FieldName FieldName++ -- Custom migrations+ | ChCustomType TypeName MigrationTag+ | ChCustomAll MigrationTag+ deriving (Eq, Show)++instance PPLines APIChange where+ ppLines (ChAddType t d) = ("added " ++ pp t ++ " ") `inFrontOf` ppLines d+ ppLines (ChDeleteType t) = ["removed " ++ pp t]+ ppLines (ChRenameType t t') = ["renamed " ++ pp t ++ " to " ++ pp t']+ ppLines (ChAddField t f ty mb_v) = [ "changed record " ++ pp t+ , " field added " ++ pp f ++ " :: " ++ pp ty+ ++ maybe "" (\ v -> " default " ++ pp v) mb_v]+ ppLines (ChDeleteField t f) = ["changed record " ++ pp t, " field removed " ++ pp f]+ ppLines (ChRenameField t f f') = [ "changed record " ++ pp t+ , " field renamed " ++ pp f ++ " to " ++ pp f']+ ppLines (ChChangeField t f ty c) = [ "changed record " ++ pp t+ , " field changed " ++ pp f ++ " :: " ++ pp ty+ ++ " migration " ++ pp c]+ ppLines (ChAddUnionAlt t f ty) = [ "changed union " ++ pp t+ , " alternative added " ++ pp f ++ " :: " ++ pp ty]+ ppLines (ChDeleteUnionAlt t f) = [ "changed union " ++ pp t+ , " alternative removed " ++ pp f]+ ppLines (ChRenameUnionAlt t f f') = [ "changed union " ++ pp t+ , " alternative renamed " ++ pp f ++ " to " ++ pp f']+ ppLines (ChAddEnumVal t f) = [ "changed enum " ++ pp t+ , " alternative added " ++ pp f]+ ppLines (ChDeleteEnumVal t f) = [ "changed enum " ++ pp t+ , " alternative removed " ++ pp f]+ ppLines (ChRenameEnumVal t f f') = [ "changed enum " ++ pp t+ , " alternative renamed " ++ pp f ++ " to " ++ pp f']+ ppLines (ChCustomType t c) = ["migration record " ++ pp t ++ " " ++ pp c]+ ppLines (ChCustomAll c) = ["migration " ++ pp c]++-- | Within the changelog, custom migrations are represented as+-- strings, so we have less type-safety.+type MigrationTag = String++-- | Represents either a released version (with a version number) or+-- the version under development, which is newer than any release+data VersionExtra = Release Version+ | DevVersion+ deriving (Eq, Ord, Show)++showVersionExtra :: VersionExtra -> String+showVersionExtra (Release v) = showVersion v+showVersionExtra DevVersion = "development"++instance PP VersionExtra where+ pp = showVersionExtra+++------------------------+-- Representing updates+--++-- | Represents the positions in a declaration to apply an update+data UpdateDeclPos+ = UpdateHere (Maybe UpdateDeclPos)+ | UpdateRecord (Map FieldName (Maybe UpdateTypePos))+ | UpdateUnion (Map FieldName (Maybe UpdateTypePos))+ | UpdateType UpdateTypePos+ deriving (Eq, Show)++-- | Represents the positions in a type to apply an update+data UpdateTypePos+ = UpdateList UpdateTypePos+ | UpdateMaybe UpdateTypePos+ | UpdateNamed TypeName+ deriving (Eq, Show)++data APITableChange+ -- | An initial API, an APIChange and the positions in which to apply it+ = APIChange NormAPI APIChange (Map TypeName UpdateDeclPos)+ -- | Request to validate the dataset against the given API+ | ValidateData NormAPI+ deriving (Eq, Show)++instance PPLines APITableChange where+ ppLines (APIChange _ c _) = ppLines c+ ppLines (ValidateData _) = []
src/Data/API/Doc/Types.hs view
@@ -21,6 +21,7 @@ import Data.API.PP import Data.API.Types +import qualified Data.Text as T import Text.Printf type URL = String@@ -103,7 +104,7 @@ renderAPIType :: DocInfo -> APIType -> String renderAPIType di (TyList ty ) = "[" ++ renderAPIType di ty ++ "]" renderAPIType di (TyMaybe ty ) = "?" ++ renderAPIType di ty-renderAPIType di (TyName tn ) = mk_link (doc_info_type_url di tn) (_TypeName tn)+renderAPIType di (TyName tn ) = mk_link (doc_info_type_url di tn) (T.unpack (_TypeName tn)) renderAPIType _ (TyBasic bt ) = pp bt renderAPIType _ TyJSON = "json"
+ src/Data/API/Error.hs view
@@ -0,0 +1,372 @@+{-# LANGUAGE DefaultSignatures #-}+{-# LANGUAGE DeriveFunctor #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TemplateHaskell #-}++module Data.API.Error+ ( -- * Representation of JSON parsing errors+ JSONError(..)+ , JSONWarning+ , Expected(..)+ , FormatExpected(..)+ , Position+ , Step(..)+ , inField+ , prettyJSONErrorPositions+ , prettyJSONError+ , prettyStep++ -- * JSON parse error construction+ , expectedArray+ , expectedBool+ , expectedInt+ , expectedObject+ , expectedString+ , badFormat++ -- * Validation and migration errors+ , ValueError(..)+ , ValidateFailure(..)+ , ValidateWarning+ , ApplyFailure(..)+ , TypeKind(..)+ , MigrateFailure(..)+ , MigrateWarning+ , prettyMigrateFailure+ , prettyValidateFailure+ , prettyValueError+ , prettyValueErrorPosition+ ) where++import Data.API.Changes.Types+import Data.API.PP+import Data.API.NormalForm+import Data.API.Types+import Data.API.Utils++import qualified Data.Aeson as JS+import Data.Aeson.TH+import qualified Data.Graph as Graph+import Data.List+import Data.Map ( Map )+import qualified Data.Map as Map+import qualified Data.SafeCopy as SC+import Data.Set ( Set )+import qualified Data.Set as Set+import qualified Data.Text as T+import Data.Time+++----------------------------------------------------------+-- Representation of JSON parsing errors and positions+--++-- | Represents an error that can be encountered while parsing+data JSONError = Expected Expected String JS.Value+ | BadFormat FormatExpected String T.Text+ | MissingField+ | MissingAlt [String]+ | UnexpectedField+ | UnexpectedEnumVal [T.Text] T.Text+ | IntRangeError String Int IntRange+ | UTCRangeError String UTCTime UTCRange+ | RegexError String T.Text RegEx+ | SyntaxError String+ deriving (Eq, Show)++-- | At present, we do not distinguish between errors and warnings+type JSONWarning = JSONError++-- | JSON type expected at a particular position, when a value of a+-- different type was encountered+data Expected = ExpArray+ | ExpBool+ | ExpInt+ | ExpObject+ | ExpString+ deriving (Eq, Show)++-- | Special format expected of a string+data FormatExpected = FmtBinary+ | FmtUTC+ | FmtOther+ deriving (Eq, Show)++expectedArray, expectedBool, expectedInt, expectedObject, expectedString+ :: JS.Value -> JSONError+expectedArray = Expected ExpArray "Array"+expectedBool = Expected ExpBool "Bool"+expectedInt = Expected ExpInt "Int"+expectedObject = Expected ExpObject "Object"+expectedString = Expected ExpString "String"++badFormat :: String -> T.Text -> JSONError+badFormat = BadFormat FmtOther++-- | Human-readable description of a JSON parse error+prettyJSONError :: JSONError -> String+prettyJSONError (Expected _ s v) = "When expecting " ++ s ++ ", encountered "+ ++ x ++ " instead"+ where+ x = case v of+ JS.Object _ -> "Object"+ JS.Array _ -> "Array"+ JS.String _ -> "String"+ JS.Number _ -> "Number"+ JS.Bool _ -> "Boolean"+ JS.Null -> "Null"+prettyJSONError (BadFormat _ s t) = "Could not parse as " ++ s ++ " the string " ++ show t+prettyJSONError MissingField = "Field missing from Object"+prettyJSONError (MissingAlt xs) = "Missing alternative, expecting one of: "+ ++ intercalate ", " xs+prettyJSONError UnexpectedField = "Unexpected field in Object"+prettyJSONError (UnexpectedEnumVal xs t) = "Unexpected enum value " ++ show t+ ++ ", expecting one of: "+ ++ T.unpack (T.intercalate ", " xs)+prettyJSONError (IntRangeError s i r) = s ++ ": " ++ show i ++ " not in range " ++ show r+prettyJSONError (UTCRangeError s u r) = s ++ ": " ++ show u ++ " not in range " ++ show r+prettyJSONError (RegexError s _ t) = s ++ ": failed to match RE: " ++ show t+prettyJSONError (SyntaxError e) = "JSON syntax error: " ++ e++-- | A position inside a JSON value is a list of steps, ordered+-- innermost first (so going inside an object prepends a step).+type Position = [Step]++-- | Each step may be into a field of an object, or a specific element+-- of an array.+data Step = InField T.Text | InElem Int+ deriving (Eq, Show)++inField :: FieldName -> Step+inField fn = InField (_FieldName fn)++-- | Human-readable description of a single step in a position+prettyStep :: Step -> String+prettyStep (InField f) = " in the field " ++ show f+prettyStep (InElem i) = " in array index " ++ show i++instance PPLines Step where+ ppLines s = [prettyStep s]++-- | Human-readable presentation of a list of parse errors with their+-- positions+prettyJSONErrorPositions :: [(JSONError, Position)] -> String+prettyJSONErrorPositions xs = unlines $ concatMap help xs+ where+ help (e, pos) = prettyJSONError e : map prettyStep pos++++----------------------------------------------------------+-- Validation and data migration errors+--++-- | Errors that can be discovered when migrating data values+data ValueError+ = JSONError JSONError -- ^ Data doesn't match schema+ | CustomMigrationError String JS.Value -- ^ Error generated during custom migration+ | InvalidAPI ApplyFailure -- ^ An API change was invalid+ deriving (Eq, Show)++-- | Errors that may be discovered when validating a changelog+data ValidateFailure+ -- | the changelog must be in descending order of versions+ = ChangelogOutOfOrder { vfLaterVersion :: VersionExtra+ , vfEarlierVersion :: VersionExtra }+ -- | forbid migrating from one version to an earlier version+ | CannotDowngrade { vfFromVersion :: VersionExtra+ , vfToVersion :: VersionExtra }+ -- | an API uses types that are not declared+ | ApiInvalid { vfInvalidVersion :: VersionExtra+ , vfMissingDeclarations :: Set TypeName }+ -- | changelog entry does not apply+ | ChangelogEntryInvalid { vfSuccessfullyApplied :: [APITableChange]+ , vfFailedToApply :: APIChange+ , vfApplyFailure :: ApplyFailure }+ -- | changelog is incomplete+ -- (ie all entries apply ok but result isn't the target api)+ | ChangelogIncomplete { vfChangelogVersion :: VersionExtra+ , vfTargetVersion :: VersionExtra+ , vfDifferences :: Map TypeName (MergeResult NormTypeDecl NormTypeDecl) }+ deriving (Eq, Show)++data ValidateWarning = ValidateWarning -- add warnings about bits we cannot check (opaque custom)+ deriving Show++-- | Errors that may occur applying a single API change+data ApplyFailure+ = TypeExists { afExistingType :: TypeName } -- ^ for adding or renaming type+ | TypeDoesNotExist { afMissingType :: TypeName } -- ^ for deleting or renaming a type+ | TypeWrongKind { afTypeName :: TypeName+ , afExpectedKind :: TypeKind } -- ^ e.g. it's not a record type+ | TypeInUse { afTypeName :: TypeName } -- ^ cannot delete/modify types that are still used+ | TypeMalformed { afType :: APIType+ , afMissingTypes :: Set TypeName } -- ^ type refers to a non-existent type+ | DeclMalformed { afTypeName :: TypeName+ , afDecl :: NormTypeDecl+ , afMissingTypes :: Set TypeName } -- ^ decl refers to a non-existent type+ | FieldExists { afTypeName :: TypeName+ , afTypeKind :: TypeKind+ , afExistingField :: FieldName } -- ^ for adding or renaming a field+ | FieldDoesNotExist { afTypeName :: TypeName+ , afTypeKind :: TypeKind+ , afMissingField :: FieldName } -- ^ for deleting or renaming a field+ | FieldBadDefaultValue { afTypeName :: TypeName+ , afFieldName :: FieldName+ , afFieldType :: APIType+ , afBadDefault :: DefaultValue } -- ^ for adding a field, must be a default+ -- value compatible with the type+ | DefaultMissing { afTypeName :: TypeName+ , afFieldName :: FieldName } -- ^ for adding a field to a table+ | TableChangeError { afCustomMessage :: String } -- ^ custom error in tableChange+ deriving (Eq, Show)++data TypeKind = TKRecord | TKUnion | TKEnum | TKNewtype | TKTypeSynonym+ deriving (Eq, Show)+++data MigrateFailure+ = ValidateFailure ValidateFailure+ | ValueError ValueError Position+ deriving (Eq, Show)++type MigrateWarning = ValidateWarning+++-------------------------------------+-- Pretty-printing+--++prettyMigrateFailure :: MigrateFailure -> String+prettyMigrateFailure = unlines . ppLines++prettyValidateFailure :: ValidateFailure -> String+prettyValidateFailure = unlines . ppLines++prettyValueError :: ValueError -> String+prettyValueError = unlines . ppLines++prettyValueErrorPosition :: (ValueError, Position) -> String+prettyValueErrorPosition = unlines . ppLines+++instance PP TypeKind where+ pp TKRecord = "record"+ pp TKUnion = "union"+ pp TKEnum = "enum"+ pp TKNewtype = "newtype"+ pp TKTypeSynonym = "type"++ppATypeKind :: TypeKind -> String+ppATypeKind TKRecord = "a record"+ppATypeKind TKUnion = "a union"+ppATypeKind TKEnum = "an enum"+ppATypeKind TKNewtype = "a newtype"+ppATypeKind TKTypeSynonym = "a type synonym"++ppMemberWord :: TypeKind -> String+ppMemberWord TKRecord = "field"+ppMemberWord TKUnion = "alternative"+ppMemberWord TKEnum = "value"+ppMemberWord TKNewtype = "member"+ppMemberWord TKTypeSynonym = "member"+++instance PPLines MigrateFailure where+ ppLines (ValidateFailure x) = ppLines x+ ppLines (ValueError x ps) = ppLines x ++ map prettyStep ps++instance PPLines ValidateFailure where+ ppLines (ChangelogOutOfOrder later earlier) =+ ["Changelog out of order: version " ++ pp later+ ++ " appears after version " ++ pp earlier]+ ppLines (CannotDowngrade from to) =+ ["Cannot downgrade from version " ++ pp from+ ++ " to version " ++ pp to]+ ppLines (ApiInvalid ver missing) =+ ["Missing declarations in API version " ++ pp ver ++ ": " ++ pp missing]+ ppLines (ChangelogEntryInvalid succs change af) =+ ppLines af ++ ("when applying the change" : indent (ppLines change))+ ++ if not (null succs)+ then "after successfully applying the changes:"+ : indent (ppLines succs)+ else []+ ppLines (ChangelogIncomplete ver ver' diffs) =+ ("Changelog incomplete! Differences between log version ("+ ++ showVersionExtra ver ++ ") and latest version (" ++ showVersionExtra ver' ++ "):")+ : indent (ppDiffs diffs)+++ppDiffs :: Map TypeName (MergeResult NormTypeDecl NormTypeDecl) -> [String]+ppDiffs = concatMap (uncurry ppDiff) . sortDiffs . Map.toList++-- | Perform a topological sort of the differences, so that the+-- pretty-printed form can be copied directly into the changelog.+sortDiffs :: [(TypeName, MergeResult NormTypeDecl NormTypeDecl)]+ -> [(TypeName, MergeResult NormTypeDecl NormTypeDecl)]+sortDiffs = reverse . Graph.flattenSCCs . Graph.stronglyConnComp . map f+ where+ f (tn, mr) = ((tn, mr), tn, Set.toList (mergeResultFreeVars mr))++mergeResultFreeVars :: MergeResult NormTypeDecl NormTypeDecl -> Set TypeName+mergeResultFreeVars (OnlyInLeft x) = typeDeclFreeVars x+mergeResultFreeVars (OnlyInRight x) = typeDeclFreeVars x+mergeResultFreeVars (InBoth x y) = typeDeclFreeVars x `Set.union` typeDeclFreeVars y++ppDiff :: TypeName -> MergeResult NormTypeDecl NormTypeDecl -> [String]+ppDiff t (OnlyInLeft _) = ["removed " ++ pp t]+ppDiff t (OnlyInRight d) = ("added " ++ pp t ++ " ") `inFrontOf` ppLines d+ppDiff t (InBoth (NRecordType flds) (NRecordType flds')) =+ ("changed record " ++ pp t)+ : (concatMap (uncurry (ppDiffFields "field")) $ Map.toList $ diffMaps flds flds')+ppDiff t (InBoth (NUnionType alts) (NUnionType alts')) =+ ("changed union " ++ pp t)+ : (concatMap (uncurry (ppDiffFields "alternative")) $ Map.toList $ diffMaps alts alts')+ppDiff t (InBoth (NEnumType vals) (NEnumType vals')) =+ ("changed enum " ++ pp t)+ : (map (\ x -> " alternative removed " ++ pp x) $ Set.toList $ vals Set.\\ vals')+ ++ (map (\ x -> " alternative added " ++ pp x) $ Set.toList $ vals' Set.\\ vals)+ppDiff t (InBoth _ _) = ["incompatible definitions of " ++ pp t]++ppDiffFields :: String -> FieldName -> MergeResult APIType APIType -> [String]+ppDiffFields s f (OnlyInLeft _) = [" " ++ s ++ " removed " ++ pp f]+ppDiffFields s f (OnlyInRight ty) = [" " ++ s ++ " added " ++ pp f ++ " :: " ++ pp ty]+ppDiffFields s f (InBoth ty ty') = [ " incompatible types for " ++ s ++ " " ++ pp f+ , " changelog type: " ++ pp ty+ , " latest version type: " ++ pp ty' ]++instance PPLines ApplyFailure where+ ppLines (TypeExists t) = ["Type " ++ pp t ++ " already exists"]+ ppLines (TypeDoesNotExist t) = ["Type " ++ pp t ++ " does not exist"]+ ppLines (TypeWrongKind t k) = ["Type " ++ pp t ++ " is not " ++ ppATypeKind k]+ ppLines (TypeInUse t) = ["Type " ++ pp t ++ " is in use, so it cannot be modified"]+ ppLines (TypeMalformed ty xs) = ["Type " ++ pp ty+ ++ " is malformed, missing declarations:"+ , " " ++ pp xs]+ ppLines (DeclMalformed t _ xs) = [ "Declaration of " ++ pp t+ ++ " is malformed, missing declarations:"+ , " " ++ pp xs]+ ppLines (FieldExists t k f) = ["Type " ++ pp t ++ " already has the "+ ++ ppMemberWord k ++ " " ++ pp f]+ ppLines (FieldDoesNotExist t k f) = ["Type " ++ pp t ++ " does not have the "+ ++ ppMemberWord k ++ " " ++ pp f]+ ppLines (FieldBadDefaultValue _ _ ty v) = ["Default value " ++ pp v+ ++ " is not compatible with the type " ++ pp ty]+ ppLines (DefaultMissing t f) = ["Field " ++ pp f ++ " does not have a default value, but "+ ++ pp t ++ " occurs in the database"]+ ppLines (TableChangeError s) = ["Error when detecting changed tables:", " " ++ s]+++instance PPLines ValueError where+ ppLines (JSONError e) = [prettyJSONError e]+ ppLines (CustomMigrationError e v) = [ "Custom migration error:", " " ++ e+ , "when migrating value"] ++ indent (ppLines v)+ ppLines (InvalidAPI af) = "Invalid API detected during value migration:"+ : indent (ppLines af)+++$(deriveJSON defaultOptions ''JSONError)+$(deriveJSON defaultOptions ''Expected)+$(deriveJSON defaultOptions ''FormatExpected)+$(deriveJSON defaultOptions ''Step)+$(SC.deriveSafeCopy 1 'SC.base ''Step)
src/Data/API/JSON.hs view
@@ -9,19 +9,8 @@ -- independent errors rather than stopping on the first one -- encountered. module Data.API.JSON- ( -- * Representation of JSON parsing errors- JSONError(..)- , JSONWarning- , Expected(..)- , FormatExpected(..)- , Position- , Step(..)- , prettyJSONErrorPositions- , prettyJSONError- , prettyStep-- -- * Parser with multiple error support- , ParserWithErrs+ ( -- * Parser with multiple error support+ ParserWithErrs , ParseFlags(useDefaults, enforceReadOnlyFields, enforceFilters) , defaultParseFlags , runParserWithErrsTop@@ -37,13 +26,6 @@ -- * ParserWithErrs combinators , withParseFlags- , failWith- , expectedArray- , expectedBool- , expectedInt- , expectedObject- , expectedString- , badFormat , withInt , withIntRange , withBinary@@ -58,8 +40,29 @@ , (.:.) , (.::) , withUnion++ -- * Representation of JSON parsing errors+ , JSONError(..)+ , JSONWarning+ , Expected(..)+ , FormatExpected(..)+ , Position+ , Step(..)+ , prettyJSONErrorPositions+ , prettyJSONError+ , prettyStep++ -- * Error construction+ , failWith+ , expectedArray+ , expectedBool+ , expectedInt+ , expectedObject+ , expectedString+ , badFormat ) where +import Data.API.Error import Data.API.Types import Data.API.Utils @@ -67,15 +70,12 @@ import qualified Data.Aeson as JS import qualified Data.Aeson.Parser as JS import qualified Data.Aeson.Types as JS-import Data.Aeson.TH import Data.Attoparsec.ByteString import qualified Data.ByteString.Char8 as B import qualified Data.ByteString.Base64 as B64 import qualified Data.ByteString.Lazy as BL import qualified Data.HashMap.Strict as HMap-import Data.List import Data.Maybe-import qualified Data.SafeCopy as SC import qualified Data.Text as T import qualified Data.Text.Encoding as T import Data.Time@@ -84,98 +84,7 @@ import Data.Version import Distribution.Text import Text.Regex--------------------------------------------------------------- Representation of JSON parsing errors and positions------- | Represents an error that can be encountered while parsing-data JSONError = Expected Expected String JS.Value- | BadFormat FormatExpected String T.Text- | MissingField- | MissingAlt [String]- | UnexpectedField- | UnexpectedEnumVal [T.Text] T.Text- | IntRangeError String Int IntRange- | UTCRangeError String UTCTime UTCRange- | RegexError String T.Text RegEx- | SyntaxError String- deriving (Eq, Show)---- | At present, we do not distinguish between errors and warnings-type JSONWarning = JSONError---- | JSON type expected at a particular position, when a value of a--- different type was encountered-data Expected = ExpArray- | ExpBool- | ExpInt- | ExpObject- | ExpString- deriving (Eq, Show)---- | Special format expected of a string-data FormatExpected = FmtBinary- | FmtUTC- | FmtOther- deriving (Eq, Show)--expectedArray, expectedBool, expectedInt, expectedObject, expectedString- :: JS.Value -> JSONError-expectedArray = Expected ExpArray "Array"-expectedBool = Expected ExpBool "Bool"-expectedInt = Expected ExpInt "Int"-expectedObject = Expected ExpObject "Object"-expectedString = Expected ExpString "String"--badFormat :: String -> T.Text -> JSONError-badFormat = BadFormat FmtOther---- | Human-readable description of a JSON parse error-prettyJSONError :: JSONError -> String-prettyJSONError (Expected _ s v) = "When expecting " ++ s ++ ", encountered "- ++ x ++ " instead"- where- x = case v of- JS.Object _ -> "Object"- JS.Array _ -> "Array"- JS.String _ -> "String"- JS.Number _ -> "Number"- JS.Bool _ -> "Boolean"- JS.Null -> "Null"-prettyJSONError (BadFormat _ s t) = "Could not parse as " ++ s ++ " the string " ++ show t-prettyJSONError MissingField = "Field missing from Object"-prettyJSONError (MissingAlt xs) = "Missing alternative, expecting one of: "- ++ intercalate ", " xs-prettyJSONError UnexpectedField = "Unexpected field in Object"-prettyJSONError (UnexpectedEnumVal xs t) = "Unexpected enum value " ++ show t- ++ ", expecting one of: "- ++ T.unpack (T.intercalate ", " xs)-prettyJSONError (IntRangeError s i r) = s ++ ": " ++ show i ++ " not in range " ++ show r-prettyJSONError (UTCRangeError s u r) = s ++ ": " ++ show u ++ " not in range " ++ show r-prettyJSONError (RegexError s _ t) = s ++ ": failed to match RE: " ++ show t-prettyJSONError (SyntaxError e) = "JSON syntax error: " ++ e---- | A position inside a JSON value is a list of steps, ordered--- innermost first (so going inside an object prepends a step).-type Position = [Step]---- | Each step may be into a field of an object, or a specific element--- of an array.-data Step = InField T.Text | InElem Int- deriving (Eq, Show)---- | Human-readable description of a single step in a position-prettyStep :: Step -> String-prettyStep (InField f) = " in the field " ++ show f-prettyStep (InElem i) = " in array index " ++ show i---- | Human-readable presentation of a list of parse errors with their--- positions-prettyJSONErrorPositions :: [(JSONError, Position)] -> String-prettyJSONErrorPositions xs = unlines $ concatMap help xs- where- help (e, pos) = prettyJSONError e : map prettyStep pos+import Prelude ----------------------------------------@@ -387,18 +296,17 @@ else warning err >> m --- It's contrary to my principles, but I'll accept a string containing--- a number instead of an actual number...+-- | It's contrary to my principles, but I'll accept a string containing+-- a number instead of an actual number, and will silently truncate+-- floating point numbers to integers... withInt :: String -> (Int -> ParserWithErrs a) -> JS.Value -> ParserWithErrs a withInt = withNum -withNum :: JS.FromJSON n => String -> (n -> ParserWithErrs a) -> JS.Value -> ParserWithErrs a-withNum s f v = case JS.fromJSON v of- JS.Success i -> f i- JS.Error _ | JS.String t <- v- , Right v' <- parseOnly (JS.value <* endOfInput) (T.encodeUtf8 t)- , JS.Success i <- JS.fromJSON v' -> f i- | otherwise -> failWith $ Expected ExpInt s v+withNum :: Integral n => String -> (n -> ParserWithErrs a) -> JS.Value -> ParserWithErrs a+withNum _ f (JS.Number n) = f (truncate n)+withNum s f (JS.String t)+ | Right v' <- parseOnly (JS.value <* endOfInput) (T.encodeUtf8 t) = withNum s f v'+withNum s _ v = failWith $ Expected ExpInt s v withIntRange :: IntRange -> String -> (Int -> ParserWithErrs a) -> JS.Value -> ParserWithErrs a@@ -500,10 +408,3 @@ [] -> failWith $ MissingAlt $ map (T.unpack . fst) xs _:_:_ -> failWith UnexpectedField withUnion _ val = failWith $ Expected ExpObject "Union" val---deriveJSON defaultOptions ''JSONError-deriveJSON defaultOptions ''Expected-deriveJSON defaultOptions ''FormatExpected-deriveJSON defaultOptions ''Step-$(SC.deriveSafeCopy 1 'SC.base ''Step)
+ src/Data/API/JSONToCBOR.hs view
@@ -0,0 +1,196 @@+{-# LANGUAGE BangPatterns #-}+module Data.API.JSONToCBOR+ ( serialiseJSONWithSchema+ , jsonToCBORWithSchema+ , deserialiseJSONWithSchema+ , postprocessJSON+ ) where++import Data.API.Changes+import Data.API.JSON+import Data.API.Types+import Data.API.Utils++import Control.Applicative+import Data.Aeson hiding (encode)+import qualified Data.ByteString.Base64 as B64+import qualified Data.ByteString.Lazy as LBS+import qualified Data.HashMap.Strict as HMap+import qualified Data.Map as Map+import Data.Traversable+import qualified Data.Vector as Vec+import Codec.Serialise as CBOR+import Data.Binary.Serialise.CBOR.JSON (cborToJson, jsonToCbor)+import Codec.CBOR.Term+import Data.Fixed (Pico)+import Data.Maybe (fromMaybe)+import Data.Scientific+import qualified Data.Text as T+import qualified Data.Text.Encoding as TE+import Data.Time.Clock.POSIX+import Data.Time (UTCTime(UTCTime))+import Prelude+++-- | Serialise a JSON value as a CBOR term in a generic but+-- schema-dependent fashion. This is necessary because the JSON+-- representation carries less information than we need in CBOR+-- (e.g. it lacks a distinction between bytestrings and text).+serialiseJSONWithSchema :: API -> TypeName -> Value -> LBS.ByteString+serialiseJSONWithSchema api tn v = serialise $ jsonToCBORWithSchema api tn v++-- | Convert a JSON value into a CBOR term in a generic but+-- schema-dependent fashion.+jsonToCBORWithSchema :: API -> TypeName -> Value -> Term+jsonToCBORWithSchema = jsonToCBORTypeName . apiNormalForm++jsonToCBORTypeName :: NormAPI -> TypeName -> Value -> Term+jsonToCBORTypeName napi tn v =+ case Map.lookup tn napi of+ Just (NRecordType nrt) -> jsonToCBORRecord napi nrt v+ Just (NUnionType nut) -> jsonToCBORUnion napi nut v+ Just (NEnumType net) -> jsonToCBOREnum napi net v+ Just (NTypeSynonym ty) -> jsonToCBORType napi ty v+ Just (NNewtype bt) -> jsonToCBORBasic bt v+ Nothing -> error $ "serialiseJSONWithSchema: missing definition for type "+ ++ T.unpack (_TypeName tn)++jsonToCBORType :: NormAPI -> APIType -> Value -> Term+jsonToCBORType napi ty0 v = case (ty0, v) of+ (TyList ty, Array arr) | Vec.null arr -> TList []+ | otherwise -> TListI $ map (jsonToCBORType napi ty) (Vec.toList arr)+ (TyList _ , _) -> error "serialiseJSONWithSchema: expected array"+ (TyMaybe _ , Null) -> TList []+ (TyMaybe ty, _) -> TList [jsonToCBORType napi ty v]+ (TyName tn, _) -> jsonToCBORTypeName napi tn v+ (TyBasic bt, _) -> jsonToCBORBasic bt v+ (TyJSON , _) -> jsonToCbor v++-- | Encode a record as a map from field names to values. Crucially,+-- the fields are in ascending order by field name.+jsonToCBORRecord :: NormAPI -> NormRecordType -> Value -> Term+jsonToCBORRecord napi nrt v = case v of+ Object hm -> TMap $ map (f hm) $ Map.toAscList nrt+ _ -> error "serialiseJSONWithSchema: expected object"+ where+ f hm (fn, ty) = case HMap.lookup (_FieldName fn) hm of+ Nothing -> error $ "serialiseJSONWithSchema: missing field " ++ T.unpack (_FieldName fn)+ Just v' -> (TString (_FieldName fn), jsonToCBORType napi ty v')++-- | Encode a union as a single-element map from the field name to the value.+jsonToCBORUnion :: NormAPI -> NormUnionType -> Value -> Term+jsonToCBORUnion napi nut v = case v of+ Object hm | [(k, r)] <- HMap.toList hm -> case Map.lookup (FieldName k) nut of+ Just ty -> TMap [(TString k, jsonToCBORType napi ty r)]+ Nothing -> error "serialiseJSONWithSchema: unexpected alternative in union"+ _ -> error "serialiseJSONWithSchema: expected single-field object"++-- | Encode an enumerated value as its name; we do not check that it+-- actually belongs to the type here.+jsonToCBOREnum :: NormAPI -> NormEnumType -> Value -> Term+jsonToCBOREnum _ _ v = case v of+ String t -> TString t+ _ -> error "serialiseJSONWithSchema: expected string"++jsonToCBORBasic :: BasicType -> Value -> Term+jsonToCBORBasic bt v = case (bt, v) of+ (BTstring, String t) -> TString t+ (BTstring, _) -> error "serialiseJSONWithSchema: expected string"+ (BTbinary, String t) -> case B64.decode $ TE.encodeUtf8 t of+ Left err-> error $ "serialiseJSONWithSchema: base64-decoding failed: " ++ err+ Right bs -> TBytes bs+ (BTbinary, _) -> error "serialiseJSONWithSchema: expected string"+ (BTbool , Bool b) -> TBool b+ (BTbool , _) -> error "serialiseJSONWithSchema: expected bool"+ (BTint , Number n) | Right i <- (floatingOrInteger n :: Either Double Int) -> TInt i+ (BTint , _) -> error "serialiseJSONWithSchema: expected integer"+ (BTutc , String t) ->+ TTagged 1000 (TMap [ (TInt 1, TInt secs)+ , (TInt (-12), TInt psecs) ])+ where -- taken from @Codec.Serialise.Class@:+ (secs, frac) = case properFraction $ utcTimeToPOSIXSeconds utc of+ -- fractional part must be positive+ (secs', frac')+ | frac' < 0 -> (secs' - 1, frac' + 1)+ | otherwise -> (secs', frac')+ psecs = round $ frac * 1000000000000+ utc = fromMaybe (error $ "jsonToCBORBasic: " ++ T.unpack t) $+ parseUTC' t+ (BTutc , _) -> error "serialiseJSONWithSchema: expected string"+++-- | When a JSON value has been deserialised from CBOR, the+-- representation may need some modifications in order to match the+-- result of 'toJSON' on a Haskell datatype. In particular, Aeson's+-- representation of 'Maybe' does not round-trip (because 'Nothing' is+-- encoded as 'Null' and @'Just' x@ as @'toJSON' x@), so CBOR uses a+-- different representation (as an empty or 1-element list).+deserialiseJSONWithSchema :: API -> TypeName -> LBS.ByteString -> Value+deserialiseJSONWithSchema api tn bs = case postprocessJSON api tn (cborToJson (deserialise bs)) of+ Right v -> v+ Left err -> error $ "deserialiseJSONWithSchema could not post-process: " ++ prettyValueError err++postprocessJSON :: API -> TypeName -> Value -> Either ValueError Value+postprocessJSON api = postprocessJSONTypeName (apiNormalForm api)++postprocessJSONTypeName :: NormAPI -> TypeName -> Value -> Either ValueError Value+postprocessJSONTypeName napi tn v = do+ t <- Map.lookup tn napi ?! InvalidAPI (TypeDoesNotExist tn)+ case t of+ NRecordType nrt -> postprocessJSONRecord napi nrt v+ NUnionType nut -> postprocessJSONUnion napi nut v+ NEnumType _ -> pure v+ NTypeSynonym ty -> postprocessJSONType napi ty v+ NNewtype bt -> postprocessJSONType napi (TyBasic bt) v++postprocessJSONType :: NormAPI -> APIType -> Value -> Either ValueError Value+postprocessJSONType napi ty0 v = case ty0 of+ TyList ty -> case v of+ Array arr -> Array <$> traverse (postprocessJSONType napi ty) arr+ _ -> Left $ JSONError $ expectedArray v+ TyMaybe ty -> case v of+ Array arr -> case Vec.toList arr of+ [] -> pure Null+ [v1] -> postprocessJSONType napi ty v1+ _:_:_ -> Left $ JSONError $ SyntaxError "over-long array when converting Maybe value"+ _ -> Left $ JSONError $ expectedArray v+ TyName tn -> postprocessJSONTypeName napi tn v+ TyBasic BTutc -> case v of+ Object obj -> case HMap.toList obj of+ [(k1, Number v0), (km12, Number v1)]+ | T.unpack k1 == "1" && T.unpack km12 == "-12" ->+ -- Taken from @Codec.Serialise.Class@:+ let psecs :: Pico+ psecs = realToFrac v1 / 1000000000000++ dt :: POSIXTime+ dt = realToFrac v0 + realToFrac psecs++ in pure $! String $! mkUTC' $! forceUTCTime (posixSecondsToUTCTime dt)+ _ -> Left $ JSONError UnexpectedField+ String t -> case parseUTC' t of+ Nothing -> Left $ JSONError $ SyntaxError $+ "UTC time in wrong format: " ++ T.unpack t+ Just utcTime -> pure $! String $! mkUTC' $! forceUTCTime utcTime+ _ -> Left $ JSONError $ expectedObject v+ TyBasic _ -> pure v+ TyJSON -> pure v++-- | Force the unnecessarily lazy @'UTCTime'@ representation.+forceUTCTime :: UTCTime -> UTCTime+forceUTCTime t@(UTCTime !_day !_daytime) = t++postprocessJSONRecord :: NormAPI -> NormRecordType -> Value -> Either ValueError Value+postprocessJSONRecord napi nrt v = case v of+ Object hm -> Object <$> HMap.traverseWithKey f hm+ _ -> Left $ JSONError $ expectedObject v+ where+ f t v' = do ty <- Map.lookup (FieldName t) nrt ?! JSONError UnexpectedField+ postprocessJSONType napi ty v'++postprocessJSONUnion :: NormAPI -> NormUnionType -> Value -> Either ValueError Value+postprocessJSONUnion napi nut v = case v of+ Object hm | [(k, r)] <- HMap.toList hm+ , Just ty <- Map.lookup (FieldName k) nut+ -> Object . HMap.singleton k <$> postprocessJSONType napi ty r+ _ -> Left $ JSONError $ expectedObject v
src/Data/API/Markdown.hs view
@@ -3,7 +3,7 @@ -- | This module generates Markdown-formatted documentation for an -- API, like this: ----- > ###Foo+-- > ### Foo -- > -- > a test defn -- >@@ -26,6 +26,7 @@ import qualified Data.CaseInsensitive as CI import Data.Char+import qualified Data.Text as T import Text.Printf import Control.Applicative import Control.Lens@@ -42,7 +43,7 @@ defaultMarkdownMethods :: MarkdownMethods defaultMarkdownMethods = MDM { mdmSummaryPostfix = const ""- , mdmLink = _TypeName+ , mdmLink = T.unpack . _TypeName , mdmPp = (++) , mdmFieldDefault = \ _ _ -> Nothing }@@ -64,7 +65,7 @@ header :: MarkdownMethods -> APINode -> MDComment -> MDComment header mdm an tl_md =- printf "###%s\n\n%s\n\n%s" nm_md (mdmPp mdm cm_md "") tl_md+ printf "### %s\n\n%s\n\n%s" nm_md (mdmPp mdm cm_md "") tl_md where nm_md = type_name_md an cm_md = comment_md an@@ -107,13 +108,13 @@ dhs = (replicate lnx '-',replicate 7 '-') - lnx = maximum $ 0 : map (length . _FieldName . fst) seAlts+ lnx = maximum $ 0 : map (T.length . _FieldName . fst) seAlts rws = map fmt seAlts hdr = ("Enumeration","Comment") - fmt (fn0,ct) = (_FieldName fn0,mdmPp mdm "" $ cln ct)+ fmt (fn0,ct) = (T.unpack (_FieldName fn0), mdmPp mdm "" $ cln ct) cln ct = reverse $ dropWhile isSpace $ reverse $ map tr ct where@@ -143,7 +144,7 @@ fmt (fn0,fty) = ( fn, type_md mdm ty, flg_md, mdmPp mdm "" $ cleanComment ct ) where- fn = _FieldName fn0+ fn = T.unpack (_FieldName fn0) ty = ftType fty ct = ftComment fty @@ -174,7 +175,7 @@ fmt (fn0,(ty,ct)) = ("_" ++ fn ++ "_",type_md mdm ty,mdmPp mdm "" $ cleanComment ct) where- fn = _FieldName fn0+ fn = T.unpack (_FieldName fn0) cleanComment :: MDComment -> MDComment cleanComment ct = reverse $ dropWhile isSpace $ reverse $ map tr ct@@ -220,7 +221,7 @@ BTutc -> "utc" type_name_md, prefix_md, comment_md :: APINode -> MDComment-type_name_md = _TypeName . anName+type_name_md = T.unpack . _TypeName . anName prefix_md = CI.original . anPrefix comment_md = anComment
src/Data/API/NormalForm.hs view
@@ -36,6 +36,7 @@ import Data.API.PP import Data.API.Types +import Control.DeepSeq import Data.Map (Map) import qualified Data.Map as Map import Data.Set (Set)@@ -64,6 +65,13 @@ | NTypeSynonym APIType | NNewtype BasicType deriving (Eq, Show)++instance NFData NormTypeDecl where+ rnf (NRecordType x) = rnf x+ rnf (NUnionType x) = rnf x+ rnf (NEnumType x) = rnf x+ rnf (NTypeSynonym x) = rnf x+ rnf (NNewtype x) = rnf x -- | The canonical form of a record type is a map from fields to -- values...
src/Data/API/PP.hs view
@@ -8,7 +8,7 @@ , indent ) where -import Data.API.JSON+import Data.API.Scan (keywords) import Data.API.Types import qualified Data.Aeson as JS@@ -52,10 +52,13 @@ ppLines v = lines $ BL.unpack $ JS.encodePretty v instance PP TypeName where- pp = _TypeName+ pp = T.unpack . _TypeName instance PP FieldName where- pp = _FieldName+ pp (FieldName fn_t) | fn `elem` keywords = "'" ++ fn ++ "'"+ | otherwise = fn+ where+ fn = T.unpack fn_t instance PP APIType where pp (TyList ty) = "[" ++ pp ty ++ "]"@@ -86,6 +89,3 @@ instance (PPLines s, PPLines t) => PPLines (s, t) where ppLines (s, t) = ppLines s ++ ppLines t--instance PPLines Step where- ppLines s = [prettyStep s]
src/Data/API/Parse.y view
@@ -98,8 +98,8 @@ Node :: { APINode } Node- : Prefix '::' typeiden Comments '=' Spec With- { APINode (TypeName $3) $4 $1 $6 $7 }+ : Prefix '::' TypeName Comments '=' Spec With+ { APINode $3 $4 $1 $6 $7 } Spec :: { Spec } Spec@@ -188,7 +188,7 @@ Type : '?' Type { TyMaybe $2 } | '[' Type ']' { TyList $2 }- | typeiden { TyName (TypeName $1) }+ | TypeName { TyName $1 } | BasicType { TyBasic $1 } | json { TyJSON } @@ -206,7 +206,7 @@ FieldName :: { FieldName } FieldName- : VarIdentifier { FieldName $1 }+ : VarIdentifier { FieldName (T.pack $1) } VarIdentifier :: { String } : variden { $1 }@@ -216,7 +216,7 @@ | to { "to" } TypeName :: { TypeName }- : typeiden { TypeName $1 }+ : typeiden { TypeName (T.pack $1) } APIChangelog :: { APIChangelog } APIChangelog
src/Data/API/Scan.x view
@@ -6,6 +6,7 @@ , PToken , AlexPosn(..) , Token(..)+ , keywords ) where import Data.API.Types@@ -41,8 +42,8 @@ ">=" { simple GtEq } "?" { simple Query } "," { simple Comma }- version { simple Version }- with { simple With } + version { simple Version } -- N.B. extend the 'keywords list below+ with { simple With } -- when adding new keywords! integer { simple Integer } boolean { simple Boolean } utc { simple UTC }@@ -78,6 +79,14 @@ "(*"(\n|[^\*]|\*[^\)])*"*)" { block_comment } {++keywords :: [String]+keywords = [ "version", "with", "integer", "boolean", "utc", "string"+ , "binary", "json", "record", "union", "enum", "basic", "changes"+ , "added", "removed", "renamed", "changed", "default", "field"+ , "alternative", "migration", "to", "nothing", "true", "false"+ , "read-only"+ ] type PToken = (AlexPosn,Token)
src/Data/API/TH.hs view
@@ -9,14 +9,21 @@ , funSigD , simpleD , simpleSigD+ , mkNameText+ , fieldNameE+ , fieldNameVarE+ , typeNameE ) where +import Data.API.TH.Compat import Data.API.Tools.Combinators+import Data.API.Types import Control.Applicative import Control.Monad+import qualified Data.Text as T import Language.Haskell.TH-+import Prelude -- | Construct an idiomatic expression (an expression in an -- Applicative context), i.e.@@ -45,7 +52,7 @@ exists <- isInstance c ts if exists then do when (warnOnOmittedInstance stgs) $ reportWarning $ msg ts return []- else return [InstanceD [] (foldl AppT (ConT c) ts) ds]+ else return [mkInstanceD [] (foldl AppT (ConT c) ts) ds] where msg ts = "instance " ++ pprint c ++ " " ++ pprint ts ++ " already exists, so it was not generated" @@ -61,3 +68,19 @@ -- | Construct a simple TH definition with a type signature simpleSigD :: Name -> TypeQ -> ExpQ -> Q [Dec] simpleSigD n t e = funSigD n t [clause [] (normalB e) []]+++mkNameText :: T.Text -> Name+mkNameText = mkName . T.unpack+++-- | Field name as a string expression+fieldNameE :: FieldName -> ExpQ+fieldNameE = stringE . T.unpack . _FieldName++-- | Field name as a variable+fieldNameVarE :: FieldName -> ExpQ+fieldNameVarE = varE . mkNameText . _FieldName++typeNameE :: TypeName -> ExpQ+typeNameE = stringE . T.unpack . _TypeName
+ src/Data/API/TH/Compat.hs view
@@ -0,0 +1,53 @@+{-# LANGUAGE CPP #-}+module Data.API.TH.Compat where++import Language.Haskell.TH++mkDataD :: Cxt -> Name -> [TyVarBndr] -> [Con] -> [Name] -> Dec+mkDataD cxt1 name tyVarBndrs cons drvs =+#if MIN_VERSION_template_haskell(2,11,0)+ DataD cxt1 name tyVarBndrs Nothing cons (map ConT drvs)+#else+ DataD cxt1 name tyVarBndrs cons drvs+#endif++mkInstanceD :: Cxt -> Type -> [Dec] -> Dec+mkInstanceD =+#if MIN_VERSION_template_haskell(2,11,0)+ InstanceD Nothing+#else+ InstanceD+#endif++mkNewtypeD :: Cxt -> Name -> [TyVarBndr] -> Con -> [Name] -> Dec+mkNewtypeD cxt1 name tyVarBndrs cons drvs =+#if MIN_VERSION_template_haskell(2,11,0)+ NewtypeD cxt1 name tyVarBndrs Nothing cons (map ConT drvs)+#else+ NewtypeD cxt1 name tyVarBndrs cons drvs+#endif++----------------------------------------++type Strictness =+#if MIN_VERSION_template_haskell(2,11,0)+ Bang+#else+ Strict+#endif++annIsStrict :: Strictness+annIsStrict =+#if MIN_VERSION_template_haskell(2,11,0)+ Bang NoSourceUnpackedness SourceStrict+#else+ IsStrict+#endif++annNotStrict :: Strictness+annNotStrict =+#if MIN_VERSION_template_haskell(2,11,0)+ Bang NoSourceUnpackedness NoSourceStrictness+#else+ NotStrict+#endif
src/Data/API/Tools.hs view
@@ -27,7 +27,13 @@ , deepSeqTool , jsonTool , jsonTool'+ , cborTool , jsonTestsTool+ , cborTestsTool+ , cborToJSONTestsTool+ , jsonToCBORTestsTool+ , jsonGenericValueTestsTool+ , cborGenericValueTestsTool , lensTool , quickCheckTool , safeCopyTool@@ -39,6 +45,7 @@ import Data.API.Tools.DeepSeq import Data.API.Tools.Enum import Data.API.Tools.Example+import Data.API.Tools.CBOR import Data.API.Tools.JSON import Data.API.Tools.JSONTests import Data.API.Tools.Lens@@ -46,7 +53,7 @@ import Data.API.Tools.SafeCopy import Data.API.Types -import Data.Monoid+import qualified Data.Monoid as Monoid import Language.Haskell.TH @@ -70,4 +77,4 @@ -- | Apply a list of tools to an 'API', generating TH declarations. -- This form allows the 'ToolSettings' to be overridden. generateAPIToolsWith :: ToolSettings -> API -> [APITool] -> Q [Dec]-generateAPIToolsWith ts api tools = runTool (mconcat tools) ts api+generateAPIToolsWith ts api tools = runTool (Monoid.mconcat tools) ts api
+ src/Data/API/Tools/CBOR.hs view
@@ -0,0 +1,200 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE TemplateHaskell #-}++module Data.API.Tools.CBOR+ ( cborTool+ ) where++import Data.API.TH+import Data.API.Tools.Combinators+import Data.API.Tools.Datatypes+import Data.API.Tools.Enum+import Data.API.Types++import Control.Applicative+import Codec.Serialise.Class+import Codec.Serialise.Decoding+import Codec.Serialise.Encoding+import Data.Binary.Serialise.CBOR.Extra+import Data.List (foldl', sortBy)+import qualified Data.Map as Map+import Data.Monoid+import Data.Ord (comparing)+import qualified Data.Text as T+import Language.Haskell.TH+import Prelude++-- | Tool to generate 'Serialise' instances for types generated by+-- 'datatypesTool'. This depends on 'enumTool'.+cborTool :: APITool+cborTool = apiNodeTool $+ apiSpecTool gen_sn_to gen_sr_to gen_su_to gen_se_to mempty+ <> gen_pr++{-+instance Serialise JobId where+ encode = encode . _JobId+ decode = JobId <$> decode++In this version we don't check the @snFilter@, for simplicity and speed.+This is safe, since the CBOR code is used only internally as a data+representation format, not as a communication format with clients+that could potentially send faulty data.+-}++gen_sn_to :: Tool (APINode, SpecNewtype)+gen_sn_to = mkTool $ \ ts (an, sn) -> optionalInstanceD ts ''Serialise [nodeRepT an]+ [ simpleD 'encode (bdy_in an sn)+ , simpleD 'decode (bdy_out ts an sn)]+ where+ bdy_in an sn = [e| $(ine sn) . $(newtypeProjectionE an) |]+ bdy_out ts an sn = [e| $(nodeNewtypeConE ts an sn) <$> $(oute sn) |]++ ine sn = case snType sn of+ BTstring -> [e| encodeString |]+ BTbinary -> [e| encode |]+ BTbool -> [e| encodeBool |]+ BTint -> [e| encodeInt |]+ BTutc -> [e| encode |]+++ oute sn =+ case snType sn of+ BTstring -> [e| decodeString |]+ BTbinary -> [e| decode |]+ BTbool -> [e| decodeBool |]+ BTint -> [e| decodeInt |]+ BTutc -> [e| decode |]++++{-+instance Serialise JobSpecId where+ encode = \ x ->+ encodeMapLen 4 >>+ encodeRecordFields+ [ encodeString "Id" <> encode (jsiId x)+ , encodeString "Input" <> encode (jsiInput x)+ , encodeString "Output" <> encode (jsiOutput x)+ , encodeString "PipelineId" <> encode (jsiPipelineId x)+ ]+ decode (Record v) =+ decodeMapLen >>+ JobSpecId <$> (decodeString >> decode)+ <*> (decodeString >> decode)+ <*> (decodeString >> decode)+ <*> (decodeString >> decode)++Note that fields are stored alphabetically ordered by field name, so+that we are insensitive to changes in field order in the schema.+-}++gen_sr_to :: Tool (APINode, SpecRecord)+gen_sr_to = mkTool $ \ ts (an, sr) -> do+ x <- newName "x"+ optionalInstanceD ts ''Serialise [nodeRepT an] [ simpleD 'encode (bdy_in an sr x)+ , simpleD 'decode (cl an sr)+ ]+ where+ bdy_in an sr x =+ let fields = sortFields sr+ len = fromIntegral (length fields) -- to Integer+ lenE = varE 'fromIntegral -- to Word+ `appE` (sigE (litE (integerL len))+ (conT ''Integer))+ -- Micro-optimization: we use the statically known @len@ value+ -- instead of creating a list of thunks from the argument of+ -- @encodeRecordFields@ and dynamically calculating+ -- it's length, long before the list is fully forced.+ writeRecordHeader = varE 'encodeMapLen `appE` lenE+ encFields =+ varE 'encodeRecordFields `appE`+ listE [ [e| encodeString $(fieldNameE fn)+ <> encode ($(nodeFieldE an fn) $(varE x)) |]+ | (fn, _fty) <- fields ]+ in lamE [varP x] $+ varE '(<>)+ `appE` writeRecordHeader+ `appE` encFields++ cl an sr = varE '(>>)+ `appE` (varE 'decodeMapLen) -- TODO (extra check): check len with srFields+ `appE` bdy+ where+ sorted_fields = map fst $ sortFields sr+ original_fields = map fst $ srFields sr+ bdy = applicativeE dataCon $ map project sorted_fields+ project _fn = [e| decodeString >> decode |]+ -- TODO (correctness): check that $(fieldNameE fn) matches the decoded name+ -- and if not, use the default value, etc.++ -- If the fields are sorted, just use the data constructor,+ -- but if not, generate a reordering function like+ -- \ _foo_a _foo_b -> Con _foo_b _foo_a+ dataCon | sorted_fields == original_fields = nodeConE an+ | otherwise = lamE (map (nodeFieldP an) sorted_fields)+ (foldl' appE (nodeConE an) (map (nodeFieldE an) original_fields))++ sortFields sr = sortBy (comparing fst) $ srFields sr++{-+instance Serialise Foo where+ encode (Bar x) = encodeUnion "x" x+ encode (Baz x) = object [ "y" .= x ]+ decode = decodeUnion [ ("x", fmap Bar . decode)+ , ("y", fmap Baz . decode) ]++-}++gen_su_to :: Tool (APINode, SpecUnion)+gen_su_to = mkTool $ \ ts (an, su) -> optionalInstanceD ts ''Serialise [nodeRepT an]+ [ funD 'encode (cls an su)+ , simpleD 'decode (bdy_out an su)+ ]+ where+ cls an su = map (cl an) (suFields su)++ cl an (fn, (_ty, _)) = do+ x <- newName "x"+ clause [nodeAltConP an fn [varP x]] (bdy fn x) []++ bdy fn x = normalB [e| encodeUnion $(fieldNameE fn) (encode $(varE x)) |]+++ bdy_out an su = varE 'decodeUnion `appE` listE (map (alt an) (suFields su))++ alt an (fn, _) = [e| ( $(fieldNameE fn) , fmap $(nodeAltConE an fn) decode ) |]+++{-+instance Serialise FrameRate where+ encode = encodeString . _text_FrameRate+ decode = decodeString >>= cborStrMap_p _map_FrameRate+-}++gen_se_to :: Tool (APINode, SpecEnum)+gen_se_to = mkTool $ \ ts (an, _se) -> optionalInstanceD ts ''Serialise [nodeRepT an]+ [ simpleD 'encode (bdy_in an)+ , simpleD 'decode (bdy_out an)+ ]+ where+ bdy_in an = [e| encodeString . $(varE (text_enum_nm an)) |]++ bdy_out an = [e| decodeString >>= cborStrMap_p $(varE (map_enum_nm an)) |]++-- In a monad, to @fail@ instead of crashing with @error@.+cborStrMap_p :: (Monad m, Ord a) => Map.Map T.Text a -> T.Text -> m a+cborStrMap_p mp t = case Map.lookup t mp of+ Nothing -> fail "Unexpected enumeration key in CBOR"+ Just r -> return r+++gen_pr :: Tool APINode+gen_pr = mkTool $ \ ts an -> case anConvert an of+ Nothing -> return []+ Just (inj_fn, prj_fn) -> optionalInstanceD ts ''Serialise [nodeT an] [ simpleD 'encode bdy_in+ , simpleD 'decode bdy_out+ ]+ where+ bdy_in = [e| encode . $(fieldNameVarE prj_fn) |]+ bdy_out = [e| decode >>= $(fieldNameVarE inj_fn) |]
src/Data/API/Tools/Combinators.hs view
@@ -28,6 +28,7 @@ import Control.Applicative import Data.Monoid import Language.Haskell.TH+import Prelude -- | Settings to control the behaviour of API tools. This record may
src/Data/API/Tools/Datatypes.hs view
@@ -1,6 +1,8 @@ {-# LANGUAGE TemplateHaskell #-} module Data.API.Tools.Datatypes ( datatypesTool+ , datatypesTool'+ , defaultDerivedClasses , type_nm , rep_type_nm , nodeT@@ -8,12 +10,14 @@ , nodeConE , nodeNewtypeConE , nodeFieldE+ , nodeFieldP , nodeAltConE , nodeAltConP , newtypeProjectionE ) where import Data.API.TH+import Data.API.TH.Compat import Data.API.Tools.Combinators import Data.API.Types @@ -28,20 +32,26 @@ import Data.Typeable import Language.Haskell.TH import Text.Regex+import Prelude -- | Tool to generate datatypes and type synonyms corresponding to an API datatypesTool :: APITool-datatypesTool = apiNodeTool $ apiSpecTool (mkTool $ uncurry . gen_sn_dt)- (simpleTool $ uncurry gen_sr_dt)- (simpleTool $ uncurry gen_su_dt)- (simpleTool $ uncurry gen_se_dt)- (simpleTool $ uncurry gen_sy)+datatypesTool = datatypesTool' defaultDerivedClasses +-- | Tool to generate datatypes and type synonyms corresponding to an+-- API, where the function specifies the derived classes for each datatype.+datatypesTool' :: (APINode -> [Name]) -> APITool+datatypesTool' deriv = apiNodeTool $ apiSpecTool (mkTool (gen_sn_dt deriv))+ (simpleTool (gen_sr_dt deriv))+ (simpleTool (gen_su_dt deriv))+ (simpleTool (gen_se_dt deriv))+ (simpleTool gen_sy) + -- | Generate a type synonym definition-gen_sy :: APINode -> APIType -> Q [Dec]-gen_sy as ty = return [TySynD (type_nm as) [] $ mk_type ty]+gen_sy :: (APINode, APIType) -> Q [Dec]+gen_sy (as, ty) = return [TySynD (type_nm as) [] $ mk_type ty] -- | Generate a newtype definition, like this:@@ -57,22 +67,15 @@ -- > mkEmailAddress :: T.Text -> Maybe EmailAddress -- > mkEmailAddress t = ... -- check filter -gen_sn_dt :: ToolSettings -> APINode -> SpecNewtype -> Q [Dec]-gen_sn_dt ts as sn = (nd :) <$> if smart then sc else return []+gen_sn_dt :: (APINode -> [Name]) -> ToolSettings -> (APINode, SpecNewtype) -> Q [Dec]+gen_sn_dt deriv ts (as, sn) = (nd :) <$> if smart then sc else return [] where- nd = NewtypeD [] nm [] c $ derive_leaf_nms ++ iss- c = RecC (newtype_con_nm smart as) [(newtype_prj_nm as,NotStrict,wrapped_ty)]+ nd = mkNewtypeD [] nm [] c (deriv as)+ c = RecC (newtype_con_nm smart as) [(newtype_prj_nm as,annNotStrict,wrapped_ty)] wrapped_ty = mk_type $ TyBasic (snType sn) nm = rep_type_nm as - iss = case snType sn of- BTstring -> [''IsString]- BTbinary -> []- BTbool -> []- BTint -> []- BTutc -> []- smart = newtypeSmartConstructors ts && isJust (snFilter sn) sc = simpleSigD (newtype_smart_con_nm as) [t| $(return wrapped_ty) -> Maybe $(nodeRepT as) |] $@@ -98,12 +101,11 @@ -- > } -- > deriving (Show,Eq,Typeable) -gen_sr_dt :: APINode -> SpecRecord -> Q [Dec]-gen_sr_dt as sr = return [DataD [] nm [] cs derive_node_nms] -- [show_nm,eq_nm]+gen_sr_dt :: (APINode -> [Name]) -> (APINode, SpecRecord) -> Q [Dec]+gen_sr_dt deriv (as, sr) = return [mkDataD [] nm [] cs (deriv as)] where- cs = [RecC nm [(pref_field_nm as fnm,IsStrict,mk_type (ftType fty)) |+ cs = [RecC nm [(pref_field_nm as fnm,annIsStrict,mk_type (ftType fty)) | (fnm,fty)<-srFields sr]]- nm = rep_type_nm as @@ -112,12 +114,11 @@ -- > data Foo = F_Bar Int | F_Baz Bool -- > deriving (Show,Typeable) -gen_su_dt :: APINode -> SpecUnion -> Q [Dec]-gen_su_dt as su = return [DataD [] nm [] cs derive_node_nms] -- [show_nm,eq_nm]+gen_su_dt :: (APINode -> [Name]) -> (APINode, SpecUnion) -> Q [Dec]+gen_su_dt deriv (as, su) = return [mkDataD [] nm [] cs (deriv as)] where- cs = [NormalC (pref_con_nm as fnm) [(IsStrict,mk_type ty)] |+ cs = [NormalC (pref_con_nm as fnm) [(annIsStrict,mk_type ty)] | (fnm,(ty,_))<-suFields su]- nm = rep_type_nm as @@ -135,11 +136,10 @@ -- > | FR_60 -- > deriving (Show,Eq,Ord,Bounded,Enum,Typeable) -gen_se_dt :: APINode -> SpecEnum -> Q [Dec]-gen_se_dt as se = return [DataD [] nm [] cs $ derive_leaf_nms ++ [''Bounded, ''Enum]]+gen_se_dt :: (APINode -> [Name]) -> (APINode, SpecEnum) -> Q [Dec]+gen_se_dt deriv (as, se) = return [mkDataD [] nm [] cs (deriv as)] where cs = [NormalC (pref_con_nm as fnm) [] | (fnm,_) <- seAlts se ]- nm = rep_type_nm as @@ -148,7 +148,7 @@ case ty of TyList ty' -> AppT ListT $ mk_type ty' TyMaybe ty' -> AppT (ConT ''Maybe) $ mk_type ty'- TyName nm -> ConT $ mkName $ _TypeName nm+ TyName nm -> ConT $ mkNameText $ _TypeName nm TyBasic bt -> basic_type bt TyJSON -> ConT ''Value @@ -162,6 +162,21 @@ BTutc -> ConT ''UTCTime +-- | Default names of classes for which to derive instances, depending+-- on the type of API node.+defaultDerivedClasses :: APINode -> [Name]+defaultDerivedClasses an = case anSpec an of+ SpNewtype sn -> case snType sn of+ BTstring -> ''IsString : derive_leaf_nms+ BTbinary -> derive_leaf_nms+ BTbool -> derive_leaf_nms+ BTint -> derive_leaf_nms+ BTutc -> derive_leaf_nms+ SpRecord _ -> derive_node_nms+ SpUnion _ -> derive_node_nms+ SpEnum _ -> derive_leaf_nms ++ [''Bounded, ''Enum]+ SpSynonym _ -> []+ derive_leaf_nms :: [Name] derive_leaf_nms = [''Show,''Eq,''Ord,''Typeable] @@ -171,7 +186,7 @@ -- | Name of the type corresponding to the API node, e.g. @JobId@ type_nm :: APINode -> Name-type_nm an = mkName $ _TypeName $ anName an+type_nm an = mkName $ T.unpack $ _TypeName $ anName an -- | Name of the representation type corresponding to the API node, -- which differs from the 'type_nm' only if custom conversion@@ -197,21 +212,21 @@ newtype_smart_con_nm an = mkName $ "mk" ++ rep_type_s an rep_type_s :: APINode -> String-rep_type_s an = f $ _TypeName $ anName an+rep_type_s an = f $ T.unpack $ _TypeName $ anName an where f s = maybe s (const ("REP__"++s)) $ anConvert an -- | Construct the name of a record field by attaching the -- type-specific prefix, in lowercase, e.g. @_jsi_id@ pref_field_nm :: APINode -> FieldName -> Name-pref_field_nm as fnm = mkName $ pre ++ _FieldName fnm+pref_field_nm as fnm = mkName $ pre ++ T.unpack (_FieldName fnm) where pre = "_" ++ map toLower (CI.original $ anPrefix as) ++ "_" -- | Construct the name of a union or enum constructor by attaching -- the type-specific prefix, in uppercase, e.g. @FR_auto@ pref_con_nm :: APINode -> FieldName -> Name-pref_con_nm as fnm = mkName $ pre ++ _FieldName fnm+pref_con_nm as fnm = mkName $ pre ++ T.unpack (_FieldName fnm) where pre = map toUpper (CI.original $ anPrefix as) ++ "_" @@ -235,6 +250,10 @@ -- | A record field in an API node, as an expression nodeFieldE :: APINode -> FieldName -> ExpQ nodeFieldE an fnm = varE $ pref_field_nm an fnm++-- | A record field in an API node, as a pattern+nodeFieldP :: APINode -> FieldName -> PatQ+nodeFieldP an fnm = varP $ pref_field_nm an fnm -- | A prefixed constructor for a union or enum, as an expression nodeAltConE :: APINode -> FieldName -> ExpQ
src/Data/API/Tools/DeepSeq.hs view
@@ -12,6 +12,7 @@ import Control.DeepSeq import Data.Monoid import Language.Haskell.TH+import Prelude -- | Tool to generate 'NFData' instances for generated types.@@ -46,4 +47,6 @@ f (fn,_) = match (nodeAltConP an fn [varP y]) (normalB [e|rnf $(varE y)|]) [] gen_se :: Tool (APINode, SpecEnum)-gen_se = mkTool $ \ ts (an, _) -> optionalInstanceD ts ''NFData [nodeRepT an] []+gen_se = mkTool $ \ ts (an, _) ->+ optionalInstanceD ts ''NFData [nodeRepT an]+ [simpleD 'rnf [e| \ x -> seq x () |] ]
src/Data/API/Tools/Enum.hs view
@@ -45,7 +45,7 @@ -- > FR60 -> "60" text_enum_nm :: APINode -> Name-text_enum_nm an = mkName $ "_text_" ++ (_TypeName $ anName an)+text_enum_nm an = mkName $ "_text_" ++ T.unpack (_TypeName $ anName an) gen_se_tx :: APINode -> SpecEnum -> Q [Dec] gen_se_tx as se = simpleSigD (text_enum_nm as)@@ -59,7 +59,7 @@ pt fnm = nodeAltConP as fnm [] - bd fnm = normalB $ stringE $ _FieldName fnm+ bd fnm = normalB $ stringE $ T.unpack $ _FieldName fnm @@ -70,7 +70,7 @@ -- > _map_FrameRate = genTextMap _text_FrameRate map_enum_nm :: APINode -> Name-map_enum_nm an = mkName $ "_map_" ++ (_TypeName $ anName an)+map_enum_nm an = mkName $ "_map_" ++ T.unpack (_TypeName $ anName an) gen_se_mp :: APINode -> Q [Dec] gen_se_mp as = simpleSigD (map_enum_nm as)
src/Data/API/Tools/Example.hs view
@@ -24,6 +24,7 @@ import Safe import Test.QuickCheck as QC import qualified Data.Text as T+import Prelude -- | The Example class is used to generate a documentation-friendly@@ -79,7 +80,7 @@ gen_sample :: APINode -> ExpQ gen_sample an = [e| ($str, fmap toJSON (example :: Gen $(nodeT an))) |] where- str = stringE $ _TypeName $ anName an+ str = stringE $ T.unpack $ _TypeName $ anName an -- | Tool to generate 'Example' instances for types generated by
src/Data/API/Tools/JSON.hs view
@@ -24,6 +24,7 @@ import Data.Monoid import qualified Data.Text as T import Language.Haskell.TH+import Prelude -- | Tool to generate 'ToJSON' and 'FromJSONWithErrs' instances for@@ -220,7 +221,7 @@ where bdy = do x <- newName "x" lamE [varP x] [e| parseJSONWithErrs $(varE x) >>= $inj |]- inj = varE $ mkName $ _FieldName inj_fn+ inj = fieldNameVarE inj_fn gen_pr :: Tool APINode@@ -229,7 +230,7 @@ Just (_, prj_fn) -> optionalInstanceD ts ''ToJSON [nodeT an] [simpleD 'toJSON bdy] where bdy = [e| toJSON . $prj |]- prj = varE $ mkName $ _FieldName prj_fn+ prj = fieldNameVarE prj_fn -- | Generate 'FromJSON' instances like this:@@ -260,10 +261,3 @@ json_string_p xs p (String t) | Just val <- p t = pure val | otherwise = failWith $ UnexpectedEnumVal xs t json_string_p _ _ v = failWith $ expectedString v---fieldNameE :: FieldName -> ExpQ-fieldNameE = stringE . _FieldName--typeNameE :: TypeName -> ExpQ-typeNameE = stringE . _TypeName
src/Data/API/Tools/JSONTests.hs view
@@ -1,44 +1,112 @@ {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE QuasiQuotes #-}+{-# LANGUAGE BangPatterns #-} -- Here we use Template Haskell to generate a test suite for the Aeson wrappers -- from the DSL description of same. module Data.API.Tools.JSONTests- ( jsonTestsTool+ ( -- * Tools+ jsonTestsTool+ , cborTestsTool+ , cborToJSONTestsTool+ , jsonToCBORTestsTool+ , jsonGenericValueTestsTool+ , cborGenericValueTestsTool++ -- * Properties , prop_decodesTo , prop_decodesTo' , prop_resultsMatchRoundtrip+ , prop_cborRoundtrip+ , prop_cborToJSON+ , prop_jsonToCBOR ) where import Data.API.JSON+import Data.API.JSONToCBOR import Data.API.Tools.Combinators import Data.API.Tools.Datatypes import Data.API.TH import Data.API.Types+import Data.API.Value import qualified Data.Aeson as JS+import Codec.Serialise+import Data.Binary.Serialise.CBOR.JSON () import Language.Haskell.TH import Test.QuickCheck+import Test.QuickCheck.Property as QCProperty+import Prelude --- | Tool to generate a list of tests of type @[('String', 'Property')]@--- with the given name. This depends on 'jsonTool' and 'quickCheckTool'.+-- | Tool to generate a list of JSON round-trip tests of type+-- @[('String', 'Property')]@ with the given name. This depends on+-- 'jsonTool' and 'quickCheckTool'. jsonTestsTool :: Name -> APITool-jsonTestsTool nm = simpleTool $ \ api -> simpleSigD nm [t| [(String, Property)] |] (props api)+jsonTestsTool = testsTool 'prop_resultsMatchRoundtrip++-- | Tool to generate a list of CBOR round-trip tests of type+-- @[('String', 'Property')]@ with the given name. This depends on+-- 'cborTool' and 'quickCheckTool'.+cborTestsTool :: Name -> APITool+cborTestsTool = testsTool 'prop_cborRoundtrip++-- | Tool to generate a list of tests of type @[('String', 'Property')]@+-- based on instantiating the first argument at type @A -> Bool@ for each+-- type @A@ in the API. The second argument is the name of the declaration+-- that should be produced.+testsTool :: Name -> Name -> APITool+testsTool prop_nm nm = simpleTool $ \ api -> simpleSigD nm [t| [(String, Property)] |] (props api) where- props api = listE $ map generateProp [ an | ThNode an <- api ]+ props api = listE $ map (generateProp prop_nm) [ an | ThNode an <- api ] -- | For an APINode, generate a (String, Property) pair giving the--- type name and an appropriate instance of the--- prop_resultsMatchRoundtrip property-generateProp :: APINode -> ExpQ-generateProp an = [e| ($ty, property (prop_resultsMatchRoundtrip :: $(nodeT an) -> Bool)) |]+-- type name and an appropriate instance of the property+generateProp :: Name -> APINode -> ExpQ+generateProp prop_nm an = [e| ($ty, property ($(varE prop_nm) :: $(nodeT an) -> Bool)) |] where- ty = stringE $ _TypeName $ anName an+ ty = typeNameE $ anName an +-- | Tool to generate a list of CBOR-to-JSON conversion tests of type+-- @[('String', 'Property')]@. The first name must be the 'API' being+-- tested, and the second should be the name of the declaration to be+-- produced. This depends on 'cborTool', 'jsonTool' and 'quickCheckTool'.+cborToJSONTestsTool :: Name -> Name -> APITool+cborToJSONTestsTool = schemaTestsTool 'prop_cborToJSON++-- | Tool to generate a list of JSON-to-CBOR conversion tests of type+-- @[('String', 'Property')]@. The first name must be the 'API' being+-- tested, and the second should be the name of the declaration to be+-- produced. This depends on 'cborTool', 'jsonTool' and 'quickCheckTool'.+jsonToCBORTestsTool :: Name -> Name -> APITool+jsonToCBORTestsTool = schemaTestsTool 'prop_jsonToCBOR++-- | Tool to generate a list of tests that the 'JS.Value' generic+-- representation agrees with the type-specific JSON representation.+jsonGenericValueTestsTool :: Name -> Name -> APITool+jsonGenericValueTestsTool = schemaTestsTool 'prop_jsonGeneric++-- | Tool to generate a list of tests that the 'Value' generic+-- representation agrees with the type-specific CBOR representation.+cborGenericValueTestsTool :: Name -> Name -> APITool+cborGenericValueTestsTool = schemaTestsTool 'prop_cborGeneric++-- | Tool to generate a list of tests of properties that take the API+-- and the type name as arguments, and return a 'QCProperty.Result'.+schemaTestsTool :: Name -> Name -> Name -> APITool+schemaTestsTool prop_nm api_nm nm = simpleTool $ \ api -> simpleSigD nm [t| [(String, Property)] |] (props api)+ where+ props api = listE $ map genProp [ an | ThNode an <- api ]++ genProp an = [e| ($ty, property ($(varE prop_nm) $(varE api_nm) tn :: $(nodeT an) -> QCProperty.Result)) |]+ where+ tn = anName an+ ty = typeNameE $ anName an++ -- | QuickCheck property that a 'Value' decodes to an expected Haskell -- value, using 'fromJSONWithErrs' prop_decodesTo :: forall a . (Eq a, FromJSONWithErrs a)@@ -61,3 +129,40 @@ prop_resultsMatchRoundtrip :: forall a . (Eq a, JS.ToJSON a, FromJSONWithErrs a ) => a -> Bool prop_resultsMatchRoundtrip x = prop_decodesTo (JS.toJSON x) x++-- | QuickCheck property that CBOR decoding is a left inverse for encoding+prop_cborRoundtrip :: forall a . (Eq a, Serialise a)+ => a -> Bool+prop_cborRoundtrip x = deserialise (serialise x) == x++-- | QuickCheck property that 'toJSON' agrees with encoding to CBOR+-- directly and then decoding using the schema-aware generic decoder.+-- From this and 'prop_resultsMatchRoundtrip' it follows that+--+-- > fromJSONWithErrs . deserialiseJSONWithSchema . serialise == id+prop_cborToJSON :: forall a . (Eq a, Serialise a, JS.ToJSON a)+ => API -> TypeName -> a -> QCProperty.Result+prop_cborToJSON api tn x+ | v1 == v2 = succeeded+ | otherwise = failed { QCProperty.reason = "Post-processed: " ++ show v1+ ++ "\nDirect JSON: " ++ show v2 }+ where+ v1 = deserialiseJSONWithSchema api tn (serialise x)+ v2 = JS.toJSON x++-- | QuickCheck property that direct encoding to CBOR agrees with+-- conversion to JSON followed by the schema-aware generic encoder.+-- From this and 'prop_cborRoundtrip' it follows that+--+-- > deserialise . serialiseJSONWithSchema . toJSON == id+prop_jsonToCBOR :: forall a . (Eq a, Serialise a, JS.ToJSON a)+ => API -> TypeName -> a -> QCProperty.Result+prop_jsonToCBOR api tn x+ | e1 == e2 = succeeded+ | otherwise = failed { QCProperty.reason = "Failed with JSON: " ++ show v+ ++ "\nGeneric serialisation: " ++ show e1+ ++ "\nDirect serialisation: " ++ show e2 }+ where+ v = JS.toJSON x+ e1 = serialiseJSONWithSchema api tn v+ e2 = serialise x
src/Data/API/Tools/QuickCheck.hs view
@@ -18,6 +18,7 @@ import Language.Haskell.TH import Safe import Test.QuickCheck as QC+import Prelude -- | Tool to generate 'Arbitrary' instances for generated types.@@ -110,6 +111,7 @@ arbitraryUTCRange (UTCRange Nothing Nothing ) = QC.arbitrary -- TODO: use a more arbitrary instance (quickcheck-instances?)+-- (in particular, there are no subsecond-resolution times here) instance QC.Arbitrary UTCTime where arbitrary = QC.elements [ mk "2010-01-01T00:00:00Z"@@ -119,6 +121,8 @@ , mk "2009-11-12T20:57:54Z" , mk "2000-10-28T21:03:24Z" , mk "1965-03-10T09:23:01Z"+ -- , mk "1965-03-10T09:23:01.001Z"+ -- , mk "1965-03-10T09:23:01.000001Z" ] where mk = fromJustNote lab . parseUTC'
src/Data/API/Tools/SafeCopy.hs view
@@ -1,5 +1,4 @@ {-# LANGUAGE TemplateHaskell #-}-{-# OPTIONS_GHC -fno-warn-orphans #-} module Data.API.Tools.SafeCopy ( safeCopyTool@@ -7,7 +6,6 @@ import Data.API.Tools.Combinators import Data.API.Tools.Datatypes-import Data.API.Types import Data.SafeCopy @@ -16,5 +14,3 @@ -- present, this derives only base version instances. safeCopyTool :: APITool safeCopyTool = apiDataTypeTool $ simpleTool $ deriveSafeCopy 0 'base . rep_type_nm--$(deriveSafeCopy 0 'base ''Binary)
src/Data/API/Tools/Traversal.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE TemplateHaskell #-} @@ -16,8 +17,10 @@ import Data.Maybe import Data.Monoid import qualified Data.Set as Set+import qualified Data.Text as T import Data.Traversable import Language.Haskell.TH+import Prelude -- | Build a traversal of the root type (first argument) that updates@@ -53,14 +56,14 @@ -- | @traversalName x tn@ is the name of the function that traverses -- @x@ values inside @tn@ traversalName :: TypeName -> TypeName -> Name-traversalName x tn = mkName $ "traverse" ++ _TypeName x ++ _TypeName tn+traversalName x tn = mkNameText $ "traverse" <> _TypeName x <> _TypeName tn -- | @traversalType x an@ is the type of the function that traverses -- @x@ values inside @an@ traversalType :: TypeName -> APINode -> TypeQ traversalType x an = [t| forall f . Applicative f => ($x' -> f $x') -> $ty -> f $ty |] where- x' = conT $ mkName $ _TypeName x+ x' = conT $ mkNameText $ _TypeName x ty = nodeT an @@ -77,7 +80,7 @@ | tn == x = Just [e| id |] | not (tn `Set.member` targets) = Nothing | otherwise = case Map.lookup tn napi of- Nothing -> error $ "missing API type declaration: " ++ _TypeName tn+ Nothing -> error $ "missing API type declaration: " ++ T.unpack (_TypeName tn) Just (NTypeSynonym ty) -> traverser' napi targets x ty Just (NRecordType _) -> Just $ varE $ traversalName x tn Just (NUnionType _) -> Just $ varE $ traversalName x tn
src/Data/API/Tutorial.hs view
@@ -6,12 +6,18 @@ -- * The api DSL -- $api - -- ** Generating types for an API+ -- * Generating types for an API -- $generate + -- ** Custom representation types+ -- $with+ -- * Generating tools for an API -- $tools + -- ** Custom API tools+ -- $custom-tools+ -- * Data migration -- $migration @@ -29,6 +35,7 @@ import Data.API.JSON import Data.API.Parse import Data.API.Tools+import Data.API.Tools.Combinators import Data.API.Types import Data.Text@@ -128,6 +135,38 @@ -} +{- $with++For some types, it may be desirable to use a different datatype in the+Haskell code, rather than relying on the generated datatype. For+example, this allows collection types (such as sets) to be used in+place of lists, or allows additional invariants to be enforced. The+JSON serialization agrees with the schema (so the difference is+invisible to non-Haskell clients). This is possible using a @with@+clause in the schema DSL, which follows the type declaration and gives+the names of a pair of conversion functions, like this:++> i :: IDSet+> = record+> ids :: [ID]+> with inj_IDSet, prj_IDSet++When a @with@ clause is used, the usual generated type (the+representation type) will be given a @REP__@ prefix, so in this case+'generate' will produce:++> data REP__IDSet = REP__IDSet { _i_ids :: [ID] }++The Haskell code accompanying the call to 'generate' should define a+type called @IDSet@, and functions+@inj_IDSet :: 'Monad' m => REP__IDSet -> m IDSet@ and+@prj_IDSet :: IDSet -> REP__IDSet@, which will be used when converting+to and from JSON. The monadic type allows parsing to 'fail' if+the representation type uses a value that is not permitted, but+converting back must be a pure function.++-}+ {- $tools Once the Haskell datatypes have been created by 'generate', additional@@ -159,6 +198,26 @@ will lead to errors about undefined symbols @_text_MyEnum@ and @_map_MyEnum@ in the generated code.++-}++{- $custom-tools++An 'APITool' is essentially just a function that consumes an 'API' and+produces some Template Haskell declarations. More generally, a+@'Tool' a@ consumes a value of type @a@ and generates some+declarations. The utilities in "Data.API.Tools.Combinators" make it+slightly more convenient to construct such things. In particular, you+can use @'apiNodeTool' ('apiSpecTool' n r u e t)@ to build a tool that+consumes an 'API' out of tools that explain what to do for newtypes,+records, unions, enumerations and type synonyms respectively.++Typically, tools generate declarations or class instances based on+each different node in the API. These generated declarations work with+the datatypes generated by 'datatypesTool'. The module+"Data.API.Tools.Datatypes" provides functions to turn 'APINode's and+their components into Template Haskell references to the generated+datatypes. -}
src/Data/API/Types.hs view
@@ -1,10 +1,9 @@+{-# LANGUAGE BangPatterns #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TemplateHaskell #-}-{-# OPTIONS_GHC -fno-warn-orphans #-} - module Data.API.Types ( API , Thing(..)@@ -32,6 +31,7 @@ , mkRegEx , inIntRange , inUTCRange+ , base64ToBinary ) where import Data.API.Utils@@ -43,7 +43,9 @@ import Data.Aeson import Data.Aeson.Types import Data.Aeson.TH+import qualified Codec.Serialise as CBOR import Data.Maybe+import Data.SafeCopy import qualified Data.Text as T import qualified Data.Text.Encoding as T import qualified Data.ByteString.Char8 as B@@ -53,6 +55,7 @@ import Language.Haskell.TH import Language.Haskell.TH.Syntax import Text.Regex+import Prelude -- | an API spec is made up of a list of type/element specs, each@@ -63,8 +66,12 @@ data Thing = ThComment MDComment | ThNode APINode- deriving (Show)+ deriving (Eq,Show) +instance NFData Thing where+ rnf (ThComment x) = rnf x+ rnf (ThNode x) = rnf x+ -- | Specifies an individual element/type of the API data APINode@@ -75,20 +82,21 @@ , anSpec :: Spec -- ^ the type specification , anConvert :: Conversion -- ^ optional conversion functions }- deriving (Show)+ deriving (Eq,Show) --- | TypeName must contain a valid Haskell type constructor+instance NFData APINode where+ rnf (APINode a b c d e) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d `seq` rnf e -newtype TypeName = TypeName { _TypeName :: String }- deriving (Eq, Ord,Show, IsString)+-- | TypeName must contain a valid Haskell type constructor+newtype TypeName = TypeName { _TypeName :: T.Text }+ deriving (Eq, Ord, Show, NFData, IsString) -- | FieldName identifies recod fields and union alternatives -- must contain a valid identifier valid in Haskell and -- any API client wrappers (e.g., if Ruby wrappers are to be -- generated the names should easily map into Ruby)--newtype FieldName = FieldName { _FieldName :: String }- deriving (Show,Eq,Ord,IsString)+newtype FieldName = FieldName { _FieldName :: T.Text }+ deriving (Eq, Ord, Show, NFData, IsString) -- | Markdown comments are represented by strings @@ -112,8 +120,15 @@ | SpUnion SpecUnion | SpEnum SpecEnum | SpSynonym APIType- deriving (Show)+ deriving (Eq,Show) +instance NFData Spec where+ rnf (SpNewtype x) = rnf x+ rnf (SpRecord x) = rnf x+ rnf (SpUnion x) = rnf x+ rnf (SpEnum x) = rnf x+ rnf (SpSynonym x) = rnf x+ -- | SpecNewtype elements are isomorphisms of string, inetgers or booleans data SpecNewtype =@@ -121,14 +136,22 @@ { snType :: BasicType , snFilter :: Maybe Filter }- deriving (Show)+ deriving (Eq,Show) +instance NFData SpecNewtype where+ rnf (SpecNewtype x y) = rnf x `seq` rnf y+ data Filter = FtrStrg RegEx | FtrIntg IntRange | FtrUTC UTCRange- deriving (Show)+ deriving (Eq,Show) +instance NFData Filter where+ rnf (FtrStrg x) = rnf x+ rnf (FtrIntg x) = rnf x+ rnf (FtrUTC x) = rnf x+ data IntRange = IntRange { ir_lo :: Maybe Int@@ -136,8 +159,8 @@ } deriving (Eq, Show) -instance Lift IntRange where- lift (IntRange lo hi) = [e| IntRange lo hi |]+instance NFData IntRange where+ rnf (IntRange x y) = rnf x `seq` rnf y inIntRange :: Int -> IntRange -> Bool _ `inIntRange` IntRange Nothing Nothing = True@@ -152,15 +175,8 @@ } deriving (Eq, Show) -instance Lift UTCRange where- lift (UTCRange lo hi) = [e| UTCRange $(liftMaybeUTCTime lo) $(liftMaybeUTCTime hi) |]--liftUTC :: UTCTime -> ExpQ-liftUTC u = [e| fromMaybe (error "liftUTC") (parseUTC_ $(stringE (mkUTC_ u))) |]--liftMaybeUTCTime :: Maybe UTCTime -> ExpQ-liftMaybeUTCTime Nothing = [e| Nothing |]-liftMaybeUTCTime (Just u) = [e| Just $(liftUTC u) |]+instance NFData UTCRange where+ rnf (UTCRange x y) = rnf x `seq` rnf y inUTCRange :: UTCTime -> UTCRange -> Bool _ `inUTCRange` UTCRange Nothing Nothing = True@@ -178,6 +194,9 @@ mkRegEx :: T.Text -> RegEx mkRegEx txt = RegEx txt $ mkRegexWithOpts (T.unpack txt) False True +instance NFData RegEx where+ rnf (RegEx x !_) = rnf x+ instance ToJSON RegEx where toJSON RegEx{..} = String re_text @@ -190,16 +209,16 @@ instance Show RegEx where show = T.unpack . re_text -instance Lift RegEx where- lift re = [e| mkRegEx $(stringE (T.unpack (re_text re))) |]- -- | SpecRecord is your classsic product type. data SpecRecord = SpecRecord { srFields :: [(FieldName, FieldType)] }- deriving (Show)+ deriving (Eq,Show) +instance NFData SpecRecord where+ rnf (SpecRecord x) = rnf x+ -- | In addition to the type and comment, record fields may carry a -- flag indicating that they are read-only, and may have a default -- value, which must be of a compatible type.@@ -210,24 +229,34 @@ , ftDefault :: Maybe DefaultValue , ftComment :: MDComment }- deriving (Show)+ deriving (Eq,Show) +instance NFData FieldType where+ rnf (FieldType a b c d) = rnf a `seq` rnf b `seq` rnf c `seq` rnf d+ -- | SpecUnion is your classsic union type data SpecUnion = SpecUnion { suFields :: [(FieldName,(APIType,MDComment))] }- deriving (Show)+ deriving (Eq,Show) +instance NFData SpecUnion where+ rnf (SpecUnion x) = rnf x+ -- | SpecEnum is your classic enumerated type data SpecEnum = SpecEnum { seAlts :: [(FieldName,MDComment)] }- deriving (Show)+ deriving (Eq,Show) --- Conversion possibly converts to an internal representation+instance NFData SpecEnum where+ rnf (SpecEnum x) = rnf x +-- | Conversion possibly converts to an internal representation. If+-- specified, a conversion is a pair of an injection function name and+-- a projection function name. type Conversion = Maybe (FieldName,FieldName) -- | Type is either a list, Maybe, a named element of the API or a basic type@@ -243,6 +272,13 @@ instance IsString APIType where fromString = TyName . fromString +instance NFData APIType where+ rnf (TyList ty) = rnf ty+ rnf (TyMaybe ty) = rnf ty+ rnf (TyName tn) = rnf tn+ rnf (TyBasic bt) = rnf bt+ rnf TyJSON = ()+ -- | the basic JSON types (N.B., no floating point numbers, yet) data BasicType = BTstring -- ^ a JSON UTF-8 string@@ -252,6 +288,9 @@ | BTutc -- ^ a JSON UTC string deriving (Eq, Show) +instance NFData BasicType where+ rnf !_ = ()+ -- | A default value for a field data DefaultValue = DefValList@@ -262,13 +301,13 @@ | DefValUtc UTCTime deriving (Eq, Show) -instance Lift DefaultValue where- lift DefValList = [e| DefValList |]- lift DefValMaybe = [e| DefValMaybe |]- lift (DefValString s) = [e| DefValString (T.pack $(lift (T.unpack s))) |]- lift (DefValBool b) = [e| DefValBool b |]- lift (DefValInt i) = [e| DefValInt i |]- lift (DefValUtc u) = [e| DefValUtc $(liftUTC u) |]+instance NFData DefaultValue where+ rnf DefValList = ()+ rnf DefValMaybe = ()+ rnf (DefValString t) = rnf t+ rnf (DefValBool b) = rnf b+ rnf (DefValInt i) = rnf i+ rnf (DefValUtc u) = rnf u -- | Convert a default value to an Aeson 'Value'. This differs from -- 'toJSON' as it will not round-trip with 'fromJSON': UTC default@@ -285,7 +324,7 @@ -- | Binary data is represented in JSON format as a base64-encoded -- string newtype Binary = Binary { _Binary :: B.ByteString }- deriving (Show,Eq,Ord,NFData)+ deriving (Show,Eq,Ord,NFData,CBOR.Serialise) instance ToJSON Binary where toJSON = String . T.decodeLatin1 . B64.encode . _Binary@@ -303,11 +342,15 @@ withBinary lab f = withText lab g where g t =- case B64.decode $ T.encodeUtf8 t of+ case base64ToBinary t of Left _ -> typeMismatch lab (String t)- Right bs -> f $ Binary bs+ Right bs -> f bs +base64ToBinary :: T.Text -> Either String Binary+base64ToBinary t = Binary <$> B64.decode (T.encodeUtf8 t) +$(deriveSafeCopy 0 'base ''Binary)+ deriveJSON defaultOptions ''Thing deriveJSON defaultOptions ''APINode deriveJSON defaultOptions ''TypeName@@ -325,3 +368,85 @@ deriveJSON defaultOptions ''UTCRange deriveJSON defaultOptions ''BasicType deriveJSON defaultOptions ''CI.CI+++instance Lift Thing where+ lift (ThComment c) = [e| ThComment c |]+ lift (ThNode n) = [e| ThNode n |]++instance Lift APINode where+ lift (APINode a b c d e) = [e| APINode a b $(liftPrefix c) d e |]++liftPrefix :: Prefix -> ExpQ+liftPrefix ci = let s = CI.original ci in [e| CI.mk s |]++instance Lift TypeName where+ lift (TypeName s) = [e| TypeName $(litE (stringL (T.unpack s))) |]++instance Lift FieldName where+ lift (FieldName s) = [e| FieldName $(litE (stringL (T.unpack s))) |]++instance Lift Spec where+ lift (SpNewtype s) = [e| SpNewtype s |]+ lift (SpRecord s) = [e| SpRecord s |]+ lift (SpUnion s) = [e| SpUnion s |]+ lift (SpEnum s) = [e| SpEnum s |]+ lift (SpSynonym s) = [e| SpSynonym s |]++instance Lift SpecNewtype where+ lift (SpecNewtype a b) = [e| SpecNewtype a b |]++instance Lift Filter where+ lift (FtrStrg re) = [e| FtrStrg re |]+ lift (FtrIntg ir) = [e| FtrIntg ir |]+ lift (FtrUTC ur) = [e| FtrUTC ur |]++instance Lift IntRange where+ lift (IntRange lo hi) = [e| IntRange lo hi |]++instance Lift UTCRange where+ lift (UTCRange lo hi) = [e| UTCRange $(liftMaybeUTCTime lo) $(liftMaybeUTCTime hi) |]++liftUTC :: UTCTime -> ExpQ+liftUTC u = [e| fromMaybe (error "liftUTC") (parseUTC_ $(stringE (mkUTC_ u))) |]++liftMaybeUTCTime :: Maybe UTCTime -> ExpQ+liftMaybeUTCTime Nothing = [e| Nothing |]+liftMaybeUTCTime (Just u) = [e| Just $(liftUTC u) |]++instance Lift RegEx where+ lift re = [e| mkRegEx $(stringE (T.unpack (re_text re))) |]++instance Lift SpecRecord where+ lift (SpecRecord s) = [e| SpecRecord s |]++instance Lift FieldType where+ lift (FieldType a b c d) = [e| FieldType a b c d |]++instance Lift SpecUnion where+ lift (SpecUnion s) = [e| SpecUnion s |]++instance Lift SpecEnum where+ lift (SpecEnum s) = [e| SpecEnum s |]++instance Lift APIType where+ lift (TyList t) = [e| TyList t |]+ lift (TyMaybe t) = [e| TyMaybe t |]+ lift (TyName t) = [e| TyName t |]+ lift (TyBasic t) = [e| TyBasic t |]+ lift TyJSON = [e| TyJSON |]++instance Lift BasicType where+ lift BTstring = [e| BTstring |]+ lift BTbinary = [e| BTbinary |]+ lift BTbool = [e| BTbool |]+ lift BTint = [e| BTint |]+ lift BTutc = [e| BTutc |]++instance Lift DefaultValue where+ lift DefValList = [e| DefValList |]+ lift DefValMaybe = [e| DefValMaybe |]+ lift (DefValString s) = [e| DefValString (T.pack $(lift (T.unpack s))) |]+ lift (DefValBool b) = [e| DefValBool b |]+ lift (DefValInt i) = [e| DefValInt i |]+ lift (DefValUtc u) = [e| DefValUtc $(liftUTC u) |]
src/Data/API/Utils.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} module Data.API.Utils ( mkUTC , mkUTC'@@ -6,15 +7,26 @@ , parseUTC_ , (?!) , (?!?)+ -- * Utils for merging and diffing maps+ , MergeResult(..)+ , mergeMaps+ , diffMaps+ , matchMaps ) where import Data.Aeson+import Data.Map ( Map )+import qualified Data.Map as Map import Data.Maybe import qualified Data.Text as T import Data.Time-import System.Locale +#if MIN_VERSION_time(1,5,0)+#else+import System.Locale (defaultTimeLocale)+#endif + mkUTC :: UTCTime -> Value mkUTC = String . mkUTC' @@ -53,3 +65,30 @@ (?!?) :: Either e a -> (e -> e') -> Either e' a Left e ?!? f = Left (f e) Right x ?!? _ = Right x+++-------------------------------------+-- Utils for merging and diffing maps+--++data MergeResult a b = OnlyInLeft a | InBoth a b | OnlyInRight b+ deriving (Eq, Show)++mergeMaps :: Ord k => Map k a -> Map k b -> Map k (MergeResult a b)+mergeMaps m1 m2 = Map.unionWith (\(OnlyInLeft a) (OnlyInRight b) -> InBoth a b)+ (fmap OnlyInLeft m1) (fmap OnlyInRight m2)++diffMaps :: (Eq a, Ord k) => Map k a -> Map k a -> Map k (MergeResult a a)+diffMaps m1 m2 = Map.filter different $ mergeMaps m1 m2+ where+ different (InBoth a b) = a /= b+ different _ = True++-- | Attempts to match the keys of the maps to produce a map from keys+-- to pairs.+matchMaps :: Ord k => Map k a -> Map k b -> Either (k, Either a b) (Map k (a, b))+matchMaps m1 m2 = Map.traverseWithKey win $ mergeMaps m1 m2+ where+ win _ (InBoth x y) = return (x, y)+ win k (OnlyInLeft x) = Left (k, Left x)+ win k (OnlyInRight x) = Left (k, Right x)
+ src/Data/API/Value.hs view
@@ -0,0 +1,532 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE CPP #-}++-- | This module defines a generic representation of values belonging+-- to a schema, for use during data migration.+module Data.API.Value+ ( -- * Types+ Value(..)+ , Record+ , Field(..)++ -- * Converting to and from generic values+ , fromDefaultValue+ , fromJSON+ , parseJSON+ , encode+ , decode++ -- * Data validation+ , matchesNormAPI+ , expectRecord+ , expectEnum+ , expectUnion+ , expectList+ , expectMaybe+ , lookupType++ -- * Manipulating records+ , recordToMap+ , mapToRecord+ , insertField+ , renameField+ , deleteField+ , findField+ , joinRecords++ -- * QuickCheck test infrastructure+ , arbitrary+ , arbitraryOfType+ , arbitraryJSONValue+ , prop_jsonRoundTrip+ , prop_jsonGeneric+ , prop_cborRoundTrip+ , prop_cborGeneric+ ) where++import Data.API.Error+import Data.API.JSON+import Data.API.NormalForm+import Data.API.Types+import Data.API.Utils++import Control.Applicative+import Control.Monad+import Control.DeepSeq+import qualified Data.Aeson as JS+import qualified Codec.Serialise as CBOR+import qualified Codec.Serialise.Decoding as CBOR+import qualified Codec.Serialise.Encoding as CBOR+import Data.Binary.Serialise.CBOR.Extra+import qualified Codec.CBOR.FlatTerm as CBOR+import Data.Binary.Serialise.CBOR.JSON+import qualified Data.HashMap.Strict as HMap+import Data.List (sortBy)+import qualified Data.Map.Strict as Map+import Data.Monoid+import Data.Ord+import qualified Data.Set as Set+import qualified Data.Text as T+import Data.Traversable+import Data.Time (NominalDiffTime, UTCTime)+import Data.Time.Clock.POSIX (posixSecondsToUTCTime)+import qualified Data.Vector as V+import qualified Test.QuickCheck as QC+import qualified Test.QuickCheck.Property as QCP+import Prelude+++-- | Generic representation of a data value belonging to a schema+-- type. This representation has the following properties:+--+-- * it is straightforward to convert into either CBOR or JSON;+--+-- * decoding CBOR or parsing JSON requires the schema, and takes+-- advantage of it by introducing type distinctions and interning+-- field names;+--+-- * decoding CBOR is relatively efficient.+data Value = String !T.Text+ | UTCTime !UTCTime+ | Bytes !Binary+ | Bool !Bool+ | Int !Int+ | List ![Value]+ | Maybe !(Maybe Value)+ | Union !FieldName !Value+ | Enum !FieldName+ | Record !Record+ | JSON !JS.Value+ deriving (Eq, Show)++-- | A record is represented as a list of (field name, value) pairs.+--+-- Invariant: these are in ascending order by field name, and there+-- are no duplicates.+--+-- TODO: consider if it would be worth using 'Map.Map' instead.+type Record = [Field]++data Field = Field { fieldName :: FieldName+ , fieldValue :: Value+ }+ deriving (Eq, Show)++instance NFData Value where+ rnf (String t) = rnf t+ rnf (UTCTime t) = rnf t+ rnf (Bytes b) = rnf b+ rnf (Bool b) = rnf b+ rnf (Int i) = rnf i+ rnf (List xs) = rnf xs+ rnf (Maybe mb) = rnf mb+ rnf (Union fn v) = rnf fn `seq` rnf v+ rnf (Enum fn) = rnf fn+ rnf (Record xs) = rnf xs+ rnf (JSON v) = rnf v++instance NFData Field where+ rnf (Field x y) = rnf x `seq` rnf y+++-- | Convert a 'DefaultValue' into a generic 'Value', failing if the+-- type is not compatible. This requires type information so that it+-- can introduce type distinctions absent in 'DefaultValue', e.g. when+-- 'DefValList' is used at type @'TyMaybe' ('TyList' t)@.+fromDefaultValue :: NormAPI -> APIType -> DefaultValue -> Maybe Value+fromDefaultValue api ty0 dv = case (ty0, dv) of+ (TyList _, DefValList) -> pure (List [])+ (TyMaybe _, DefValMaybe) -> pure (Maybe Nothing)+ (TyMaybe ty, _) -> Maybe . Just <$> fromDefaultValue api ty dv+ (TyBasic bt, _) -> fromDefaultValueBasic bt dv+ (TyJSON, _) -> pure (JSON (defaultValueAsJsValue dv))+ (TyName tname, _) -> do d <- Map.lookup tname api+ case d of+ NTypeSynonym ty -> fromDefaultValue api ty dv+ NNewtype bt -> fromDefaultValueBasic bt dv+ NEnumType vals | DefValString s <- dv+ , FieldName s `Set.member` vals+ -> pure (Enum (FieldName s))+ _ -> Nothing+ _ -> Nothing++fromDefaultValueBasic :: BasicType -> DefaultValue -> Maybe Value+fromDefaultValueBasic bt dv = case (bt, dv) of+ (BTstring, DefValString s) -> Just (String s)+ (BTbinary, DefValString s) -> case base64ToBinary s of+ Right b -> Just (Bytes b)+ Left _ -> Nothing+ (BTbool, DefValBool b) -> Just (Bool b)+ (BTint, DefValInt i) -> Just (Int i)+ (BTutc, DefValUtc u) -> Just (UTCTime u)+ _ -> Nothing++++instance JS.ToJSON Value where+ toJSON v0 = case v0 of+ String t -> JS.String t+ UTCTime t -> JS.String (mkUTC' t)+ Bytes b -> JS.toJSON b+ Bool b -> JS.Bool b+ Int i -> JS.toJSON i+ List vs -> JS.toJSON vs+ Maybe Nothing -> JS.Null+ Maybe (Just v) -> JS.toJSON v+ Union fn v -> JS.object [_FieldName fn JS..= v]+ Enum fn -> JS.String (_FieldName fn)+ Record xs -> JS.object $ map (\ (Field fn v) -> _FieldName fn JS..= v) xs+ JSON js -> js++-- | Parse a generic 'Value' from a JSON 'JS.Value', given the schema+-- and expected type. This is not particularly optimized. For the+-- other direction, use 'JS.toJSON'.+fromJSON :: NormAPI -> APIType -> JS.Value -> Either [(JSONError, Position)] (Value, [(JSONWarning, Position)])+fromJSON api ty v = runParserWithErrsTop defaultParseFlags (parseJSON api ty v)++parseJSON :: NormAPI -> APIType -> JS.Value -> ParserWithErrs Value+parseJSON api ty0 v = case ty0 of+ TyName tn -> parseJSONDecl api tn (lookupTyName api tn) v+ TyList ty -> case v of+ JS.Array arr -> List <$> traverse (parseJSON api ty) (V.toList arr)+ _ -> failWith (expectedArray v)+ TyMaybe ty -> case v of+ JS.Null -> pure (Maybe Nothing)+ _ -> Maybe . Just <$> parseJSON api ty v+ TyJSON -> pure (JSON v)+ TyBasic bt -> parseJSONBasic bt v++parseJSONBasic :: BasicType -> JS.Value -> ParserWithErrs Value+parseJSONBasic bt = case bt of+ BTstring -> withText "String" (pure . String)+ BTbinary -> withBinary "Bytes" (pure . Bytes)+ BTbool -> withBool "Bool" (pure . Bool)+ BTint -> withInt "Int" (pure . Int)+ BTutc -> withUTC "UTCTime" (pure . UTCTime)++parseJSONDecl :: NormAPI -> TypeName -> NormTypeDecl -> JS.Value -> ParserWithErrs Value+parseJSONDecl api tn d = case d of+ NRecordType nrt -> \ v -> case v of+ JS.Object hm -> Record <$> traverse (parseField hm) (Map.toList nrt)+ _ -> failWith (expectedObject v)+ NUnionType nut -> withUnion (map (\ (fn, ty) -> (_FieldName fn, fmap (Union fn) . parseJSON api ty)) (Map.toList nut))+ NEnumType net -> withText (T.unpack (_TypeName tn)) $ \ k ->+ case lookupSet (FieldName k) net of+ Just fn -> pure (Enum fn)+ Nothing -> failWith (UnexpectedEnumVal (map _FieldName (Set.toList net)) k)+ NTypeSynonym ty -> parseJSON api ty+ NNewtype bt -> parseJSONBasic bt+ where+ parseField hm (fn, ty) = Field fn <$> withField (_FieldName fn) (parseJSON api ty) hm++++-- | Efficiently encode a generic 'Value' in CBOR format.+encode :: Value -> CBOR.Encoding+encode v0 = case v0 of+ String t -> CBOR.encodeString t+ UTCTime t -> CBOR.encode t+ Bytes b -> CBOR.encode b+ Bool b -> CBOR.encode b+ Int i -> CBOR.encode i+ List vs -> encodeListWith encode vs+ Maybe mb_v -> encodeMaybeWith encode mb_v+ Union fn v -> encodeUnion (_FieldName fn) (encode v)+ Enum fn -> CBOR.encode (_FieldName fn)+ Record xs -> CBOR.encodeMapLen (fromIntegral (length xs))+ <> encodeRecordFields (map (\ (Field fn v) -> CBOR.encode (_FieldName fn)+ <> encode v) xs)+ JSON js -> encodeJSON js+++-- | Efficiently decode CBOR as a generic 'Value', given the schema+-- and expected type.+decode :: NormAPI -> APIType -> CBOR.Decoder s Value+decode api ty0 = case ty0 of+ TyName tn -> decodeDecl api (lookupTyName api tn)+ TyList ty -> List <$!> decodeListWith (decode api ty)+ TyMaybe ty -> Maybe <$!> decodeMaybeWith (decode api ty)+ TyJSON -> JSON <$!> decodeJSON+ TyBasic bt -> decodeBasic bt++decodeBasic :: BasicType -> CBOR.Decoder s Value+decodeBasic bt = case bt of+ BTstring -> String <$!> CBOR.decode+ BTbinary -> Bytes <$!> CBOR.decode+ BTbool -> Bool <$!> CBOR.decode+ BTint -> Int <$!> CBOR.decode+ BTutc -> UTCTime <$!> CBOR.decode++decodeDecl :: NormAPI -> NormTypeDecl -> CBOR.Decoder s Value+decodeDecl api d = case d of+ NRecordType nrt -> do _ <- CBOR.decodeMapLen+ go [] (Map.toList nrt)+ NUnionType nut -> do _ <- CBOR.decodeMapLen+ k <- CBOR.decodeString+ case lookupMap (FieldName k) nut of+ Just (fn, ty) -> Union fn <$!> decode api ty+ Nothing -> fail $ "unexpected union alternative: " ++ T.unpack k+ NEnumType net -> do k <- CBOR.decodeString+ case lookupSet (FieldName k) net of+ Just fn -> pure (Enum fn)+ Nothing -> fail $ "unexpected enum alternative: " ++ T.unpack k+ NTypeSynonym ty -> decode api ty+ NNewtype bt -> decodeBasic bt+ where+ go xs [] = pure (Record (reverse xs))+ go xs ((fn, ty):ys) = do _ <- CBOR.decodeString+ !v <- decode api ty+ go (Field fn v:xs) ys+++-- | Check that the value is of the given type in the schema,+-- reporting the first error encountered if it does not conform.+matchesNormAPI :: NormAPI -> APIType -> Value -> Position -> Either (ValueError, Position) ()+matchesNormAPI api ty0 v0 p = case ty0 of+ TyName tn -> do d <- lookupType tn api ?!? (\ f -> (InvalidAPI f, p))+ matchesNormAPIDecl api d v0 p+ TyList ty -> case v0 of+ List vs -> mapM_ (\ (i, v) -> matchesNormAPI api ty v (InElem i : p)) (zip [0..] vs)+ _ -> Left (JSONError (expectedArray js_v), p)+ TyMaybe ty -> case v0 of+ Maybe Nothing -> return ()+ Maybe (Just v) -> matchesNormAPI api ty v p+ _ -> Left (JSONError (Expected ExpObject "Maybe" js_v), p)+ TyJSON -> case v0 of+ JSON _ -> return ()+ _ -> Left (JSONError (Expected ExpObject "JSON" js_v), p)+ TyBasic bt -> matchesNormAPIBasic bt v0 p+ where+ js_v = JS.toJSON v0++matchesNormAPIBasic :: BasicType -> Value -> Position -> Either (ValueError, Position) ()+matchesNormAPIBasic bt v p = case (bt, v) of+ (BTstring, String _) -> return ()+ (BTstring, _) -> Left (JSONError (expectedString js_v), p)+ (BTbinary, Bytes _) -> return ()+ (BTbinary, _) -> Left (JSONError (expectedString js_v), p)+ (BTbool, Bool _) -> return ()+ (BTbool, _) -> Left (JSONError (expectedBool js_v), p)+ (BTint, Int _) -> return ()+ (BTint, _) -> Left (JSONError (expectedInt js_v), p)+ (BTutc, UTCTime _) -> return ()+ (BTutc, _) -> Left (JSONError (Expected ExpString "UTCTime" js_v), p)+ where+ js_v = JS.toJSON v++matchesNormAPIDecl :: NormAPI -> NormTypeDecl -> Value -> Position -> Either (ValueError, Position) ()+matchesNormAPIDecl api d v0 p = case d of+ NRecordType nrt -> do xs <- expectRecord v0 p+ case compare (length xs) (Map.size nrt) of+ LT -> Left (JSONError MissingField, p)+ EQ -> mapM_ matchesNormAPIField (zip (Map.toList nrt) xs)+ GT -> Left (JSONError UnexpectedField, p)+ NUnionType nut -> do (fn, v) <- expectUnion v0 p+ case Map.lookup fn nut of+ Just ty -> matchesNormAPI api ty v (inField fn : p)+ Nothing -> Left (JSONError UnexpectedField, inField fn : p)+ NEnumType net -> do fn <- expectEnum v0 p+ unless (Set.member fn net) $ Left (JSONError (UnexpectedEnumVal (map _FieldName (Set.toList net)) (_FieldName fn)), p)+ NTypeSynonym ty -> matchesNormAPI api ty v0 p+ NNewtype bt -> matchesNormAPIBasic bt v0 p+ where+ matchesNormAPIField ((fn, ty), Field fn' v)+ | fn == fn' = matchesNormAPI api ty v (inField fn : p)+ | otherwise = Left (JSONError (SyntaxError (unlines ["record out of order: ", show fn, show fn', show d, show v0])), p)++expectRecord :: Value -> Position -> Either (ValueError, Position) Record+expectRecord (Record xs) _ = pure xs+expectRecord v p = Left (JSONError (Expected ExpObject "Record" (JS.toJSON v)), p)++expectEnum :: Value -> Position -> Either (ValueError, Position) FieldName+expectEnum (Enum s) _ = pure s+expectEnum v p = Left (JSONError (Expected ExpString "Enum" (JS.toJSON v)), p)++expectUnion :: Value -> Position -> Either (ValueError, Position) (FieldName, Value)+expectUnion (Union fname v) _ = pure (fname, v)+expectUnion v p = Left (JSONError (Expected ExpObject "Union" (JS.toJSON v)), p)++expectList :: Value -> Position -> Either (ValueError, Position) [Value]+expectList (List xs) _ = pure xs+expectList v p = Left (JSONError (Expected ExpArray "List" (JS.toJSON v)), p)++expectMaybe :: Value -> Position -> Either (ValueError, Position) (Maybe Value)+expectMaybe (Maybe v) _ = pure v+expectMaybe v p = Left (JSONError (Expected ExpArray "Maybe" (JS.toJSON v)), p)++lookupType :: TypeName -> NormAPI -> Either ApplyFailure NormTypeDecl+lookupType tname api = Map.lookup tname api ?! TypeDoesNotExist tname+++-- | Given a schema, generate an arbitrary type corresponding to the+-- schema and an arbitrary value of that type.+arbitrary :: NormAPI -> QC.Gen (APIType, Value)+arbitrary api = do tn <- QC.elements (Map.keys api)+ v <- arbitraryOfType api (TyName tn)+ return (TyName tn, v)++-- | Given a schema and a type, generate an arbitrary value of that+-- type.+arbitraryOfType :: NormAPI -> APIType -> QC.Gen Value+arbitraryOfType api ty0 = case ty0 of+ TyName tn -> arbitraryOfDecl api (lookupTyName api tn)+ TyList ty -> List <$> QC.listOf (arbitraryOfType api ty)+ TyMaybe ty -> Maybe <$> QC.oneof [pure Nothing, Just <$> arbitraryOfType api ty]+ TyJSON -> JSON <$> arbitraryJSONValue+ TyBasic bt -> arbitraryOfBasicType bt++arbitraryOfBasicType :: BasicType -> QC.Gen Value+arbitraryOfBasicType bt = case bt of+ BTstring -> String <$> QC.arbitrary+ BTbinary -> Bytes <$> QC.arbitrary+ BTbool -> Bool <$> QC.arbitrary+ BTint -> Int <$> QC.arbitrary+ BTutc -> UTCTime+ . posixSecondsToUTCTime+ . (realToFrac :: Int -> NominalDiffTime)+ <$> QC.arbitrary++arbitraryOfDecl :: NormAPI -> NormTypeDecl -> QC.Gen Value+arbitraryOfDecl api d = case d of+ NRecordType nrt -> Record <$> traverse (\ (fn, ty) -> Field fn <$> arbitraryOfType api ty) (Map.toList nrt)+ NUnionType nut -> do (fn, ty) <- QC.elements (Map.toList nut)+ Union fn <$> arbitraryOfType api ty+ NEnumType net -> Enum <$> QC.elements (Set.toList net)+ NTypeSynonym ty -> arbitraryOfType api ty+ NNewtype bt -> arbitraryOfBasicType bt++-- | A reasonably varied generator for JSON 'JS.Value's.+--+-- Hack alert: we do not generate 'JS.Null', because Aeson fails to+-- round-trip @'Just' 'JS.Null' :: 'Maybe' 'JS.Value'@.+arbitraryJSONValue :: QC.Gen JS.Value+arbitraryJSONValue =+ QC.sized $ \ size ->+ QC.oneof [ JS.Object . HMap.fromList <$> QC.resize (size `div` 2) (QC.listOf ((,) <$> QC.arbitrary <*> arbitraryJSONValue))+ , JS.Array . V.fromList <$> QC.resize (size `div` 2) (QC.listOf arbitraryJSONValue)+ , JS.String <$> QC.arbitrary+ , JS.Number . fromInteger <$> QC.arbitrary+ , JS.Bool <$> QC.arbitrary+ -- , pure JS.Null+ ]++++-- | QuickCheck property that converting a 'Value' to and from JSON+-- gives back the original value.+prop_jsonRoundTrip :: NormAPI -> QC.Property+prop_jsonRoundTrip api+ = QC.forAll (arbitrary api) $ \ (ty, v) ->+ case fromJSON api ty (JS.toJSON v) of+ Right (y, ws) | v /= y -> QCP.failed { QCP.reason = "Expected " ++ show v+ ++ " but got " ++ show y }+ | not (null ws) -> QCP.failed { QCP.reason = "Unexpected warnings: " ++ show ws }+ | otherwise -> QCP.succeeded+ Left err -> QCP.failed { QCP.reason = "Parse error: " ++ prettyJSONErrorPositions err }++-- | QuickCheck property that the type-specific JSON serialisation+-- agrees with deserialising as generic JSON and then serialising again.+prop_jsonGeneric :: JS.ToJSON a => API -> TypeName -> a -> QCP.Result+prop_jsonGeneric api tn x = case fromJSON napi (TyName tn) js_v of+ Right (v, ws) | JS.toJSON v /= js_v -> QCP.failed { QCP.reason = "Expected " ++ show js_v+ ++ " but got " ++ show (JS.toJSON v) }+ | not (null ws) -> QCP.failed { QCP.reason = "Unexpected warnings: " ++ show ws }+ | otherwise -> QCP.succeeded+ Left err -> QCP.failed { QCP.reason = "Parse error: " ++ prettyJSONErrorPositions err }+ where+ napi = apiNormalForm api+ js_v = JS.toJSON x++-- | QuickCheck property that converting a 'Value' to and from CBOR+-- gives back the original value.+prop_cborRoundTrip :: NormAPI -> QC.Property+prop_cborRoundTrip api+ = QC.forAll (arbitrary api) $ \ (ty, v) ->+ case CBOR.fromFlatTerm (decode api ty) (CBOR.toFlatTerm (encode v)) of+ Right v' | v /= v' -> QCP.failed { QCP.reason = "Expected " ++ show v+ ++ " but got " ++ show v' }+ | otherwise -> QCP.succeeded+ Left err -> QCP.failed { QCP.reason = "Parse error: " ++ err }++-- | QuickCheck property that the type-specific CBOR serialisation+-- agrees with deserialising as generic CBOR and then serialising again.+prop_cborGeneric :: CBOR.Serialise a => API -> TypeName -> a -> QCP.Result+prop_cborGeneric api tn x+ | not (CBOR.validFlatTerm bs) = QCP.failed { QCP.reason = "Invalid CBOR: " ++ show bs }+ | otherwise = case CBOR.fromFlatTerm (decode napi (TyName tn)) bs of+ Right v | bs' <- CBOR.toFlatTerm (encode v)+ , bs' /= bs -> QCP.failed { QCP.reason = "Expected " ++ show bs ++ " but got " ++ show bs' }+ | otherwise -> QCP.succeeded+ Left err -> QCP.failed { QCP.reason = "Decode error: " ++ err }+ where+ napi = apiNormalForm api+ bs = CBOR.toFlatTerm (CBOR.encode x)+++-- | Look up a type in a schema, failing with an error if it is missing.+lookupTyName :: NormAPI -> TypeName -> NormTypeDecl+lookupTyName api tn = case Map.lookup tn api of+ Just d -> d+ Nothing -> error $ "lookupTyName: missing declaration for "+ ++ T.unpack (_TypeName tn)++-- | Look up a key in a set, returning a pointer to the set's copy of+-- the key. This is useful during deserialisation because it means we+-- can share a single key, avoiding retaining deserialised copies.+lookupSet :: Ord a => a -> Set.Set a -> Maybe a+#if MIN_VERSION_containers(0,5,2)+lookupSet k s = flip Set.elemAt s <$> Set.lookupIndex k s+#else+-- alternative implementation for containers versions without lookupIndex/elemAt+lookupSet k s = case Set.lookupLE k s of+ Just k' | k == k' -> Just k'+ _ -> Nothing+#endif++-- | Look up a key in a map, returning both the value and the map's+-- copy of the key. This is useful during deserialisation because it+-- means we can share a single key, avoiding retaining deserialised+-- copies.+lookupMap :: Ord k => k -> Map.Map k a -> Maybe (k, a)+lookupMap k m = flip Map.elemAt m <$> Map.lookupIndex k m+++recordToMap :: Record -> Map.Map FieldName Value+recordToMap = Map.fromList . map (\ (Field fn v) -> (fn, v))++mapToRecord :: Map.Map FieldName Value -> Record+mapToRecord = map (uncurry Field) . Map.toList++-- | Insert a (field, value) pair into a record, replacing the+-- existing field if it is present and preserving the ordering+-- invariant.+insertField :: FieldName -> Value -> Record -> Record+insertField fname v [] = [Field fname v]+insertField fname v xxs@(x@(Field fn _):xs) = case compare fname fn of+ GT -> x : insertField fname v xs+ EQ -> Field fname v : xs+ LT -> Field fname v : xxs++-- | Delete a field from a record, trivially preserving the ordering+-- invariant.+deleteField :: FieldName -> Record -> Record+deleteField fname = filter ((fname /=) . fieldName)++-- | Rename a field in a record, preserving the ordering invariant.+renameField :: FieldName -> FieldName -> Record -> Record+renameField fname fname' = sortBy (comparing fieldName) . map f+ where+ f x@(Field fn v) | fn == fname = Field fname' v+ | otherwise = x++-- | Split a record at a given field, returning the preceding fields,+-- value and succeeding fields. Fails if the field is absent.+findField :: FieldName -> Record -> Maybe (Record, Value, Record)+findField fname xs = case break ((fname ==) . fieldName) xs of+ (ys, (Field _ v):zs) -> Just (ys, v, zs)+ (_, []) -> Nothing++-- | Join together two records with a (field, value) pair in between.+-- The ordering invariant is not checked!+joinRecords :: Record -> FieldName -> Value -> Record -> Record+joinRecords ys fname v zs = ys ++ Field fname v : zs
+ src/Data/Binary/Serialise/CBOR/Extra.hs view
@@ -0,0 +1,73 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE CPP #-}+module Data.Binary.Serialise.CBOR.Extra+ ( encodeListWith+ , encodeMaybeWith+ , encodeRecordFields+ , encodeUnion+ , decodeUnion+ , decodeListWith+ , decodeMaybeWith+ , (<$!>)+ ) where++import Codec.Serialise.Decoding+import Codec.Serialise.Encoding+import Data.List (foldl1')+import Data.Monoid+import qualified Data.Text as T++#if MIN_VERSION_base(4,8,0)+import Control.Monad ((<$!>))+#else+-- | Strict version of '<$>', which is available in base >= 4.8.0+(<$!>) :: Monad m => (a -> b) -> m a -> m b+{-# INLINE (<$!>) #-}+f <$!> m = do+ x <- m+ let z = f x+ z `seq` return z+infixl 4 <$!>+#endif++encodeListWith :: (a -> Encoding) -> [a] -> Encoding+encodeListWith _ [] = encodeListLen 0+encodeListWith f xs = encodeListLenIndef+ <> foldr (\x r -> f x <> r) encodeBreak xs++encodeMaybeWith :: (a -> Encoding) -> Maybe a -> Encoding+encodeMaybeWith _ Nothing = encodeListLen 0+encodeMaybeWith f (Just x) = encodeListLen 1 <> f x++-- We can assume the record has at least 1 field.+encodeRecordFields :: [Encoding] -> Encoding+encodeRecordFields l = foldl1' (<>) l++-- | Encode an element of a union as single-element map from a field+-- name to a value.+encodeUnion :: T.Text -> Encoding -> Encoding+encodeUnion t e = encodeMapLen 1 <> encodeString t <> e++decodeUnion :: [(T.Text, Decoder s a)] -> Decoder s a+decodeUnion ds = do+ _ <- decodeMapLen -- should always be 1+ dfn <- decodeString+ case lookup dfn ds of+ Nothing -> fail "Unexpected field in union in CBOR"+ Just d -> d++decodeListWith :: Decoder s a -> Decoder s [a]+decodeListWith dec = do+ mn <- decodeListLenOrIndef+ case mn of+ Nothing -> decodeSequenceLenIndef (flip (:)) [] reverse dec+ Just n -> decodeSequenceLenN (flip (:)) [] reverse n dec++decodeMaybeWith :: Decoder s a -> Decoder s (Maybe a)+decodeMaybeWith dec = do+ n <- decodeListLen+ case n of+ 0 -> return Nothing+ 1 -> do !x <- dec+ return (Just x)+ _ -> fail "unknown tag"
+ src/Data/Binary/Serialise/CBOR/JSON.hs view
@@ -0,0 +1,184 @@+{-# LANGUAGE BangPatterns #-}+module Data.Binary.Serialise.CBOR.JSON (+ cborToJson,+ jsonToCbor,+ encodeJSON,+ decodeJSON,+ ) where++import qualified Data.Aeson as JSON+import qualified Data.Scientific as Scientific+import qualified Data.Vector as Vec+import qualified Data.HashMap.Strict as HashMap++import Data.Text (Text)+import qualified Data.Text as Text+import qualified Data.Text.Encoding as Text+import qualified Data.Text.Lazy as Text.Lazy+import Data.ByteString (ByteString)+import qualified Data.ByteString.Lazy as LBS+import qualified Data.ByteString.Base64 as Base64+-- import qualified Data.ByteString.Base64.URL as Base64url+import qualified Data.ByteString.Base16 as Base16++import Codec.Serialise.Decoding+import Codec.Serialise.Encoding+import Codec.CBOR.Term as CBOR+import Codec.Serialise++import Control.Applicative+import Prelude+++instance Serialise JSON.Value where+ encode = encodeJSON+ decode = decodeJSON++encodeJSON :: JSON.Value -> Encoding+encodeJSON = encode . jsonToCbor++decodeJSON :: Decoder s JSON.Value+decodeJSON = cborToJson <$> decode++-- Most of the types in CBOR have direct analogs in JSON. However, some+-- do not, and someone implementing a CBOR-to-JSON converter has to+-- consider what to do in those cases. The following non-normative+-- advice deals with these by converting them to a single substitute+-- value, such as a JSON null.++cborToJson :: CBOR.Term -> JSON.Value++-- o An integer (major type 0 or 1) becomes a JSON number.++-- We modify this advice by only converting numbers in the range -2^53 .. 2^53+-- and otherwise handling them like big nums++cborToJson (CBOR.TInt n) = cborToJson (CBOR.TInteger (fromIntegral n))++-- o A byte string (major type 2) that is not embedded in a tag that+-- specifies a proposed encoding is encoded in base64url without+-- padding and becomes a JSON string.++cborToJson (CBOR.TBytes bs) = JSON.String (base64url bs)+cborToJson (CBOR.TBytesI bs) = JSON.String (base64url (LBS.toStrict bs))++-- o A UTF-8 string (major type 3) becomes a JSON string. Note that+-- JSON requires escaping certain characters (RFC 4627, Section 2.5):+-- quotation mark (U+0022), reverse solidus (U+005C), and the "C0+-- control characters" (U+0000 through U+001F). All other characters+-- are copied unchanged into the JSON UTF-8 string.++cborToJson (CBOR.TString s) = JSON.String s -- aeson will escape correctly+cborToJson (CBOR.TStringI s) = JSON.String (Text.Lazy.toStrict s)++-- o An array (major type 4) becomes a JSON array.++cborToJson (TList vs) = JSON.Array (Vec.fromList (map cborToJson vs))++-- o A map (major type 5) becomes a JSON object. This is possible+-- directly only if all keys are UTF-8 strings. A converter might+-- also convert other keys into UTF-8 strings (such as by converting+-- integers into strings containing their decimal representation);+-- however, doing so introduces a danger of key collision.++cborToJson (TMap kvs) = JSON.object [ (cborToJsonString k, cborToJson v)+ | (k, v) <- kvs ]++-- o False (major type 7, additional information 20) becomes a JSON false.++-- o True (major type 7, additional information 21) becomes a JSON true.+--+-- o Null (major type 7, additional information 22) becomes a JSON null.++cborToJson (TBool b) = JSON.Bool b+cborToJson TNull = JSON.Null++-- o A floating-point value (major type 7, additional information 25+-- through 27) becomes a JSON number if it is finite (that is, it can+-- be represented in a JSON number); if the value is non-finite (NaN,+-- or positive or negative Infinity), it is represented by the+-- substitute value.++cborToJson (THalf f)+ | isNaN f || isInfinite f = JSON.Null+ | otherwise = JSON.Number (Scientific.fromFloatDigits f)+cborToJson (TFloat f)+ | isNaN f || isInfinite f = JSON.Null+ | otherwise = JSON.Number (Scientific.fromFloatDigits f)+cborToJson (TDouble f)+ | isNaN f || isInfinite f = JSON.Null+ | otherwise = JSON.Number (Scientific.fromFloatDigits f)++-- o Any other simple value (major type 7, any additional information+-- value not yet discussed) is represented by the substitute value.++cborToJson (TSimple _) = JSON.Null++-- o A bignum (major type 6, tag value 2 or 3) is represented by+-- encoding its byte string in base64url without padding and becomes+-- a JSON string. For tag value 3 (negative bignum), a "~" (ASCII+-- tilde) is inserted before the base-encoded value. (The conversion+-- to a binary blob instead of a number is to prevent a likely+-- numeric overflow for the JSON decoder.)++-- NOTE We ignore this advice and just use 'JSON.Number'.++cborToJson (TInteger n) = JSON.Number (fromInteger n)++-- o A byte string with an encoding hint (major type 6, tag value 21+-- through 23) is encoded as described and becomes a JSON string.++cborToJson (TTagged 21 (CBOR.TBytes bs)) = JSON.String (base64url bs)+cborToJson (TTagged 22 (CBOR.TBytes bs)) = JSON.String (base64 bs)+cborToJson (TTagged 23 (CBOR.TBytes bs)) = JSON.String (base16 bs)++-- o For all other tags (major type 6, any other tag value), the+-- embedded CBOR item is represented as a JSON value; the tag value+-- is ignored.++cborToJson (TTagged _tag term) = cborToJson term++-- o Indefinite-length items are made definite before conversion.++cborToJson (TListI kvs) = cborToJson (TList kvs)+cborToJson (TMapI kvs) = cborToJson (TMap kvs)+++-- used just for converting CBOR terms to JSON map keys+-- TODO: partial+cborToJsonString :: CBOR.Term -> Text.Text+cborToJsonString (TInt n) = Text.pack (show n)+cborToJsonString (TInteger n) = Text.pack (show n)+cborToJsonString (TString s) = s+cborToJsonString (TStringI s) = Text.Lazy.toStrict s++cborToJsonString (TBytes bs) = base64url bs+cborToJsonString (TBytesI bs) = base64url (LBS.toStrict bs)++-- TODO not strictly following the spec - this uses padding, spec says+-- we shouldn't+-- TODO moreover, api-tools uses base64 rather than base64url!+base64url :: ByteString -> Text+base64url = base64 -- Text.decodeLatin1 . Base64url.encode++base64 :: ByteString -> Text+base64 = Text.decodeLatin1 . Base64.encode++base16 :: ByteString -> Text+base16 = Text.decodeLatin1 . Base16.encode+++jsonToCbor :: JSON.Value -> CBOR.Term+jsonToCbor (JSON.Object kvs) = CBOR.TMap [ (CBOR.TString k, jsonToCbor v)+ | (k, v) <- HashMap.toList kvs ]+jsonToCbor (JSON.Array vs) = CBOR.TList [ jsonToCbor v | v <- Vec.toList vs ]+jsonToCbor (JSON.String str) = CBOR.TString str+jsonToCbor (JSON.Number n) = case Scientific.floatingOrInteger n of+ Left d -> CBOR.TDouble d+ Right i+ | i >= fromIntegral (minBound :: Int) &&+ i <= fromIntegral (maxBound :: Int)+ -> CBOR.TInt (fromIntegral i)+ | otherwise -> CBOR.TInteger i+jsonToCbor (JSON.Bool b) = CBOR.TBool b+jsonToCbor JSON.Null = CBOR.TNull
tests/Data/API/Test/DSL.hs view
@@ -52,8 +52,12 @@ // A simple test example = record x :: integer- y :: Foo+ y :: Faa +faa :: Faa+ = record+ f :: Flag+ c :: Coord // A simple test example = record@@ -86,7 +90,7 @@ uv :: MyUTC = utc -urec :: URec+urec :: URecord = record foo :: utc @@ -99,4 +103,25 @@ fu :: FilteredUTC = basic utc | >= 2014-10-13T15:20:11Z++bb :: BasicBinary+ = basic binary++j :: JSON+ = json++nr :: NewRec+ = record+ bb :: BasicBinary+ j :: JSON+ k :: ? MaybeThing++mt :: MaybeThing+ = record+ thing :: ? JSON++nu :: NewUnion+ = union+ | bb :: BasicBinary+ | j :: JSON |]
tests/Data/API/Test/Gen.hs view
@@ -1,32 +1,49 @@+{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE DeriveDataTypeable #-}+{-# OPTIONS_GHC -fno-warn-orphans #-} module Data.API.Test.Gen where -import Data.API.JSON import Data.API.Test.DSL hiding (example) import qualified Data.API.Test.DSL as DSL import Data.API.Tools+import Data.API.Tools.Datatypes import Data.API.Tools.Example+import Data.API.Value ( arbitraryJSONValue )+ import Control.Applicative+import qualified Data.Aeson as JS+import Data.SafeCopy+import GHC.Generics import Language.Haskell.TH import Test.QuickCheck ( Arbitrary(..) )+import Prelude + $(generate DSL.example) $(generateAPITools DSL.example [ enumTool , jsonTool'+ , cborTool , quickCheckTool , lensTool , safeCopyTool , exampleTool+ , deepSeqTool , samplesTool (mkName "exampleSamples")- , jsonTestsTool (mkName "exampleSimpleTests")+ , jsonTestsTool (mkName "exampleTestsJSON")+ , cborTestsTool (mkName "exampleTestsCBOR")+ , cborToJSONTestsTool 'DSL.example (mkName "exampleTestsCBORToJSON")+ , jsonToCBORTestsTool 'DSL.example (mkName "exampleTestsJSONToCBOR")+ , jsonGenericValueTestsTool 'DSL.example (mkName "exampleJSONGenericValueTests")+ , cborGenericValueTestsTool 'DSL.example (mkName "exampleCBORGenericValueTests") ]) -$(generateWith (defaultToolSettings { newtypeSmartConstructors = True }) example2)+$(generateAPIToolsWith (defaultToolSettings { newtypeSmartConstructors = True }) example2+ [ datatypesTool' ((''Generic :) . defaultDerivedClasses) ]) data Coord = Coord Int Int deriving (Eq,Show)@@ -36,13 +53,12 @@ instance Example Coord -inj_coord :: REP__Coord -> ParserWithErrs Coord+inj_coord :: Applicative p => REP__Coord -> p Coord inj_coord (REP__Coord x y) = pure $ Coord x y -prj_coord :: Coord -> REP__Coord +prj_coord :: Coord -> REP__Coord prj_coord (Coord x y) = REP__Coord x y - newtype Ssn = Ssn { _Ssn :: Integer } deriving(Eq,Show) @@ -51,7 +67,7 @@ instance Example Ssn -inj_ssn :: REP__Ssn -> ParserWithErrs Ssn+inj_ssn :: Monad m => REP__Ssn -> m Ssn inj_ssn = return . Ssn . fromIntegral . _REP__Ssn prj_ssn :: Ssn -> REP__Ssn@@ -66,9 +82,9 @@ instance Example CHOICE -inj_chc :: REP__CHOICE -> ParserWithErrs CHOICE+inj_chc :: Monad m => REP__CHOICE -> m CHOICE inj_chc (CHC_a i) = return $ CHOICE i-inj_chc (CHC_b _) = empty+inj_chc (CHC_b _) = fail "no choice" prj_chc :: CHOICE -> REP__CHOICE prj_chc (CHOICE i) = CHC_a i@@ -81,7 +97,7 @@ instance Example ENUM -inj_enum :: REP__ENUM -> ParserWithErrs ENUM+inj_enum :: Monad m => REP__ENUM -> m ENUM inj_enum ENM_e1 = return $ ENUM False inj_enum ENM_e2 = return $ ENUM True @@ -95,13 +111,31 @@ instance Example FilteredString ++-- | These instances are required by the generated code, but we don't+-- really want to force them on clients of the library, so just define+-- orphans here.+instance Arbitrary JS.Value where+ arbitrary = arbitraryJSONValue++instance SafeCopy JS.Value where+ getCopy = error "Not implemented"+ putCopy = error "Not implemented"+ $(generateAPIToolsWith (defaultToolSettings { newtypeSmartConstructors = True }) example2 [ enumTool , jsonTool'+ , cborTool , quickCheckTool , lensTool , safeCopyTool , exampleTool+ , deepSeqTool , samplesTool (mkName "example2Samples")- , jsonTestsTool (mkName "example2SimpleTests")+ , jsonTestsTool (mkName "example2TestsJSON")+ , cborTestsTool (mkName "example2TestsCBOR")+ , cborToJSONTestsTool 'example2 (mkName "example2TestsCBORToJSON")+ , jsonToCBORTestsTool 'example2 (mkName "example2TestsJSONToCBOR")+ , jsonGenericValueTestsTool 'example2 (mkName "example2JSONGenericValueTests")+ , cborGenericValueTestsTool 'example2 (mkName "example2CBORGenericValueTests") ])
tests/Data/API/Test/JSON.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE DeriveDataTypeable #-}@@ -6,14 +7,17 @@ ( jsonTests ) where -import Data.API.API.Gen ( apiAPISimpleTests )+import Data.API.API.Gen ( apiAPITestsJSON, apiAPITestsCBOR, apiAPITestsCBORToJSON, apiAPITestsJSONToCBOR ) import Data.API.JSON+import Data.API.NormalForm import Data.API.Tools import Data.API.Tools.JSONTests+import Data.API.Test.DSL import Data.API.Test.Gen hiding ( Foo ) import Data.API.Test.MigrationData import Data.API.Types import Data.API.Utils+import qualified Data.API.Value as Value import qualified Data.Aeson as JS import qualified Data.HashMap.Strict as HMap@@ -39,6 +43,8 @@ , help (JS.String "0") (0 :: Int) True , help (JS.String "-9") (-9 :: Int) True , help (JS.String "1a") (1 :: Int) False+ , help (JS.Number 1.1) (1 :: Int) True+ , help (JS.Number 1.9) (1 :: Int) True , help (JS.Number 0) False True , help (JS.Number 1) True True , help (JS.Number 2) True False@@ -62,7 +68,11 @@ -- | Test that the correct errors are generated for bad JSON data errorDecoding :: [TestTree] errorDecoding = [ help "not enough input" "" (proxy :: Int)+#if MIN_VERSION_aeson(0,10,0)+ [(SyntaxError "Error in $: not enough input", [])]+#else [(SyntaxError "not enough input", [])]+#endif , help "object for int" "{}" (proxy :: Int) [(Expected ExpInt "Int" (JS.Object HMap.empty), [])] , help "missing alt" "{}" (proxy :: AUnion)@@ -113,8 +123,34 @@ , testGroup "Decoding invalid data" errorDecoding , testGroup "Smart constructors" smartConstructors , testGroup "Round-trip tests"- [ testGroup "example" $ map (uncurry QC.testProperty) exampleSimpleTests- , testGroup "example2" $ map (uncurry QC.testProperty) example2SimpleTests- , testGroup "api" $ map (uncurry QC.testProperty) apiAPISimpleTests+ [ testGroup "example JSON" $ map (uncurry QC.testProperty) exampleTestsJSON+ , testGroup "example CBOR" $ map (uncurry QC.testProperty) exampleTestsCBOR+ , testGroup "example CBOR to JSON" $ map (uncurry QC.testProperty) exampleTestsCBORToJSON+ , testGroup "example JSON to CBOR" $ map (uncurry QC.testProperty) exampleTestsJSONToCBOR+ , testGroup "example2 JSON" $ map (uncurry QC.testProperty) example2TestsCBOR+ , testGroup "example2 CBOR" $ map (uncurry QC.testProperty) example2TestsCBOR+ , testGroup "example2 CBOR to JSON" $ map (uncurry QC.testProperty) example2TestsCBORToJSON+ , testGroup "example2 JSON to CBOR" $ map (uncurry QC.testProperty) example2TestsJSONToCBOR+ , testGroup "api JSON" $ map (uncurry QC.testProperty) apiAPITestsJSON+ , testGroup "api CBOR" $ map (uncurry QC.testProperty) apiAPITestsCBOR+ , testGroup "api CBOR to JSON" $ map (uncurry QC.testProperty) apiAPITestsCBORToJSON+ , testGroup "api JSON to CBOR" $ map (uncurry QC.testProperty) apiAPITestsJSONToCBOR+ , QC.testProperty "Aeson Value to CBOR" (prop_cborRoundtrip :: JS.Value -> Bool) ]+ , testGroup "Generic values"+ [ QC.testProperty "example JSON round-trip" (Value.prop_jsonRoundTrip exampleNF)+ , QC.testProperty "example2 JSON round-trip" (Value.prop_jsonRoundTrip example2NF)+ , QC.testProperty "example CBOR round-trip" (Value.prop_cborRoundTrip exampleNF)+ , QC.testProperty "example2 CBOR round-trip" (Value.prop_cborRoundTrip example2NF)+ , testGroup "example agreement with ToJSON" $ map (uncurry QC.testProperty) exampleJSONGenericValueTests+ , testGroup "example2 agreement with ToJSON" $ map (uncurry QC.testProperty) example2JSONGenericValueTests+ , testGroup "example agreement with Serialise" $ map (uncurry QC.testProperty) exampleCBORGenericValueTests+ , testGroup "example2 agreement with Serialise" $ map (uncurry QC.testProperty) example2CBORGenericValueTests+ ] ]++exampleNF :: NormAPI+exampleNF = apiNormalForm example++example2NF :: NormAPI+example2NF = apiNormalForm example2
tests/Data/API/Test/Main.hs view
@@ -2,10 +2,13 @@ ( main ) where +import Data.API.API+import Data.API.API.Gen import Data.API.Test.JSON import Data.API.Test.Migration import Test.Tasty+import Test.Tasty.QuickCheck main :: IO () main = defaultMain tests@@ -13,4 +16,14 @@ tests :: TestTree tests = testGroup "api-tools" [ migrationTests , jsonTests+ , testProperty "Convert/unconvert" convertUncovertTest ]++-- | Test that converting an 'API' into a self-hosted 'APISpec' and+-- back does not change it. We have 'Arbitrary' instances only for+-- 'APISpec', but we compare 'API' because it is slightly more precise+-- (e.g. 'APISpec' contains bogus read-only fields for unions).+convertUncovertTest :: APISpec -> Bool+convertUncovertTest api = unconvertAPI (convertAPI unconverted_api) == unconverted_api+ where+ unconverted_api = unconvertAPI api
tests/Data/API/Test/Migration.hs view
@@ -14,15 +14,19 @@ import Data.API.Test.MigrationData import Data.API.Types import Data.API.Utils+import qualified Data.API.Value as Value import qualified Data.Aeson as JS import qualified Data.Aeson.Encode.Pretty as JS+import qualified Codec.Serialise as CBOR+import qualified Codec.CBOR.FlatTerm as CBOR import qualified Data.ByteString.Char8 as B import qualified Data.ByteString.Base64 as B64 import qualified Data.ByteString.Lazy.Char8 as BL import qualified Data.HashMap.Strict as HMap import qualified Data.Map as Map import qualified Data.Text as T+import qualified Data.Text.Encoding as TE import Data.Version import Test.Tasty as Test import Test.Tasty.HUnit@@ -42,6 +46,16 @@ recur <- HMap.lookup "recur" x ?! CustomMigrationError "missing recur" (JS.Object x) return $ HMap.insert "recur2" recur x +testDatabaseMigration' :: TestDatabaseMigration -> Value.Record -> Either ValueError Value.Record+testDatabaseMigration' DuplicateBar r = do+ let x = Value.recordToMap r+ bar <- Map.lookup "bar" x ?! CustomMigrationError "missing bar" JS.Null+ return $ Value.mapToRecord $ Map.insert "bar2" bar x+testDatabaseMigration' DuplicateRecursive r = do+ let x = Value.recordToMap r+ recur <- Map.lookup "recur" x ?! CustomMigrationError "missing recur" JS.Null+ return $ Value.mapToRecord $ Map.insert "recur2" recur x+ testDatabaseMigrationSchema :: TestDatabaseMigration -> NormAPI -> Either ApplyFailure (Maybe NormAPI) testDatabaseMigrationSchema DuplicateBar _ = Right Nothing testDatabaseMigrationSchema DuplicateRecursive napi =@@ -67,6 +81,21 @@ new <- HMap.lookup "new" x ?! CustomMigrationError "missing new" (JS.Object x) return $ HMap.insert "newnew" new x +testRecordMigration' :: TestRecordMigration -> Value.Value -> Either ValueError Value.Value+testRecordMigration' CopyIDtoC = mkRecordMigration' $ \ rec -> do+ let x = Value.recordToMap rec+ i <- Map.lookup "id" x ?! CustomMigrationError "missing id" JS.Null+ b <- Map.lookup "c" x ?! CustomMigrationError "missing b" JS.Null+ r <- case (i, b) of+ (Value.Int j, Value.String t)+ -> return $ Value.String $ t `T.append` T.pack (show j)+ _ -> Left $ CustomMigrationError "bad data" JS.Null+ return $ Value.mapToRecord $ Map.insert "c" r x+testRecordMigration' DuplicateNew = mkRecordMigration' $ \ rec -> do+ let x = Value.recordToMap rec+ new <- Map.lookup "new" x ?! CustomMigrationError "missing new" JS.Null+ return $ Value.mapToRecord $ Map.insert "newnew" new x+ testRecordMigrationSchema :: TestRecordMigration -> NormTypeDecl -> Either ApplyFailure (Maybe NormTypeDecl) testRecordMigrationSchema CopyIDtoC = noSchemaChanges testRecordMigrationSchema DuplicateNew = mkRecordMigrationSchema "Recursive" $ \ r ->@@ -81,15 +110,26 @@ Right x -> return (JS.String (T.pack (B.unpack x))) testFieldMigration ConvertBinaryToString v = Left $ CustomMigrationError "bad data" v +testFieldMigration' :: TestFieldMigration -> Value.Value -> Either ValueError Value.Value+testFieldMigration' ConvertBinaryToString (Value.Bytes bs) = return (Value.String (TE.decodeUtf8 (_Binary bs)))+testFieldMigration' ConvertBinaryToString v = Left $ CustomMigrationError "bad data" (JS.toJSON v) -testMigration :: CustomMigrations TestDatabaseMigration TestRecordMigration TestFieldMigration++testMigration :: CustomMigrations JS.Object JS.Value TestDatabaseMigration TestRecordMigration TestFieldMigration testMigration = CustomMigrations testDatabaseMigration testDatabaseMigrationSchema testRecordMigration testRecordMigrationSchema testFieldMigration +testMigration' :: CustomMigrations Value.Record Value.Value TestDatabaseMigration TestRecordMigration TestFieldMigration+testMigration' = CustomMigrations testDatabaseMigration'+ testDatabaseMigrationSchema+ testRecordMigration'+ testRecordMigrationSchema+ testFieldMigration' + assertMatchesAPI :: String -> API -> JS.Value -> Assertion assertMatchesAPI x a v = case dataMatchesAPI root_ a v of Right () -> return ()@@ -135,6 +175,7 @@ $(generateAPITools startSchema [ enumTool , jsonTool'+ , cborTool , quickCheckTool ]) @@ -151,11 +192,29 @@ where failedBecause e = failed { reason = e } +validMigrationProperty' :: DatabaseSnapshot -> P.Result+validMigrationProperty' db =+ case migrateDataDump' (startSchema, startVersion) (endSchema, DevVersion)+ changelog testMigration' root_ CheckStartAndEnd db_generic of+ Right (v, []) -> case dataMatchesAPI root_ endSchema (JS.toJSON v) of+ Right _ -> succeeded+ Left err -> failedBecause ("end data does not match API: "+ ++ prettyValueErrorPosition err)+ Right (_, ws) -> failedBecause ("migration generated warnings: " ++ show ws)+ Left err -> failedBecause ("migration failed: " ++ prettyMigrateFailure err)+ where+ failedBecause e = failed { reason = e } + db_generic = case CBOR.fromFlatTerm (Value.decode (apiNormalForm startSchema) (TyName root_))+ (CBOR.toFlatTerm (CBOR.encode db)) of+ Right v -> v+ Left err -> error err+ migrationTests :: TestTree migrationTests = testGroup "Migration" [ testCase "Basic migration using sample changelog" basicMigrationTest , testGroup "Invalid changes" $ map applyFailureTest expectedApplyFailures , testGroup "Invalid migrations" $ map migrateFailureTest expectedMigrateFailures- , QC.testProperty "Valid migrations" validMigrationProperty+ , QC.testProperty "Valid migrations (JSON)" validMigrationProperty+ , QC.testProperty "Valid migrations (generic)" validMigrationProperty' ]