# webhooks pydantic_v2.BaseModel
  import <package> loads []
  import <package>.protocols loads []
  import <package>.errors loads []
  import <package>.options loads []
  import <package>.webhooks loads []
  import <package>.webhooks.keys loads ['webhook_keys']
  helper loads ['verification', 'signatures', 'webhook_keys']
  helper optional imports=[]
  verify hints=['headers', 'keys', 'now', 'options', 'raw_body', 'return']
  verify_async hints=['headers', 'keys', 'now', 'options', 'raw_body', 'return']
  Standard Webhooks specification example, also in Svix's 'Verifying Webhooks Manually' documentation = Message Message(test=2432232314) delivery_id='msg_p5jXN8AQM9LWM0D4loKWxJek' timestamp=2021-02-25T15:02:10+00:00 matched_key_id='active'
  GitHub 'Validating webhook deliveries', the test values for verifying an implementation = ProtocolDataError: ProtocolDataError(reason='malformed') [] malformed
  RFC 4231 section 4 test case 1 HMAC-SHA256 = ProtocolDataError: ProtocolDataError(reason='malformed') [] malformed
  RFC 4231 section 4 test case 1 HMAC-SHA512 = ProtocolDataError: ProtocolDataError(reason='malformed') [] malformed
  RFC 4231 section 4 test case 2 HMAC-SHA256 = ProtocolDataError: ProtocolDataError(reason='malformed') [] malformed
  RFC 4231 section 4 test case 2 HMAC-SHA512 = ProtocolDataError: ProtocolDataError(reason='malformed') [] malformed
  RFC 4231 section 4 test case 6 HMAC-SHA256 = ProtocolDataError: ProtocolDataError(reason='malformed') [] malformed
  RFC 4231 section 4 test case 6 HMAC-SHA512 = ProtocolDataError: ProtocolDataError(reason='malformed') [] malformed
  printf 'msg_replay3000.32503680000.{"test": 1}' | openssl dgst -sha256 -mac HMAC -macopt hexkey:31f290f6bf06298aab4f08d43c3f082cf648a362da2da4b0 -binary | openssl base64 -A = Message Message(test=1) delivery_id='msg_replay3000' timestamp=3000-01-01T00:00:00+00:00 matched_key_id='active'
  printf 'msg_latest.253402300799.{"test": 9}' | openssl dgst -sha256 -mac HMAC -macopt hexkey:31f290f6bf06298aab4f08d43c3f082cf648a362da2da4b0 -binary | openssl base64 -A = Message Message(test=9) delivery_id='msg_latest' timestamp=9999-12-31T23:59:59+00:00 matched_key_id='active'
  printf '{"id": "d-1"}' | openssl dgst -sha256 -hmac callback-secret = Delivery Delivery(id='d-1') delivery_id=None timestamp=None matched_key_id='active'
  printf '{"radius": 1.5}' | openssl dgst -sha256 -hmac shape-secret = Shape Shape(root=Circle(radius=1.5)) delivery_id=None timestamp=None matched_key_id='active'
  printf '{"side": 2}' | openssl dgst -sha256 -hmac shape-secret = Shape Shape(root=Square(side=2.0)) delivery_id=None timestamp=None matched_key_id='active'
  printf '1614265330.{"test": 2432232314}' | openssl dgst -sha256 -hmac whsec_adapter_secret = Message Message(test=2432232314) delivery_id=None timestamp=2021-02-25T15:02:10+00:00 matched_key_id='stripe-2026'
  Stripe changed body = ProtocolDataError: ProtocolDataError(reason='invalid_signature') [] invalid_signature
  Stripe incomplete field = ProtocolDataError: ProtocolDataError(reason='malformed_signature') [] malformed_signature
  Stripe repeated timestamp = ProtocolDataError: ProtocolDataError(reason='malformed_signature') [] malformed_signature
  Stripe no timestamp = ProtocolDataError: ProtocolDataError(reason='malformed_signature') [] malformed_signature
  Stripe no signature = ProtocolDataError: ProtocolDataError(reason='malformed_signature') [] malformed_signature
  Stripe nondecimal timestamp = ProtocolDataError: ProtocolDataError(reason='malformed_signature') [] malformed_signature
  Stripe other version = ProtocolDataError: ProtocolDataError(reason='malformed_signature') [] malformed_signature
  Stripe rotated signatures = Message Message(test=2432232314) delivery_id=None timestamp=2021-02-25T15:02:10+00:00 matched_key_id='stripe-2026'
  Stripe expired = ProtocolDataError: ProtocolDataError(reason='timestamp_window') [] timestamp_window
  Stripe repeated independently = Message Message(test=2432232314) delivery_id=None timestamp=2021-02-25T15:02:10+00:00 matched_key_id='stripe-2026'
  one changed body byte = ProtocolDataError: ProtocolDataError(reason='invalid_signature') [] invalid_signature
  trailing newline = ProtocolDataError: ProtocolDataError(reason='invalid_signature') [] invalid_signature
  new timestamp = ProtocolDataError: ProtocolDataError(reason='invalid_signature') [] invalid_signature
  new delivery id = ProtocolDataError: ProtocolDataError(reason='invalid_signature') [] invalid_signature
  GitHub changed body = ProtocolDataError: ProtocolDataError(reason='invalid_signature') [] invalid_signature
  RFC 4231 test case 1 HMAC-SHA256 with the last signature byte changed from f7 to f6 = ProtocolDataError: ProtocolDataError(reason='invalid_signature') [] invalid_signature
  RFC 4231 test case 1 HMAC-SHA512 with the last signature byte changed from 54 to 55 = ProtocolDataError: ProtocolDataError(reason='invalid_signature') [] invalid_signature
  300 seconds past = Message Message(test=2432232314) delivery_id='msg_p5jXN8AQM9LWM0D4loKWxJek' timestamp=2021-02-25T15:02:10+00:00 matched_key_id='active'
  past bound exceeded = ProtocolDataError: ProtocolDataError(reason='timestamp_window') [] timestamp_window
  30 seconds future = Message Message(test=2432232314) delivery_id='msg_p5jXN8AQM9LWM0D4loKWxJek' timestamp=2021-02-25T15:02:10+00:00 matched_key_id='active'
  future bound exceeded = ProtocolDataError: ProtocolDataError(reason='timestamp_window') [] timestamp_window
  zero past tolerance = Message Message(test=2432232314) delivery_id='msg_p5jXN8AQM9LWM0D4loKWxJek' timestamp=2021-02-25T15:02:10+00:00 matched_key_id='active'
  zero past tolerance exceeded = ProtocolDataError: ProtocolDataError(reason='timestamp_window') [] timestamp_window
  zero future tolerance exceeded = ProtocolDataError: ProtocolDataError(reason='timestamp_window') [] timestamp_window
  fractional tolerance = Message Message(test=2432232314) delivery_id='msg_p5jXN8AQM9LWM0D4loKWxJek' timestamp=2021-02-25T15:02:10+00:00 matched_key_id='active'
  fractional tolerance exceeded = ProtocolDataError: ProtocolDataError(reason='timestamp_window') [] timestamp_window
  offset clock = Message Message(test=2432232314) delivery_id='msg_p5jXN8AQM9LWM0D4loKWxJek' timestamp=2021-02-25T15:02:10+00:00 matched_key_id='active'
  timestamp after datetime.max = ProtocolDataError: ProtocolDataError(reason='timestamp_window') [] timestamp_window
  earliest clock = ProtocolDataError: ProtocolDataError(reason='timestamp_window') [] timestamp_window
  bad signature first = Message Message(test=2432232314) delivery_id='msg_p5jXN8AQM9LWM0D4loKWxJek' timestamp=2021-02-25T15:02:10+00:00 matched_key_id='active'
  signature header twice = Message Message(test=2432232314) delivery_id='msg_p5jXN8AQM9LWM0D4loKWxJek' timestamp=2021-02-25T15:02:10+00:00 matched_key_id='active'
  rotated to the new key = Message Message(test=2432232314) delivery_id='msg_p5jXN8AQM9LWM0D4loKWxJek' timestamp=2021-02-25T15:02:10+00:00 matched_key_id='active'
  both keys match = Message Message(test=2432232314) delivery_id='msg_p5jXN8AQM9LWM0D4loKWxJek' timestamp=2021-02-25T15:02:10+00:00 matched_key_id='first'
  only the retired key = ProtocolDataError: ProtocolDataError(reason='invalid_signature') [] invalid_signature
  empty key set = ProtocolDataError: ProtocolDataError(reason='missing_key') [] missing_key
  uppercase hex = ProtocolDataError: ProtocolDataError(reason='malformed') [] malformed
  other version prefix = ProtocolDataError: ProtocolDataError(reason='malformed_signature') [] malformed_signature
  unpadded base64 = ProtocolDataError: ProtocolDataError(reason='malformed_signature') [] malformed_signature
  short signature = ProtocolDataError: ProtocolDataError(reason='malformed_signature') [] malformed_signature
  empty element = ProtocolDataError: ProtocolDataError(reason='malformed_signature') [] malformed_signature
  prefix only = ProtocolDataError: ProtocolDataError(reason='malformed_signature') [] malformed_signature
  no signature = ProtocolDataError: ProtocolDataError(reason='malformed_signature') [] malformed_signature
  hexadecimal timestamp = ProtocolDataError: ProtocolDataError(reason='malformed_signature') [] malformed_signature
  signed timestamp = ProtocolDataError: ProtocolDataError(reason='malformed_signature') [] malformed_signature
  spaced timestamp = ProtocolDataError: ProtocolDataError(reason='malformed_signature') [] malformed_signature
  twenty digit timestamp = ProtocolDataError: ProtocolDataError(reason='malformed_signature') [] malformed_signature
  no timestamp = ProtocolDataError: ProtocolDataError(reason='malformed_signature') [] malformed_signature
  delivery id with obs-text = ProtocolDataError: ProtocolDataError(reason='malformed_signature') [] malformed_signature
  no delivery id = ProtocolDataError: ProtocolDataError(reason='malformed_signature') [] malformed_signature
  repeated timestamp = ProtocolDataError: ProtocolDataError(reason='malformed_signature') [] malformed_signature
  odd hex = ProtocolDataError: ProtocolDataError(reason='malformed_signature') [] malformed_signature
  malformed before window = ProtocolDataError: ProtocolDataError(reason='malformed_signature') [] malformed_signature
  window before signature = ProtocolDataError: ProtocolDataError(reason='timestamp_window') [] timestamp_window
  nine signatures = ProtocolDataError: ProtocolDataError(reason='too_large') [] too_large
  nine malformed signatures = ProtocolDataError: ProtocolDataError(reason='too_large') [] too_large
  nine keys = ProtocolDataError: ProtocolDataError(reason='too_large') [] too_large
  nine keys allowed = Message Message(test=2432232314) delivery_id='msg_p5jXN8AQM9LWM0D4loKWxJek' timestamp=2021-02-25T15:02:10+00:00 matched_key_id='key-0'
  one signature allowed = Message Message(test=2432232314) delivery_id='msg_p5jXN8AQM9LWM0D4loKWxJek' timestamp=2021-02-25T15:02:10+00:00 matched_key_id='active'
  text body = ConfigurationError: ConfigurationError(reason='invalid_value', field_path='raw_body') [field_path=('raw_body',)] invalid_value
  bytearray body = ConfigurationError: ConfigurationError(reason='invalid_value', field_path='raw_body') [field_path=('raw_body',)] invalid_value
  header mapping = ConfigurationError: ConfigurationError(reason='invalid_value', field_path='headers') [field_path=('headers',)] invalid_value
  header lists = ConfigurationError: ConfigurationError(reason='invalid_value', field_path='headers') [field_path=('headers',)] invalid_value
  header bytes = ConfigurationError: ConfigurationError(reason='invalid_value', field_path='headers') [field_path=('headers',)] invalid_value
  header triple = ConfigurationError: ConfigurationError(reason='invalid_value', field_path='headers') [field_path=('headers',)] invalid_value
  key tuple = ConfigurationError: ConfigurationError(reason='invalid_value', field_path='keys') [field_path=('keys',)] invalid_value
  naive now = ConfigurationError: ConfigurationError(reason='invalid_value', field_path='now') [field_path=('now',)] invalid_value
  text now = ConfigurationError: ConfigurationError(reason='invalid_value', field_path='now') [field_path=('now',)] invalid_value
  text body and naive now = ConfigurationError: ConfigurationError(reason='invalid_value', field_path='raw_body') [field_path=('raw_body',)] invalid_value
  options mapping = ConfigurationError: ConfigurationError(reason='invalid_value', field_path='options') [field_path=('options',)] invalid_value
  foreign key = ConfigurationError: ConfigurationError(reason='wrong_capability', field_path='keys.0') [field_path=('keys', '0')] wrong_capability
  repeated key id = ConfigurationError: ConfigurationError(reason='invalid_value', field_path='keys.1.id') [field_path=('keys', '1', 'id')] invalid_value
  key integer id ! TypeError: id must be a string []
  key empty id ! ConfigurationError: ConfigurationError(reason='invalid_value', field_path='id') [field_path=('id',)] invalid_value
  key id with NUL ! ConfigurationError: ConfigurationError(reason='invalid_value', field_path='id') [field_path=('id',)] invalid_value
  key id with CR ! ConfigurationError: ConfigurationError(reason='invalid_value', field_path='id') [field_path=('id',)] invalid_value
  key id with LF ! ConfigurationError: ConfigurationError(reason='invalid_value', field_path='id') [field_path=('id',)] invalid_value
  key bytearray secret ! TypeError: secret must be bytes []
  key text secret ! TypeError: secret must be bytes []
  key empty secret = HmacKey(id='key')
  key positional=TypeError
  key id and secret = ('active', 13)
  key assignment ! FrozenInstanceError: HmacKey is immutable []
  key deletion ! FrozenInstanceError: HmacKey is immutable []
  key pickling ! TypeError: HmacKey cannot be pickled []
  key copies are the key=True
  key public names=['HmacKey']
  marker event ! ProtocolDataError: ProtocolDataError(reason='value') [] value context=None
  marker JSON ! ProtocolDataError: ProtocolDataError(reason='malformed') [] malformed context=None
  marker signature ! ProtocolDataError: ProtocolDataError(reason='malformed_signature') [] malformed_signature context=None
  marker key ! ProtocolDataError: ProtocolDataError(reason='invalid_signature') [] invalid_signature context=None
  markers shown=[]
