[DRE-commits] [ruby-mail] 02/09: Imported Upstream version 2.6.1+dfsg1
Caitlin Matos
cm-guest at moszumanska.debian.org
Sat Jul 26 03:28:33 UTC 2014
This is an automated email from the git hooks/post-receive script.
cm-guest pushed a commit to branch master
in repository ruby-mail.
commit 1c67f8706a35dc07034558093c643d3ae095efed
Author: Caitlin Matos <caitlin.matos at zoho.com>
Date: Wed Jul 23 21:17:01 2014 -0400
Imported Upstream version 2.6.1+dfsg1
---
.gitignore | 4 +
.travis.yml | 47 +-
Appraisals | 27 +
CHANGELOG.rdoc | 18 +-
CONTRIBUTING.md | 19 +-
Dependencies.txt | 1 -
Gemfile | 16 +-
README.md | 60 +-
Rakefile | 12 +-
VERSION | 4 +
gemfiles/mime_types_1.16.gemfile | 16 +
gemfiles/mime_types_2.0.gemfile | 16 +
gemfiles/mime_types_2.1.gemfile | 16 +
gemfiles/mime_types_2.2.gemfile | 16 +
gemfiles/mime_types_2.3.gemfile | 16 +
gemfiles/mime_types_2.latest.gemfile | 16 +
gemfiles/mime_types_edge.gemfile | 16 +
lib/VERSION | 4 -
lib/load_parsers.rb | 35 -
lib/mail.rb | 2 +-
lib/mail/body.rb | 4 +-
lib/mail/core_extensions/string.rb | 14 +-
lib/mail/elements/address.rb | 120 +-
lib/mail/elements/address_list.rb | 61 +-
lib/mail/elements/content_disposition_element.rb | 10 +-
lib/mail/elements/content_location_element.rb | 8 +-
.../elements/content_transfer_encoding_element.rb | 13 +-
lib/mail/elements/content_type_element.rb | 12 +-
lib/mail/elements/date_time_element.rb | 10 +-
lib/mail/elements/envelope_from_element.rb | 14 +-
lib/mail/elements/message_ids_element.rb | 7 +-
lib/mail/elements/mime_version_element.rb | 10 +-
lib/mail/elements/phrase_list.rb | 9 +-
lib/mail/elements/received_element.rb | 10 +-
lib/mail/encodings.rb | 1 -
lib/mail/envelope.rb | 5 -
lib/mail/field.rb | 70 +-
lib/mail/field_list.rb | 36 +-
lib/mail/fields/common/common_address.rb | 35 +-
lib/mail/fields/common/common_date.rb | 7 -
lib/mail/fields/common/common_field.rb | 2 +-
lib/mail/fields/content_transfer_encoding_field.rb | 6 -
lib/mail/fields/resent_sender_field.rb | 2 +-
lib/mail/fields/sender_field.rb | 2 +-
lib/mail/fields/unstructured_field.rb | 8 +-
lib/mail/header.rb | 30 +-
lib/mail/mail.rb | 12 +
lib/mail/matchers/has_sent_mail.rb | 35 +-
lib/mail/message.rb | 29 +-
lib/mail/multibyte/unicode.rb | 2 +-
lib/mail/network/delivery_methods/sendmail.rb | 2 +-
lib/mail/network/delivery_methods/smtp.rb | 14 +-
lib/mail/network/retriever_methods/imap.rb | 31 +-
lib/mail/parsers.rb | 26 +
lib/mail/parsers/address_lists.rb | 64 -
lib/mail/parsers/address_lists.treetop | 19 -
lib/mail/parsers/address_lists_parser.rb | 132 +
lib/mail/parsers/content_disposition.rb | 535 -
lib/mail/parsers/content_disposition.treetop | 46 -
lib/mail/parsers/content_disposition_parser.rb | 67 +
lib/mail/parsers/content_location.rb | 139 -
lib/mail/parsers/content_location.treetop | 20 -
lib/mail/parsers/content_location_parser.rb | 35 +
lib/mail/parsers/content_transfer_encoding.rb | 201 -
lib/mail/parsers/content_transfer_encoding.treetop | 18 -
.../parsers/content_transfer_encoding_parser.rb | 33 +
lib/mail/parsers/content_type.rb | 971 --
lib/mail/parsers/content_type.treetop | 68 -
lib/mail/parsers/content_type_parser.rb | 64 +
lib/mail/parsers/date_time.rb | 114 -
lib/mail/parsers/date_time.treetop | 11 -
lib/mail/parsers/date_time_parser.rb | 36 +
lib/mail/parsers/envelope_from.rb | 194 -
lib/mail/parsers/envelope_from.treetop | 32 -
lib/mail/parsers/envelope_from_parser.rb | 45 +
lib/mail/parsers/message_ids.rb | 45 -
lib/mail/parsers/message_ids.treetop | 15 -
lib/mail/parsers/message_ids_parser.rb | 39 +
lib/mail/parsers/mime_version.rb | 144 -
lib/mail/parsers/mime_version.treetop | 19 -
lib/mail/parsers/mime_version_parser.rb | 41 +
lib/mail/parsers/phrase_lists.rb | 45 -
lib/mail/parsers/phrase_lists.treetop | 15 -
lib/mail/parsers/phrase_lists_parser.rb | 33 +
lib/mail/parsers/ragel.rb | 17 +
lib/mail/parsers/ragel/common.rl | 184 +
lib/mail/parsers/ragel/date_time.rl | 30 +
lib/mail/parsers/ragel/parser_info.rb | 61 +
lib/mail/parsers/ragel/ruby.rb | 39 +
.../ragel/ruby/machines/address_lists_machine.rb | 14864 +++++++++++++++++++
.../ruby/machines/address_lists_machine.rb.rl | 37 +
.../ruby/machines/content_disposition_machine.rb | 751 +
.../machines/content_disposition_machine.rb.rl | 37 +
.../ruby/machines/content_location_machine.rb | 614 +
.../ruby/machines/content_location_machine.rb.rl | 37 +
.../machines/content_transfer_encoding_machine.rb | 447 +
.../content_transfer_encoding_machine.rb.rl | 37 +
.../ragel/ruby/machines/content_type_machine.rb | 825 +
.../ragel/ruby/machines/content_type_machine.rb.rl | 37 +
.../ragel/ruby/machines/date_time_machine.rb | 817 +
.../ragel/ruby/machines/date_time_machine.rb.rl | 37 +
.../ragel/ruby/machines/envelope_from_machine.rb | 2129 +++
.../ruby/machines/envelope_from_machine.rb.rl | 37 +
.../ragel/ruby/machines/message_ids_machine.rb | 1570 ++
.../ragel/ruby/machines/message_ids_machine.rb.rl | 37 +
.../ragel/ruby/machines/mime_version_machine.rb | 440 +
.../ragel/ruby/machines/mime_version_machine.rb.rl | 37 +
.../ragel/ruby/machines/phrase_lists_machine.rb | 564 +
.../ragel/ruby/machines/phrase_lists_machine.rb.rl | 37 +
lib/mail/parsers/ragel/ruby/machines/rb_actions.rl | 51 +
.../ragel/ruby/machines/received_machine.rb | 5144 +++++++
.../ragel/ruby/machines/received_machine.rb.rl | 37 +
lib/mail/parsers/ragel/ruby/parser.rb.rl.erb | 37 +
lib/mail/parsers/received.rb | 71 -
lib/mail/parsers/received.treetop | 11 -
lib/mail/parsers/received_parser.rb | 47 +
lib/mail/parsers/rfc2045.rb | 421 -
lib/mail/parsers/rfc2045.treetop | 35 -
lib/mail/parsers/rfc2822.rb | 5397 -------
lib/mail/parsers/rfc2822.treetop | 408 -
lib/mail/parsers/rfc2822_obsolete.rb | 3768 -----
lib/mail/parsers/rfc2822_obsolete.treetop | 241 -
lib/mail/parts_list.rb | 8 +-
lib/mail/patterns.rb | 4 +-
lib/mail/utilities.rb | 80 +-
lib/mail/version.rb | 2 +-
lib/mail/version_specific/ruby_1_8.rb | 2 +-
lib/mail/version_specific/ruby_1_9.rb | 17 +-
lib/tasks/treetop.rake | 10 -
mail.gemspec | 8 +-
reference/US ASCII Table.txt | 130 -
...035 Domain Implementation and Specification.txt | 3083 ----
...ent-Type Header Field for Internet Messages.txt | 451 -
...ications of MIME for Internet Mail Gateways.txt | 586 -
...1345 Character Mnemonics and Character Sets.txt | 5761 -------
...nism For Multimedia Mail Format Information.txt | 675 -
...TP Service Extension for 8bit-MIMEtransport.txt | 339 -
reference/rfc1892 Multipart Report .txt | 227 -
reference/rfc1893 Mail System Status Codes.txt | 843 --
...5 Multipurpose Internet Mail Extensions (1).txt | 1739 ---
...6 Multipurpose Internet Mail Extensions (2).txt | 2467 ---
...7 Multipurpose Internet Mail Extensions (3).txt | 843 --
...8 Multipurpose Internet Mail Extensions (4).txt | 1180 --
...9 Multipurpose Internet Mail Extensions (5).txt | 1347 --
.../rfc2111 Content-ID and Message-ID URLs.txt | 283 -
.../rfc2183 Content-Disposition Header Field.txt | 675 -
...Parameter Value and Encoded Word Extensions.txt | 563 -
...rfc2387 MIME Multipart-Related Content-type.txt | 563 -
.../rfc2821 Simple Mail Transfer Protocol.txt | 3711 -----
reference/rfc2822 Internet Message Format.txt | 2859 ----
...ting of Mail System Administrative Messages.txt | 396 -
...fc3696 Checking and Transformation of Names.txt | 898 --
.../rfc4155 The application-mbox Media Type.txt | 502 -
...mented BNF for Syntax Specifications - ABNF.txt | 899 --
...r the Format of ARPA Internet Text Messages.txt | 2900 ----
spec/mail/body_spec.rb | 29 +-
spec/mail/elements/address_list_spec.rb | 24 +-
spec/mail/elements/address_spec.rb | 7 +
spec/mail/encodings_spec.rb | 23 +
spec/mail/example_emails_spec.rb | 1 +
spec/mail/fields/common/common_field_spec.rb | 4 +
spec/mail/fields/content_type_field_spec.rb | 1 +
spec/mail/fields/unstructured_field_spec.rb | 6 +
spec/mail/header_spec.rb | 25 +-
spec/mail/message_spec.rb | 203 +-
spec/mail/network/retriever_methods/imap_spec.rb | 5 +
spec/mail/network_spec.rb | 14 +-
spec/mail/parsers/address_lists_parser_spec.rb | 23 +-
.../content_transfer_encoding_parser_spec.rb | 42 +-
spec/mail/parts_list_spec.rb | 19 +-
spec/mail/utilities_spec.rb | 26 +
spec/matchers_spec.rb | 28 +
{lib/tasks => tasks}/corpus.rake | 2 +-
tasks/ragel.rake | 54 +
test.rb | 6 +-
175 files changed, 30687 insertions(+), 47554 deletions(-)
diff --git a/.gitignore b/.gitignore
index a20984f..61cab1e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,3 +15,7 @@
*.swp
.idea
.rbx
+/.idea
+/.rbenv-vars
+/.ruby-version
+gemfiles/*.lock
diff --git a/.travis.yml b/.travis.yml
index a802327..aa64d5a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,18 +1,45 @@
language: ruby
+bundler_args: --path vendor/bundle
+script: bundle exec rake
+env:
+ - RUBYOPT=-w
+before_install:
+ - gem install bundler
+ - bundle config --local without local_development
+gemfile:
+ - gemfiles/mime_types_1.16.gemfile
+ - gemfiles/mime_types_2.0.gemfile
+ - gemfiles/mime_types_2.1.gemfile
+ - gemfiles/mime_types_2.2.gemfile
+ - gemfiles/mime_types_2.3.gemfile
+ - gemfiles/mime_types_2.latest.gemfile
+ - gemfiles/mime_types_edge.gemfile
rvm:
- - 1.8.7
- - 1.9.2
- - 1.9.3
- - 2.0.0
+ - 1.8.7-p374
+ - 1.9.2-p320
+ - 1.9.3-p327
+ - 2.0.0-p451
+ - 2.1.2
- ruby-head
- - jruby-18mode
- - jruby-19mode
+ - jruby
- jruby-head
- - rbx-18mode
- - rbx-19mode
+ - rbx-2
matrix:
+ exclude:
+ - rvm: 1.8.7-p374
+ gemfile: gemfiles/mime_types_2.0.gemfile
+ - rvm: 1.8.7-p374
+ gemfile: gemfiles/mime_types_2.1.gemfile
+ - rvm: 1.8.7-p374
+ gemfile: gemfiles/mime_types_2.2.gemfile
+ - rvm: 1.8.7-p374
+ gemfile: gemfiles/mime_types_2.3.gemfile
+ - rvm: 1.8.7-p374
+ gemfile: gemfiles/mime_types_2.latest.gemfile
+ - rvm: 1.8.7-p374
+ gemfile: gemfiles/mime_types_edge.gemfile
allow_failures:
- rvm: ruby-head # green, but unstable
- rvm: jruby-head # green, but unstable
- - rvm: rbx-18mode # seems to be running 1.9 mode instead!?
- - rvm: rbx-19mode # segfaulting in String#ascii_only?
+ - rvm: rbx-2 # see https://github.com/rubinius/rubinius/issues/3050
+ fast_finish: true
diff --git a/Appraisals b/Appraisals
new file mode 100644
index 0000000..3e5c158
--- /dev/null
+++ b/Appraisals
@@ -0,0 +1,27 @@
+appraise "mime-types-1.16" do
+ gem "mime-types", "~> 1.16"
+end
+
+appraise "mime-types-2.0" do
+ gem "mime-types", "~> 2.0.0"
+end
+
+appraise "mime-types-2.1" do
+ gem "mime-types", "~> 2.1.0"
+end
+
+appraise "mime-types-2.2" do
+ gem "mime-types", "~> 2.2.0"
+end
+
+appraise "mime-types-2.3" do
+ gem "mime-types", "~> 2.3.0"
+end
+
+appraise "mime-types-2.latest" do
+ gem "mime-types", "~> 2.3"
+end
+
+appraise "mime-types-edge" do
+ gem "mime-types", :github => "halostatue/mime-types"
+end
diff --git a/CHANGELOG.rdoc b/CHANGELOG.rdoc
index bb08bef..380769a 100644
--- a/CHANGELOG.rdoc
+++ b/CHANGELOG.rdoc
@@ -1,9 +1,21 @@
== HEAD
+Features:
+
+Performance:
+
+Bugs:
+
+== Version 2.6.1 - Sun Jun 8 15:34 +1100 2014 Mikel Lindsaar <mikel at reinteractive.net>
+
+Features:
+* Silence warnings on loading ragel-generated parsers (bf4)
-== Version 2.5.4 - Tue May 14 14:45:00 +1100 2013 Mikel Lindsaar <mikel at lindsaar.net>
+== Version 2.6.0 - Mon Jun 2 22:49 +1100 2014 Mikel Lindsaar <mikel at reinteractive.net>
Features:
+* Allow interceptors and observers to be unregistered (zuhao)
+* Added feature to find the mail in uid (taketin)
* Save settings passed to TestMailer#new (svanderbleek)
* Allow the setting of envelope from directly (jeremy)
* Accept other IETF/IANA-registered Content-Types and Content-Transfer-Encodings (jeremy)
@@ -19,9 +31,13 @@ Features:
* Close pull request 389 - Don't add superfluous message headers to MIME parts (djmaze, jeremy)
Performance:
+* Migrate to RAGEL based parser, awesome work by (bpot)
+* Performance improvements for people parsing email headers (ConradIrwin)
* Close pull request 488 - Speed up field construction & comparison (bpot)
Bugs:
+* Fix for when content looks like field name (kjg)
+* Don't change original when you change a copy (TylerRick)
* Don't include separating semicolon in paramter value when sanitizing (bpot)
* Fix fencepost encoding problem with binhex strings and only one token (drasch)
* Fix sendmail delivery to addresses with a leading hyphen (lifo, jeremy)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 541082d..2e763dc 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -14,8 +14,10 @@ pull request merged quickly:
a spec!
6. Test the spec _at_ _least_ against MRI-1.9.3 and MRI-1.8.7
7. Update the README if needed to reflect your change / addition
-8. With all specs passing push your changes back to your fork
-9. Send me a pull request
+8. Update the CHANGELOG and give yourself credit
+9. With all specs passing push your changes back to your fork
+10. Send me a pull request.
+ - If it needs any changes, please push or force push to the same branch you made the pull request from. GitHub will just update the pull request with your changes.
Note, specs that break MRI 1.8.7 or 1.9.3 will not be accepted.
@@ -43,3 +45,16 @@ Syntax:
* Follow the conventions you see used in the source already.
And in case we didn't emphasize it enough: we love specs!
+
+### Testing against mime-types versions:
+
+Use [appraisal](https://github.com/thoughtbot/appraisal) to run against all supported versions of mime-types.
+
+1. Run `(bundle check || bundle) && appraisal` so that all the 'appraised' gemfiles are bundled.
+2. Run either `appraisal rake` or `rake appraisal` to run all the tests.
+
+To run only one 'appraised' gemfile, run. e.g. `BUNDLE_GEMFILE=gemfiles/mime_types_edge.gemfile (bundle check || bundle) && rake`
+
+To change the appraisals, modify the `Appraisals` file, run `appraisal`, commit the generated gemfiles, and modify the .travis.yml matrix.
+
+To run on all rubies / gemfiles, just like TravisCI, see [WWTD](https://github.com/grosser/wwtd).
diff --git a/Dependencies.txt b/Dependencies.txt
index 2c8391b..6899fec 100644
--- a/Dependencies.txt
+++ b/Dependencies.txt
@@ -1,3 +1,2 @@
-treetop: we need to include this in the gem spec
tlsmail: if ruby < 1.8.6... we could make it optional, or embed it in Mail
mime/types: I think we embed a simplified version, or help maintain it, it is old (2006)
diff --git a/Gemfile b/Gemfile
index 5c66e37..8228d32 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,13 +1,15 @@
-source 'https://rubygems.org'
+source "https://rubygems.org"
gemspec
-gem "treetop", "~> 1.4.10"
-gem "mime-types", "~> 1.16"
-gem "tlsmail" if RUBY_VERSION <= '1.8.6'
+gem "tlsmail", "~> 0.0.1" if RUBY_VERSION <= "1.8.6"
+gem "jruby-openssl", :platforms => :jruby
-gem 'jruby-openssl', :platform => :jruby
+group :development, :test do
+ gem "appraisal", "~> 1.0"
+end
-group :test do
- gem "ruby-debug", :platform => :mri_18
+# For gems not required to run tests
+group :local_development, :test do
+ gem "ruby-debug", :platforms => :mri_18
end
diff --git a/README.md b/README.md
index 23a28bd..e97c970 100644
--- a/README.md
+++ b/README.md
@@ -15,11 +15,11 @@ Built from my experience with TMail, it is designed to be a pure ruby
implementation that makes generating, sending and parsing emails a no
brainer.
-It is also designed form the ground up to work with Ruby 1.9. This is because
-Ruby 1.9 handles text encodings much more magically than Ruby 1.8.x and so
-these features have been taken full advantage of in this library allowing
-Mail to handle a lot more messages more cleanly than TMail. Mail does run on
-Ruby 1.8.x... it's just not as fun to code.
+It is also designed form the ground up to work with the more modern versions
+of Ruby. This is because Ruby > 1.9 handles text encodings much more wonderfully
+than Ruby 1.8.x and so these features have been taken full advantage of in this
+library allowing Mail to handle a lot more messages more cleanly than TMail.
+Mail does run on Ruby 1.8.x... it's just not as fun to code.
Finally, Mail has been designed with a very simple object oriented system
that really opens up the email messages you are parsing, if you know what
@@ -44,14 +44,21 @@ Compatibility
Every Mail commit is tested by Travis on the [following platforms](https://github.com/mikel/mail/blob/master/.travis.yml)
-* ruby-1.8.7-p370 [ i686 ]
-* ruby-1.9.2-p290 [ x86_64 ]
+* ruby-1.8.7-p374 [ i686 ]
+* ruby-1.9.2-p320 [ x86_64 ]
* ruby-1.9.3-p327 [ x86_64 ]
-* ruby-2.0.0-rc1 [ x86_64 ]
-* jruby-1.6.8 [ x86_64 ]
-* jruby-1.7.0 [ x86_64 ]
-* rbx-d18 [ x86_64 ]
-* rbx-d19 [ x86_64 ]
+* ruby-2.0.0-p451 [ x86_64 ]
+* ruby-2.1.2 [ x86_64 ]
+* ruby-head [ x86_64 ]
+* jruby [ x86_64 ]
+* jruby-head [ x86_64 ]
+* rbx-2 [ x86_64 ]
+
+Testing a specific mime type (needed for 1.8.7 for example) can be done manually with:
+
+```sh
+BUNDLE_GEMFILE=gemfiles/mime_types_1.16.gemfile (bundle check || bundle) && rake
+```
Discussion
----------
@@ -186,6 +193,8 @@ mail['from'] = 'mikel at test.lindsaar.net'
mail[:to] = 'you at test.lindsaar.net'
mail.subject = 'This is a test email'
+mail.header['X-Custom-Header'] = 'custom value'
+
mail.to_s #=> "From: mikel at test.lindsaar.net\r\nTo: you at ...
```
@@ -228,10 +237,10 @@ easy as:
```ruby
Mail.deliver do
- from 'me at test.lindsaar.net'
- to 'you at test.lindsaar.net'
- subject 'Here is the image you wanted'
- body File.read('body.txt')
+ from 'me at test.lindsaar.net'
+ to 'you at test.lindsaar.net'
+ subject 'Here is the image you wanted'
+ body File.read('body.txt')
add_file '/full/path/to/somefile.png'
end
```
@@ -266,6 +275,15 @@ mail.delivery_method :sendmail
mail.deliver
```
+Sending via smtp (for example to [mailcatcher](https://github.com/sj26/mailcatcher))
+```ruby
+
+Mail.defaults do
+ delivery_method :smtp, address: "localhost", port: 1025
+end
+```
+
+
Exim requires its own delivery manager, and can be used like so:
```ruby
@@ -319,7 +337,7 @@ emails.length #=> LOTS!
```ruby
mail = Mail.read('/path/to/message.eml')
-mail.envelope.from #=> 'mikel at test.lindsaar.net'
+mail.envelope_from #=> 'mikel at test.lindsaar.net'
mail.from.addresses #=> ['mikel at test.lindsaar.net', 'ada at test.lindsaar.net']
mail.sender.address #=> 'mikel at test.lindsaar.net'
mail.to #=> 'bob at test.lindsaar.net'
@@ -350,7 +368,7 @@ mail.parts[1].content_type_parameters #=> {'name' => 'my.pdf'}
Mail generates a tree of parts. Each message has many or no parts. Each part
is another message which can have many or no parts.
-A message will only have parts if it is a multipart/mixed or related/mixed
+A message will only have parts if it is a multipart/mixed or multipart/related
content type and has a boundary defined.
### Testing and extracting attachments
@@ -363,7 +381,7 @@ mail.attachments.each do | attachment |
filename = attachment.filename
begin
File.open(images_dir + filename, "w+b", 0644) {|f| f.write attachment.body.decoded}
- rescue Exception => e
+ rescue => e
puts "Unable to save data for #{filename} because #{e.message}"
end
end
@@ -546,7 +564,7 @@ Using Mail with Testing or Spec'ing Libraries
If mail is part of your system, you'll need a way to test it without actually
sending emails, the TestMailer can do this for you.
-```
+```ruby
require 'mail'
=> true
Mail.defaults do
@@ -572,7 +590,7 @@ Mail::TestMailer.deliveries.clear
There is also a set of RSpec matchers stolen fr^H^H^H^H^H^H^H^H inspired by Shoulda's ActionMailer matchers (you'll want to set <code>delivery_method</code> as above too):
-```
+```ruby
Mail.defaults do
delivery_method :test # in practice you'd do this in spec_helper.rb
end
diff --git a/Rakefile b/Rakefile
index 8c6e7b0..5b32231 100644
--- a/Rakefile
+++ b/Rakefile
@@ -1,4 +1,6 @@
-ENV['BUNDLE_GEMFILE'] = File.expand_path('../Gemfile', __FILE__)
+if !ENV["APPRAISAL_INITIALIZED"] && !ENV["TRAVIS"]
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __FILE__)
+end
require 'rubygems'
require 'bundler/setup'
@@ -17,5 +19,11 @@ RSpec::Core::RakeTask.new(:spec) do |t|
t.rspec_opts = %w(--backtrace --color)
end
+begin
+ require "appraisal"
+rescue LoadError
+ warn "Appraisal is only available in test/development"
+end
+
# load custom rake tasks
-Dir["#{File.dirname(__FILE__)}/lib/tasks/**/*.rake"].sort.each { |ext| load ext }
+Dir["#{File.dirname(__FILE__)}/tasks/**/*.rake"].sort.each { |ext| load ext }
diff --git a/VERSION b/VERSION
new file mode 100644
index 0000000..8923560
--- /dev/null
+++ b/VERSION
@@ -0,0 +1,4 @@
+major:2
+minor:6
+patch:1
+build:
diff --git a/gemfiles/mime_types_1.16.gemfile b/gemfiles/mime_types_1.16.gemfile
new file mode 100644
index 0000000..35def3f
--- /dev/null
+++ b/gemfiles/mime_types_1.16.gemfile
@@ -0,0 +1,16 @@
+# This file was generated by Appraisal
+
+source "https://rubygems.org"
+
+gem "jruby-openssl", :platforms => :jruby
+gem "mime-types", "~> 1.16"
+
+group :development, :test do
+ gem "appraisal", "~> 1.0"
+end
+
+group :local_development, :test do
+ gem "ruby-debug", :platforms => :mri_18
+end
+
+gemspec :path => "../"
diff --git a/gemfiles/mime_types_2.0.gemfile b/gemfiles/mime_types_2.0.gemfile
new file mode 100644
index 0000000..37c77df
--- /dev/null
+++ b/gemfiles/mime_types_2.0.gemfile
@@ -0,0 +1,16 @@
+# This file was generated by Appraisal
+
+source "https://rubygems.org"
+
+gem "jruby-openssl", :platforms => :jruby
+gem "mime-types", "~> 2.0.0"
+
+group :development, :test do
+ gem "appraisal", "~> 1.0"
+end
+
+group :local_development, :test do
+ gem "ruby-debug", :platforms => :mri_18
+end
+
+gemspec :path => "../"
diff --git a/gemfiles/mime_types_2.1.gemfile b/gemfiles/mime_types_2.1.gemfile
new file mode 100644
index 0000000..1e3c7c0
--- /dev/null
+++ b/gemfiles/mime_types_2.1.gemfile
@@ -0,0 +1,16 @@
+# This file was generated by Appraisal
+
+source "https://rubygems.org"
+
+gem "jruby-openssl", :platforms => :jruby
+gem "mime-types", "~> 2.1.0"
+
+group :development, :test do
+ gem "appraisal", "~> 1.0"
+end
+
+group :local_development, :test do
+ gem "ruby-debug", :platforms => :mri_18
+end
+
+gemspec :path => "../"
diff --git a/gemfiles/mime_types_2.2.gemfile b/gemfiles/mime_types_2.2.gemfile
new file mode 100644
index 0000000..38a07b3
--- /dev/null
+++ b/gemfiles/mime_types_2.2.gemfile
@@ -0,0 +1,16 @@
+# This file was generated by Appraisal
+
+source "https://rubygems.org"
+
+gem "jruby-openssl", :platforms => :jruby
+gem "mime-types", "~> 2.2.0"
+
+group :development, :test do
+ gem "appraisal", "~> 1.0"
+end
+
+group :local_development, :test do
+ gem "ruby-debug", :platforms => :mri_18
+end
+
+gemspec :path => "../"
diff --git a/gemfiles/mime_types_2.3.gemfile b/gemfiles/mime_types_2.3.gemfile
new file mode 100644
index 0000000..85c2007
--- /dev/null
+++ b/gemfiles/mime_types_2.3.gemfile
@@ -0,0 +1,16 @@
+# This file was generated by Appraisal
+
+source "https://rubygems.org"
+
+gem "jruby-openssl", :platforms => :jruby
+gem "mime-types", "~> 2.3.0"
+
+group :development, :test do
+ gem "appraisal", "~> 1.0"
+end
+
+group :local_development, :test do
+ gem "ruby-debug", :platforms => :mri_18
+end
+
+gemspec :path => "../"
diff --git a/gemfiles/mime_types_2.latest.gemfile b/gemfiles/mime_types_2.latest.gemfile
new file mode 100644
index 0000000..445a292
--- /dev/null
+++ b/gemfiles/mime_types_2.latest.gemfile
@@ -0,0 +1,16 @@
+# This file was generated by Appraisal
+
+source "https://rubygems.org"
+
+gem "jruby-openssl", :platforms => :jruby
+gem "mime-types", "~> 2.3"
+
+group :development, :test do
+ gem "appraisal", "~> 1.0"
+end
+
+group :local_development, :test do
+ gem "ruby-debug", :platforms => :mri_18
+end
+
+gemspec :path => "../"
diff --git a/gemfiles/mime_types_edge.gemfile b/gemfiles/mime_types_edge.gemfile
new file mode 100644
index 0000000..9f49939
--- /dev/null
+++ b/gemfiles/mime_types_edge.gemfile
@@ -0,0 +1,16 @@
+# This file was generated by Appraisal
+
+source "https://rubygems.org"
+
+gem "jruby-openssl", :platforms => :jruby
+gem "mime-types", :github => "halostatue/mime-types"
+
+group :development, :test do
+ gem "appraisal", "~> 1.0"
+end
+
+group :local_development, :test do
+ gem "ruby-debug", :platforms => :mri_18
+end
+
+gemspec :path => "../"
diff --git a/lib/VERSION b/lib/VERSION
deleted file mode 100644
index 43f19b0..0000000
--- a/lib/VERSION
+++ /dev/null
@@ -1,4 +0,0 @@
-major:2
-minor:5
-patch:4
-build:
diff --git a/lib/load_parsers.rb b/lib/load_parsers.rb
deleted file mode 100644
index 0fb6891..0000000
--- a/lib/load_parsers.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# encoding: utf-8
-# This file loads up the parsers for mail to use. It also will attempt to compile parsers
-# if they don't exist.
-#
-# It also only uses the compiler if we are running the SPEC suite
-module Mail # :doc:
- require 'treetop/runtime'
-
- def self.compile_parser(parser)
- require 'treetop/compiler'
- Treetop.load(File.join(File.dirname(__FILE__)) + "/mail/parsers/#{parser}")
- end
-
- parsers = %w[ rfc2822_obsolete rfc2822 address_lists phrase_lists
- date_time received message_ids envelope_from rfc2045
- mime_version content_type content_disposition
- content_transfer_encoding content_location ]
-
- if defined?(MAIL_SPEC_SUITE_RUNNING)
- parsers.each do |parser|
- compile_parser(parser)
- end
-
- else
- parsers.each do |parser|
- begin
- require "mail/parsers/#{parser}"
- rescue LoadError
- compile_parser(parser)
- end
- end
-
- end
-
-end
\ No newline at end of file
diff --git a/lib/mail.rb b/lib/mail.rb
index 7829b22..398eb67 100644
--- a/lib/mail.rb
+++ b/lib/mail.rb
@@ -76,7 +76,7 @@ module Mail # :doc:
require 'mail/envelope'
- require 'load_parsers'
+ require 'mail/parsers'
# Autoload header field elements and transfer encodings.
require 'mail/elements'
diff --git a/lib/mail/body.rb b/lib/mail/body.rb
index cd90d3d..5212bbf 100644
--- a/lib/mail/body.rb
+++ b/lib/mail/body.rb
@@ -127,9 +127,9 @@ module Mail
def sort_parts!
@parts.each do |p|
p.body.set_sort_order(@part_sort_order)
- @parts.sort!(@part_sort_order)
p.body.sort_parts!
end
+ @parts.sort!(@part_sort_order)
end
# Returns the raw source that the body was initialized with, without
@@ -257,7 +257,7 @@ module Mail
def split!(boundary)
self.boundary = boundary
- parts = raw_source.split(/(?:\A|\r\n)--#{Regexp.escape(boundary)}(?=(?:--)?\s*$)/)
+ parts = raw_source.split(/(?:\A|\r\n)--#{Regexp.escape(boundary || "")}(?=(?:--)?\s*$)/)
# Make the preamble equal to the preamble (if any)
self.preamble = parts[0].to_s.strip
# Make the epilogue equal to the epilogue (if any)
diff --git a/lib/mail/core_extensions/string.rb b/lib/mail/core_extensions/string.rb
index 0b973bf..1fa0e3e 100644
--- a/lib/mail/core_extensions/string.rb
+++ b/lib/mail/core_extensions/string.rb
@@ -1,11 +1,21 @@
# encoding: utf-8
class String #:nodoc:
+
+ if RUBY_VERSION >= '1.9'
+ # This 1.9 only regex can save a reasonable amount of time (~20%)
+ # by not matching "\r\n" so the string is returned unchanged in
+ # the common case.
+ CRLF_REGEX = Regexp.new("(?<!\r)\n|\r(?!\n)")
+ else
+ CRLF_REGEX = /\n|\r\n|\r/
+ end
+
def to_crlf
- to_str.gsub(/\n|\r\n|\r/) { "\r\n" }
+ to_str.gsub(CRLF_REGEX, "\r\n")
end
def to_lf
- to_str.gsub(/\n|\r\n|\r/) { "\n" }
+ to_str.gsub(/\r\n|\r/, "\n")
end
unless String.instance_methods(false).map {|m| m.to_sym}.include?(:blank?)
diff --git a/lib/mail/elements/address.rb b/lib/mail/elements/address.rb
index 230acf5..4db3449 100644
--- a/lib/mail/elements/address.rb
+++ b/lib/mail/elements/address.rb
@@ -1,7 +1,7 @@
# encoding: utf-8
module Mail
class Address
-
+
include Mail::Utilities
# Mail::Address handles all email addresses in Mail. It takes an email address string
@@ -22,21 +22,19 @@ module Mail
# a.to_s #=> 'Mikel Lindsaar <mikel at test.lindsaar.net> (My email address)'
def initialize(value = nil)
@output_type = :decode
- @tree = nil
- @raw_text = value
- case
- when value.nil?
+ if value.nil?
@parsed = false
+ @data = nil
return
else
parse(value)
end
end
- # Returns the raw imput of the passed in string, this is before it is passed
+ # Returns the raw input of the passed in string, this is before it is passed
# by the parser.
def raw
- @raw_text
+ @data.raw
end
# Returns a correctly formatted address for the email going out. If given
@@ -48,15 +46,14 @@ module Mail
# a.format #=> 'Mikel Lindsaar <mikel at test.lindsaar.net> (My email address)'
def format
parse unless @parsed
- case
- when tree.nil?
+ if @data.nil?
''
- when display_name
+ elsif display_name
[quote_phrase(display_name), "<#{address}>", format_comments].compact.join(" ")
- when address
+ elsif address
[address, format_comments].compact.join(" ")
else
- tree.text_value
+ raw
end
end
@@ -106,7 +103,7 @@ module Mail
# a.local #=> 'mikel'
def local
parse unless @parsed
- "#{obs_domain_list}#{get_local.strip}" if get_local
+ "#{@data.obs_domain_list}#{get_local.strip}" if get_local
end
# Returns the domain part (the right hand side of the @ sign in the email address) of
@@ -174,29 +171,24 @@ module Mail
def parse(value = nil)
@parsed = true
- case
- when value.nil?
+
+ case value
+ when NilClass
+ @data = nil
nil
- when value.class == String
- self.tree = Mail::AddressList.new(value).address_nodes.first
- else
- self.tree = value
+ when Mail::Parsers::AddressStruct
+ @data = value
+ when String
+ @raw_text = value
+ if value.blank?
+ @data = nil
+ else
+ address_list = Mail::Parsers::AddressListsParser.new.parse(value)
+ @data = address_list.addresses.first
+ end
end
end
-
- def get_domain
- if tree.respond_to?(:angle_addr) && tree.angle_addr.respond_to?(:addr_spec) && tree.angle_addr.addr_spec.respond_to?(:domain)
- @domain_text ||= tree.angle_addr.addr_spec.domain.text_value.strip
- elsif tree.respond_to?(:domain)
- @domain_text ||= tree.domain.text_value.strip
- elsif tree.respond_to?(:addr_spec) && tree.addr_spec.respond_to?(:domain)
- tree.addr_spec.domain.text_value.strip
- else
- nil
- end
- end
-
def strip_all_comments(string)
unless comments.blank?
comments.each do |comment|
@@ -209,7 +201,7 @@ module Mail
def strip_domain_comments(value)
unless comments.blank?
comments.each do |comment|
- if get_domain && get_domain.include?("(#{comment})")
+ if @data.domain && @data.domain.include?("(#{comment})")
value = value.gsub("(#{comment})", '')
end
end
@@ -217,20 +209,11 @@ module Mail
value.to_s.strip
end
- def get_comments
- if tree.respond_to?(:comments)
- @comments = tree.comments.map { |c| unparen(c.text_value.to_str) }
- else
- @comments = []
- end
- end
-
def get_display_name
- if tree.respond_to?(:display_name)
- name = unquote(tree.display_name.text_value.strip)
- str = strip_all_comments(name.to_s)
- elsif comments
- if domain
+ if @data.display_name
+ str = strip_all_comments(@data.display_name.to_s)
+ elsif @data.comments
+ if @data.domain
str = strip_domain_comments(format_comments)
else
str = nil
@@ -263,15 +246,6 @@ module Mail
end
end
- # Provides access to the Treetop parse tree for this address
- def tree
- @tree
- end
-
- def tree=(value)
- @tree = value
- end
-
def format_comments
if comments
comment_text = comments.map {|c| escape_paren(c) }.join(' ').squeeze(" ")
@@ -280,35 +254,17 @@ module Mail
nil
end
end
-
- def obs_domain_list
- if tree.respond_to?(:angle_addr)
- obs = tree.angle_addr.elements.select { |e| e.respond_to?(:obs_domain_list) }
- !obs.empty? ? obs.first.text_value : nil
- else
- nil
- end
- end
-
+
def get_local
- case
- when tree.respond_to?(:local_dot_atom_text)
- tree.local_dot_atom_text.text_value
- when tree.respond_to?(:angle_addr) && tree.angle_addr.respond_to?(:addr_spec) && tree.angle_addr.addr_spec.respond_to?(:local_part)
- tree.angle_addr.addr_spec.local_part.text_value
- when tree.respond_to?(:addr_spec) && tree.addr_spec.respond_to?(:local_part)
- tree.addr_spec.local_part.text_value
- when tree.respond_to?(:angle_addr) && tree.angle_addr.respond_to?(:addr_spec) && tree.angle_addr.addr_spec.respond_to?(:local_dot_atom_text)
- # Ignore local dot atom text when in angle brackets
- nil
- when tree.respond_to?(:addr_spec) && tree.addr_spec.respond_to?(:local_dot_atom_text)
- # Ignore local dot atom text when in angle brackets
- nil
- else
- tree && tree.respond_to?(:local_part) ? tree.local_part.text_value : nil
- end
+ @data && @data.local
+ end
+
+ def get_domain
+ @data && @data.domain
end
-
+ def get_comments
+ @data && @data.comments
+ end
end
end
diff --git a/lib/mail/elements/address_list.rb b/lib/mail/elements/address_list.rb
index 3130e41..83ca732 100644
--- a/lib/mail/elements/address_list.rb
+++ b/lib/mail/elements/address_list.rb
@@ -1,7 +1,7 @@
# encoding: utf-8
module Mail
class AddressList # :nodoc:
-
+
# Mail::AddressList is the class that parses To, From and other address fields from
# emails passed into Mail.
#
@@ -18,57 +18,34 @@ module Mail
# a.addresses #=> [#<Mail::Address:14943130 Address: |ada at test.lindsaar.net...
# a.group_names #=> ["My Group"]
def initialize(string)
- if string.blank?
- @address_nodes = []
- return self
- end
- parser = Mail::AddressListsParser.new
- if tree = parser.parse(string)
- @address_nodes = tree.addresses
- else
- raise Mail::Field::ParseError.new(AddressListsParser, string, parser.failure_reason)
- end
+ @addresses_grouped_by_group = nil
+ @address_list = Parsers::AddressListsParser.new.parse(string)
end
# Returns a list of address objects from the parsed line
def addresses
- @addresses ||= get_addresses.map do |address_tree|
- Mail::Address.new(address_tree)
+ @addresses ||= @address_list.addresses.map do |address_data|
+ Mail::Address.new(address_data)
end
end
-
- # Returns a list of all recipient syntax trees that are not part of a group
- def individual_recipients # :nodoc:
- @individual_recipients ||= @address_nodes - group_recipients
- end
-
- # Returns a list of all recipient syntax trees that are part of a group
- def group_recipients # :nodoc:
- @group_recipients ||= @address_nodes.select { |an| an.respond_to?(:group_name) }
+
+ def addresses_grouped_by_group
+ return @addresses_grouped_by_group if @addresses_grouped_by_group
+
+ @addresses_grouped_by_group = {}
+
+ @address_list.addresses.each do |address_data|
+ if group = address_data.group
+ @addresses_grouped_by_group[group] ||= []
+ @addresses_grouped_by_group[group] << Mail::Address.new(address_data)
+ end
+ end
+ @addresses_grouped_by_group
end
# Returns the names as an array of strings of all groups
def group_names # :nodoc:
- group_recipients.map { |g| g.group_name.text_value }
- end
-
- # Returns a list of address syntax trees
- def address_nodes # :nodoc:
- @address_nodes
- end
-
- private
-
- def get_addresses
- (individual_recipients + group_recipients.map { |g| get_group_addresses(g) }).flatten
- end
-
- def get_group_addresses(g)
- if g.group_list.respond_to?(:addresses)
- g.group_list.addresses
- else
- []
- end
+ @address_list.group_names
end
end
end
diff --git a/lib/mail/elements/content_disposition_element.rb b/lib/mail/elements/content_disposition_element.rb
index 5206ded..101182f 100644
--- a/lib/mail/elements/content_disposition_element.rb
+++ b/lib/mail/elements/content_disposition_element.rb
@@ -5,13 +5,9 @@ module Mail
include Mail::Utilities
def initialize( string )
- parser = Mail::ContentDispositionParser.new
- if tree = parser.parse(cleaned(string))
- @disposition_type = tree.disposition_type.text_value.downcase
- @parameters = tree.parameters
- else
- raise Mail::Field::ParseError.new(ContentDispositionElement, string, parser.failure_reason)
- end
+ content_disposition = Mail::Parsers::ContentDispositionParser.new.parse(cleaned(string))
+ @disposition_type = content_disposition.disposition_type
+ @parameters = content_disposition.parameters
end
def disposition_type
diff --git a/lib/mail/elements/content_location_element.rb b/lib/mail/elements/content_location_element.rb
index 25cdb9b..15312fc 100644
--- a/lib/mail/elements/content_location_element.rb
+++ b/lib/mail/elements/content_location_element.rb
@@ -5,12 +5,8 @@ module Mail
include Mail::Utilities
def initialize( string )
- parser = Mail::ContentLocationParser.new
- if tree = parser.parse(string)
- @location = tree.location.text_value
- else
- raise Mail::Field::ParseError.new(ContentLocationElement, string, parser.failure_reason)
- end
+ content_location = Mail::Parsers::ContentLocationParser.new.parse(string)
+ @location = content_location.location
end
def location
diff --git a/lib/mail/elements/content_transfer_encoding_element.rb b/lib/mail/elements/content_transfer_encoding_element.rb
index 2420c10..9f808b9 100644
--- a/lib/mail/elements/content_transfer_encoding_element.rb
+++ b/lib/mail/elements/content_transfer_encoding_element.rb
@@ -4,16 +4,9 @@ module Mail
include Mail::Utilities
- def initialize( string )
- parser = Mail::ContentTransferEncodingParser.new
- case
- when string.blank?
- @encoding = ''
- when tree = parser.parse(string.to_s.downcase)
- @encoding = tree.encoding.text_value
- else
- raise Mail::Field::ParseError.new(ContentTransferEncodingElement, string, parser.failure_reason)
- end
+ def initialize(string)
+ content_transfer_encoding = Mail::Parsers::ContentTransferEncodingParser.new.parse(string)
+ @encoding = content_transfer_encoding.encoding
end
def encoding
diff --git a/lib/mail/elements/content_type_element.rb b/lib/mail/elements/content_type_element.rb
index b676790..d85d037 100644
--- a/lib/mail/elements/content_type_element.rb
+++ b/lib/mail/elements/content_type_element.rb
@@ -5,14 +5,10 @@ module Mail
include Mail::Utilities
def initialize( string )
- parser = Mail::ContentTypeParser.new
- if tree = parser.parse(cleaned(string))
- @main_type = tree.main_type.text_value.downcase
- @sub_type = tree.sub_type.text_value.downcase
- @parameters = tree.parameters
- else
- raise Mail::Field::ParseError.new(ContentTypeElement, string, parser.failure_reason)
- end
+ content_type = Mail::Parsers::ContentTypeParser.new.parse(cleaned(string))
+ @main_type = content_type.main_type
+ @sub_type = content_type.sub_type
+ @parameters = content_type.parameters
end
def main_type
diff --git a/lib/mail/elements/date_time_element.rb b/lib/mail/elements/date_time_element.rb
index 45c39c3..c3f6e0c 100644
--- a/lib/mail/elements/date_time_element.rb
+++ b/lib/mail/elements/date_time_element.rb
@@ -5,13 +5,9 @@ module Mail
include Mail::Utilities
def initialize( string )
- parser = Mail::DateTimeParser.new
- if tree = parser.parse(string)
- @date_string = tree.date.text_value
- @time_string = tree.time.text_value
- else
- raise Mail::Field::ParseError.new(DateTimeElement, string, parser.failure_reason)
- end
+ date_time = Mail::Parsers::DateTimeParser.new.parse(string)
+ @date_string = date_time.date_string
+ @time_string = date_time.time_string
end
def date_string
diff --git a/lib/mail/elements/envelope_from_element.rb b/lib/mail/elements/envelope_from_element.rb
index d4a8cf3..40bf06d 100644
--- a/lib/mail/elements/envelope_from_element.rb
+++ b/lib/mail/elements/envelope_from_element.rb
@@ -5,17 +5,9 @@ module Mail
include Mail::Utilities
def initialize( string )
- parser = Mail::EnvelopeFromParser.new
- if @tree = parser.parse(string)
- @address = tree.addr_spec.text_value.strip
- @date_time = ::DateTime.parse("#{tree.ctime_date.text_value}")
- else
- raise Mail::Field::ParseError.new(EnvelopeFromElement, string, parser.failure_reason)
- end
- end
-
- def tree
- @tree
+ @envelope_from = Mail::Parsers::EnvelopeFromParser.new.parse(string)
+ @address = @envelope_from.address
+ @date_time = ::DateTime.parse(@envelope_from.ctime_date)
end
def date_time
diff --git a/lib/mail/elements/message_ids_element.rb b/lib/mail/elements/message_ids_element.rb
index c8e2672..c52788a 100644
--- a/lib/mail/elements/message_ids_element.rb
+++ b/lib/mail/elements/message_ids_element.rb
@@ -5,12 +5,7 @@ module Mail
include Mail::Utilities
def initialize(string)
- parser = Mail::MessageIdsParser.new
- if tree = parser.parse(string)
- @message_ids = tree.message_ids.map { |msg_id| clean_msg_id(msg_id.text_value) }
- else
- raise Mail::Field::ParseError.new(MessageIdsElement, string, parser.failure_reason)
- end
+ @message_ids = Mail::Parsers::MessageIdsParser.new.parse(string).message_ids.map { |msg_id| clean_msg_id(msg_id) }
end
def message_ids
diff --git a/lib/mail/elements/mime_version_element.rb b/lib/mail/elements/mime_version_element.rb
index a6a690b..149d778 100644
--- a/lib/mail/elements/mime_version_element.rb
+++ b/lib/mail/elements/mime_version_element.rb
@@ -5,13 +5,9 @@ module Mail
include Mail::Utilities
def initialize( string )
- parser = Mail::MimeVersionParser.new
- if tree = parser.parse(string)
- @major = tree.major.text_value
- @minor = tree.minor.text_value
- else
- raise Mail::Field::ParseError.new(MimeVersionElement, string, parser.failure_reason)
- end
+ mime_version = Mail::Parsers::MimeVersionParser.new.parse(string)
+ @major = mime_version.major
+ @minor = mime_version.minor
end
def major
diff --git a/lib/mail/elements/phrase_list.rb b/lib/mail/elements/phrase_list.rb
index f27ba85..6df5e8b 100644
--- a/lib/mail/elements/phrase_list.rb
+++ b/lib/mail/elements/phrase_list.rb
@@ -5,16 +5,11 @@ module Mail
include Mail::Utilities
def initialize(string)
- parser = Mail::PhraseListsParser.new
- if tree = parser.parse(string)
- @phrases = tree.phrases
- else
- raise Mail::Field::ParseError.new(PhraseList, string, parser.failure_reason)
- end
+ @phrase_lists = Mail::Parsers::PhraseListsParser.new.parse(string)
end
def phrases
- @phrases.map { |p| unquote(p.text_value) }
+ @phrase_lists.phrases.map { |p| unquote(p) }
end
end
diff --git a/lib/mail/elements/received_element.rb b/lib/mail/elements/received_element.rb
index de4916c..981ef5a 100644
--- a/lib/mail/elements/received_element.rb
+++ b/lib/mail/elements/received_element.rb
@@ -5,13 +5,9 @@ module Mail
include Mail::Utilities
def initialize( string )
- parser = Mail::ReceivedParser.new
- if tree = parser.parse(string)
- @date_time = ::DateTime.parse("#{tree.date_time.date.text_value} #{tree.date_time.time.text_value}")
- @info = tree.name_val_list.text_value
- else
- raise Mail::Field::ParseError.new(ReceivedElement, string, parser.failure_reason)
- end
+ received = Mail::Parsers::ReceivedParser.new.parse(string)
+ @date_time = ::DateTime.parse("#{received.date} #{received.time}")
+ @info = received.info
end
def date_time
diff --git a/lib/mail/encodings.rb b/lib/mail/encodings.rb
index 7adb4ab..9a1159d 100644
--- a/lib/mail/encodings.rb
+++ b/lib/mail/encodings.rb
@@ -292,7 +292,6 @@ module Mail
if encoding == previous_encoding
line = results.pop + line
- line.gsub!(/\?\=\=\?.+?\?[QqBb]\?/m, '')
end
previous_encoding = encoding
diff --git a/lib/mail/envelope.rb b/lib/mail/envelope.rb
index 1cd5ceb..9dd8e5a 100644
--- a/lib/mail/envelope.rb
+++ b/lib/mail/envelope.rb
@@ -14,11 +14,6 @@ module Mail
super(FIELD_NAME, strip_field(FIELD_NAME, args.last))
end
- def tree
- @element ||= Mail::EnvelopeFromElement.new(value)
- @tree ||= @element.tree
- end
-
def element
@element ||= Mail::EnvelopeFromElement.new(value)
end
diff --git a/lib/mail/field.rb b/lib/mail/field.rb
index 7853dc9..5c33e65 100644
--- a/lib/mail/field.rb
+++ b/lib/mail/field.rb
@@ -22,7 +22,7 @@ module Mail
#
class Field
- include Patterns
+ include Utilities
include Comparable
STRUCTURED_FIELDS = %w[ bcc cc content-description content-disposition
@@ -67,6 +67,10 @@ module Mail
"content-location" => ContentLocationField,
}
+ FIELD_NAME_MAP = FIELDS_MAP.inject({}) do |map, (field, field_klass)|
+ map.update(field => field_klass::CAPITALIZED_FIELD)
+ end
+
# Generic Field Exception
class FieldError < StandardError
end
@@ -110,15 +114,22 @@ module Mail
def initialize(name, value = nil, charset = 'utf-8')
case
when name =~ /:/ # Field.new("field-name: field data")
- charset = value unless value.blank?
- name, value = split(name)
- create_field(name, value, charset)
+ @charset = value.blank? ? charset : value
+ @name = name[FIELD_PREFIX]
+ @raw_value = name
+ @value = nil
when name !~ /:/ && value.blank? # Field.new("field-name")
- create_field(name, nil, charset)
+ @name = name
+ @value = nil
+ @raw_value = nil
+ @charset = charset
else # Field.new("field-name", "value")
- create_field(name, value, charset)
+ @name = name
+ @value = value
+ @raw_value = nil
+ @charset = charset
end
- return self
+ @name = FIELD_NAME_MAP[@name.to_s.downcase] || @name
end
def field=(value)
@@ -126,11 +137,12 @@ module Mail
end
def field
- @field
+ _, @value = split(@raw_value) if @raw_value && !@value
+ @field ||= create_field(@name, @value, @charset)
end
def name
- field.name
+ @name
end
def value
@@ -138,19 +150,29 @@ module Mail
end
def value=(val)
- create_field(name, val, charset)
+ @field = create_field(name, val, @charset)
end
def to_s
field.to_s
end
+ def inspect
+ "#<#{self.class.name} 0x#{(object_id * 2).to_s(16)} #{instance_variables.map do |ivar|
+ "#{ivar}=#{instance_variable_get(ivar).inspect}"
+ end.join(" ")}>"
+ end
+
def update(name, value)
- create_field(name, value, charset)
+ @field = create_field(name, value, @charset)
end
def same( other )
- match_to_s(other.name, field.name)
+ match_to_s(other.name, self.name)
+ end
+
+ def responsible_for?( val )
+ name.to_s.casecmp(val.to_s) == 0
end
alias_method :==, :same
@@ -182,18 +204,32 @@ module Mail
def split(raw_field)
match_data = raw_field.mb_chars.match(FIELD_SPLIT)
- [match_data[1].to_s.mb_chars.strip, match_data[2].to_s.mb_chars.strip]
+ [match_data[1].to_s.mb_chars.strip, match_data[2].to_s.mb_chars.strip.to_s]
rescue
STDERR.puts "WARNING: Could not parse (and so ignoring) '#{raw_field}'"
end
+ # 2.2.3. Long Header Fields
+ #
+ # The process of moving from this folded multiple-line representation
+ # of a header field to its single line representation is called
+ # "unfolding". Unfolding is accomplished by simply removing any CRLF
+ # that is immediately followed by WSP. Each header field should be
+ # treated in its unfolded form for further syntactic and semantic
+ # evaluation.
+ def unfold(string)
+ string.gsub(/[\r\n \t]+/m, ' ')
+ end
+
def create_field(name, value, charset)
+ value = unfold(value) if value.is_a?(String)
+
begin
- self.field = new_field(name, value, charset)
+ new_field(name, value, charset)
rescue Mail::Field::ParseError => e
- self.field = Mail::UnstructuredField.new(name, value)
- self.field.errors << [name, value, e]
- self.field
+ field = Mail::UnstructuredField.new(name, value)
+ field.errors << [name, value, e]
+ field
end
end
diff --git a/lib/mail/field_list.rb b/lib/mail/field_list.rb
index 8e99f23..03213bf 100644
--- a/lib/mail/field_list.rb
+++ b/lib/mail/field_list.rb
@@ -8,26 +8,26 @@ module Mail
include Enumerable
+ # Insert the field in sorted order.
+ #
+ # Heavily based on bisect.insort from Python, which is:
+ # Copyright (C) 2001-2013 Python Software Foundation.
+ # Licensed under <http://docs.python.org/license.html>
+ # From <http://hg.python.org/cpython/file/2.7/Lib/bisect.py>
def <<( new_field )
- current_entry = self.rindex(new_field)
- if current_entry
- self.insert((current_entry + 1), new_field)
- else
- insert_idx = -1
- self.each_with_index do |item, idx|
- case item <=> new_field
- when -1
- next
- when 0
- next
- when 1
- insert_idx = idx
- break
- end
+ lo = 0
+ hi = size
+
+ while lo < hi
+ mid = (lo + hi) / 2
+ if new_field < self[mid]
+ hi = mid
+ else
+ lo = mid + 1
end
- insert(insert_idx, new_field)
end
+
+ insert(lo, new_field)
end
-
end
-end
\ No newline at end of file
+end
diff --git a/lib/mail/fields/common/common_address.rb b/lib/mail/fields/common/common_address.rb
index a175f02..4cfdd46 100644
--- a/lib/mail/fields/common/common_address.rb
+++ b/lib/mail/fields/common/common_address.rb
@@ -6,7 +6,7 @@ module Mail
def parse(val = value)
unless val.blank?
- @tree = AddressList.new(encode_if_needed(val))
+ @address_list = AddressList.new(encode_if_needed(val))
else
nil
end
@@ -20,44 +20,40 @@ module Mail
Encodings.address_encode(val, charset)
end
- # Allows you to iterate through each address object in the syntax tree
+ # Allows you to iterate through each address object in the address_list
def each
- tree.addresses.each do |address|
+ address_list.addresses.each do |address|
yield(address)
end
end
# Returns the address string of all the addresses in the address list
def addresses
- list = tree.addresses.map { |a| a.address }
+ list = address_list.addresses.map { |a| a.address }
Mail::AddressContainer.new(self, list)
end
# Returns the formatted string of all the addresses in the address list
def formatted
- list = tree.addresses.map { |a| a.format }
+ list = address_list.addresses.map { |a| a.format }
Mail::AddressContainer.new(self, list)
end
# Returns the display name of all the addresses in the address list
def display_names
- list = tree.addresses.map { |a| a.display_name }
+ list = address_list.addresses.map { |a| a.display_name }
Mail::AddressContainer.new(self, list)
end
# Returns the actual address objects in the address list
def addrs
- list = tree.addresses
+ list = address_list.addresses
Mail::AddressContainer.new(self, list)
end
# Returns a hash of group name => address strings for the address list
def groups
- @groups = Hash.new
- tree.group_recipients.each do |group|
- @groups[group.group_name.text_value.to_str] = get_group_addresses(group.group_list)
- end
- @groups
+ address_list.addresses_grouped_by_group
end
# Returns the addresses that are part of groups
@@ -77,7 +73,7 @@ module Mail
# Returns the name of all the groups in a string
def group_names # :nodoc:
- tree.group_names
+ address_list.group_names
end
def default
@@ -104,7 +100,7 @@ module Mail
def do_encode(field_name)
return '' if value.blank?
- address_array = tree.addresses.reject { |a| encoded_group_addresses.include?(a.encoded) }.compact.map { |a| a.encoded }
+ address_array = address_list.addresses.reject { |a| encoded_group_addresses.include?(a.encoded) }.compact.map { |a| a.encoded }
address_text = address_array.join(", \r\n\s")
group_array = groups.map { |k,v| "#{k}: #{v.map { |a| a.encoded }.join(", \r\n\s")};" }
group_text = group_array.join(" \r\n\s")
@@ -114,7 +110,7 @@ module Mail
def do_decode
return nil if value.blank?
- address_array = tree.addresses.reject { |a| decoded_group_addresses.include?(a.decoded) }.map { |a| a.decoded }
+ address_array = address_list.addresses.reject { |a| decoded_group_addresses.include?(a.decoded) }.map { |a| a.decoded }
address_text = address_array.join(", ")
group_array = groups.map { |k,v| "#{k}: #{v.map { |a| a.decoded }.join(", ")};" }
group_text = group_array.join(" ")
@@ -122,15 +118,14 @@ module Mail
return_array.join(", ")
end
- # Returns the syntax tree of the Addresses
- def tree # :nodoc:
- @tree ||= AddressList.new(value)
+ def address_list # :nodoc:
+ @address_list ||= AddressList.new(value)
end
def get_group_addresses(group_list)
if group_list.respond_to?(:addresses)
- group_list.addresses.map do |address_tree|
- Mail::Address.new(address_tree)
+ group_list.addresses.map do |address|
+ Mail::Address.new(address)
end
else
[]
diff --git a/lib/mail/fields/common/common_date.rb b/lib/mail/fields/common/common_date.rb
index a734699..23e335d 100644
--- a/lib/mail/fields/common/common_date.rb
+++ b/lib/mail/fields/common/common_date.rb
@@ -13,7 +13,6 @@ module Mail
def parse(val = value)
unless val.blank?
@element = Mail::DateTimeElement.new(val)
- @tree = @element.tree
else
nil
end
@@ -32,11 +31,5 @@ module Mail
def element
@element ||= Mail::DateTimeElement.new(value)
end
-
- # Returns the syntax tree of the Date
- def tree
- @tree ||= element.tree
- end
-
end
end
diff --git a/lib/mail/fields/common/common_field.rb b/lib/mail/fields/common/common_field.rb
index 001d08f..cefaae5 100644
--- a/lib/mail/fields/common/common_field.rb
+++ b/lib/mail/fields/common/common_field.rb
@@ -43,7 +43,7 @@ module Mail
if value.is_a?(Array)
value
else
- value.to_s.gsub(/#{field_name}:\s+/i, '')
+ value.to_s.sub(/#{field_name}:\s+/i, '')
end
end
diff --git a/lib/mail/fields/content_transfer_encoding_field.rb b/lib/mail/fields/content_transfer_encoding_field.rb
index 152f0b1..08e994f 100644
--- a/lib/mail/fields/content_transfer_encoding_field.rb
+++ b/lib/mail/fields/content_transfer_encoding_field.rb
@@ -23,12 +23,6 @@ module Mail
end
end
- def tree
- STDERR.puts("tree is deprecated. Please use encoding to get parse result\n#{caller}")
- @element ||= Mail::ContentTransferEncodingElement.new(value)
- @tree ||= @element.tree
- end
-
def element
@element ||= Mail::ContentTransferEncodingElement.new(value)
end
diff --git a/lib/mail/fields/resent_sender_field.rb b/lib/mail/fields/resent_sender_field.rb
index 0a5e515..b6edce3 100644
--- a/lib/mail/fields/resent_sender_field.rb
+++ b/lib/mail/fields/resent_sender_field.rb
@@ -47,7 +47,7 @@ module Mail
end
def address
- tree.addresses.first
+ address_list.addresses.first
end
def encoded
diff --git a/lib/mail/fields/sender_field.rb b/lib/mail/fields/sender_field.rb
index f8b1fb8..a0024c9 100644
--- a/lib/mail/fields/sender_field.rb
+++ b/lib/mail/fields/sender_field.rb
@@ -48,7 +48,7 @@ module Mail
end
def address
- tree.addresses.first
+ address_list.addresses.first
end
def encoded
diff --git a/lib/mail/fields/unstructured_field.rb b/lib/mail/fields/unstructured_field.rb
index 7a95355..176fe1b 100644
--- a/lib/mail/fields/unstructured_field.rb
+++ b/lib/mail/fields/unstructured_field.rb
@@ -144,6 +144,7 @@ module Mail
limit = 78 - prepend
limit = limit - 7 - encoding.length if should_encode
line = ""
+ first_word = true
while !words.empty?
break unless word = words.first.dup
word.encode!(charset) if charset && word.respond_to?(:encode!)
@@ -158,7 +159,12 @@ module Mail
# Remove the word from the queue ...
words.shift
# Add word separator
- line << " " unless (line.empty? || should_encode)
+ if first_word
+ first_word = false
+ else
+ line << " " if !should_encode
+ end
+
# ... add it in encoded form to the current line
line << word
end
diff --git a/lib/mail/header.rb b/lib/mail/header.rb
index e944181..612aaa7 100644
--- a/lib/mail/header.rb
+++ b/lib/mail/header.rb
@@ -48,11 +48,15 @@ module Mail
# these cases, please make a patch and send it in, or at the least, send
# me the example so we can fix it.
def initialize(header_text = nil, charset = nil)
- @errors = []
@charset = charset
self.raw_source = header_text.to_crlf.lstrip
split_header if header_text
end
+
+ def initialize_copy(original)
+ super
+ @fields = @fields.dup
+ end
# The preserved raw source of the header as you passed it in, untouched
# for your Regexing glory.
@@ -91,7 +95,6 @@ module Mail
unfolded_fields[0..(self.class.maximum_amount-1)].each do |field|
field = Field.new(field, nil, charset)
- field.errors.each { |error| self.errors << error }
if limited_field?(field.name) && (selected = select_field_for(field.name)) && selected.any?
selected.first.update(field.name, field.value)
else
@@ -102,7 +105,7 @@ module Mail
end
def errors
- @errors
+ @fields.map(&:errors).flatten(1)
end
# 3.6. Field definitions
@@ -177,7 +180,7 @@ module Mail
if dasherize(fn) == "content-type"
# Update charset if specified in Content-Type
params = self[:content_type].parameters rescue nil
- @charset = params && params[:charset]
+ @charset = params[:charset] if params && params[:charset]
end
end
@@ -246,27 +249,10 @@ module Mail
@raw_source = val
end
- # 2.2.3. Long Header Fields
- #
- # The process of moving from this folded multiple-line representation
- # of a header field to its single line representation is called
- # "unfolding". Unfolding is accomplished by simply removing any CRLF
- # that is immediately followed by WSP. Each header field should be
- # treated in its unfolded form for further syntactic and semantic
- # evaluation.
- def unfold(string)
- string.gsub(/#{CRLF}#{WSP}+/, ' ').gsub(/#{WSP}+/, ' ')
- end
-
- # Returns the header with all the folds removed
- def unfolded_header
- @unfolded_header ||= unfold(raw_source)
- end
-
# Splits an unfolded and line break cleaned header into individual field
# strings.
def split_header
- self.fields = unfolded_header.split(CRLF)
+ self.fields = raw_source.split(HEADER_SPLIT)
end
def select_field_for(name)
diff --git a/lib/mail/mail.rb b/lib/mail/mail.rb
index 29741be..1b693d1 100644
--- a/lib/mail/mail.rb
+++ b/lib/mail/mail.rb
@@ -206,6 +206,12 @@ module Mail
end
end
+ # Unregister the given observer, allowing mail to resume operations
+ # without it.
+ def self.unregister_observer(observer)
+ @@delivery_notification_observers.delete(observer)
+ end
+
# You can register an object to be given every mail object that will be sent,
# before it is sent. So if you want to add special headers or modify any
# email that gets sent through the Mail library, you can do so.
@@ -219,6 +225,12 @@ module Mail
end
end
+ # Unregister the given interceptor, allowing mail to resume operations
+ # without it.
+ def self.unregister_interceptor(interceptor)
+ @@delivery_interceptors.delete(interceptor)
+ end
+
def self.inform_observers(mail)
@@delivery_notification_observers.each do |observer|
observer.delivered_email(mail)
diff --git a/lib/mail/matchers/has_sent_mail.rb b/lib/mail/matchers/has_sent_mail.rb
index 73386b0..fc63193 100644
--- a/lib/mail/matchers/has_sent_mail.rb
+++ b/lib/mail/matchers/has_sent_mail.rb
@@ -29,6 +29,29 @@ module Mail
self
end
+ def cc(recipient_or_list)
+ @copy_recipients ||= []
+
+ if recipient_or_list.kind_of?(Array)
+ @copy_recipients += recipient_or_list
+ else
+ @copy_recipients << recipient_or_list
+ end
+ self
+ end
+
+ def bcc(recipient_or_list)
+ @blind_copy_recipients ||= []
+
+ if recipient_or_list.kind_of?(Array)
+ @blind_copy_recipients += recipient_or_list
+ else
+ @blind_copy_recipients << recipient_or_list
+ end
+ self
+ end
+
+
def with_subject(subject)
@subject = subject
self
@@ -73,7 +96,7 @@ module Mail
def filter_matched_deliveries(deliveries)
candidate_deliveries = deliveries
- %w(sender recipients subject subject_matcher body body_matcher).each do |modifier_name|
+ %w(sender recipients copy_recipients blind_copy_recipients subject subject_matcher body body_matcher).each do |modifier_name|
next unless instance_variable_defined?("@#{modifier_name}")
candidate_deliveries = candidate_deliveries.select{|matching_delivery| self.send("matches_on_#{modifier_name}?", matching_delivery)}
end
@@ -89,6 +112,14 @@ module Mail
@recipients.all? {|recipient| delivery.to.include?(recipient) }
end
+ def matches_on_copy_recipients?(delivery)
+ @copy_recipients.all? {|recipient| delivery.cc.include?(recipient) }
+ end
+
+ def matches_on_blind_copy_recipients?(delivery)
+ @blind_copy_recipients.all? {|recipient| delivery.bcc.include?(recipient) }
+ end
+
def matches_on_subject?(delivery)
delivery.subject == @subject
end
@@ -109,6 +140,8 @@ module Mail
result = ''
result += "from #{@sender} " if instance_variable_defined?('@sender')
result += "to #{@recipients.inspect} " if instance_variable_defined?('@recipients')
+ result += "cc #{@copy_recipients.inspect} " if instance_variable_defined?('@copy_recipients')
+ result += "bcc #{@blind_copy_recipients.inspect} " if instance_variable_defined?('@blind_copy_recipients')
result += "with subject \"#{@subject}\" " if instance_variable_defined?('@subject')
result += "with subject matching \"#{@subject_matcher}\" " if instance_variable_defined?('@subject_matcher')
result += "with body \"#{@body}\" " if instance_variable_defined?('@body')
diff --git a/lib/mail/message.rb b/lib/mail/message.rb
index 11a42d4..9daa86b 100644
--- a/lib/mail/message.rb
+++ b/lib/mail/message.rb
@@ -240,7 +240,7 @@ module Mail
# This method bypasses checking perform_deliveries and raise_delivery_errors,
# so use with caution.
#
- # It still however fires off the intercepters and calls the observers callbacks if they are defined.
+ # It still however fires off the interceptors and calls the observers callbacks if they are defined.
#
# Returns self
def deliver!
@@ -353,17 +353,23 @@ module Mail
return false unless other.respond_to?(:encoded)
if self.message_id && other.message_id
- result = (self.encoded == other.encoded)
+ self.encoded == other.encoded
else
self_message_id, other_message_id = self.message_id, other.message_id
- self.message_id, other.message_id = '<temp at test>', '<temp at test>'
- result = self.encoded == other.encoded
- self.message_id = "<#{self_message_id}>" if self_message_id
- other.message_id = "<#{other_message_id}>" if other_message_id
- result
+ begin
+ self.message_id, other.message_id = '<temp at test>', '<temp at test>'
+ self.encoded == other.encoded
+ ensure
+ self.message_id, other.message_id = self_message_id, other_message_id
+ end
end
end
+ def initialize_copy(original)
+ super
+ @header = @header.dup
+ end
+
# Provides access to the raw source of the message as it was when it
# was instantiated. This is set at initialization and so is untouched
# by the parsers or decoder / encoders
@@ -1388,7 +1394,7 @@ module Mail
header.has_date?
end
- # Returns true if the message has a Date field, the field may or may
+ # Returns true if the message has a Mime-Version field, the field may or may
# not have a value, but the field exists or not.
def has_mime_version?
header.has_mime_version?
@@ -1594,7 +1600,7 @@ module Mail
end
# Returns an AttachmentsList object, which holds all of the attachments in
- # the receiver object (either the entier email or a part within) and all
+ # the receiver object (either the entire email or a part within) and all
# of its descendants.
#
# It also allows you to add attachments to the mail object directly, like so:
@@ -1974,8 +1980,9 @@ module Mail
end
def raw_source=(value)
- value.force_encoding("binary") if RUBY_VERSION >= "1.9.1"
@raw_source = value.to_crlf
+ @raw_source.force_encoding("binary") if RUBY_VERSION >= "1.9.1"
+ @raw_source
end
# see comments to body=. We take data and process it lazily
@@ -2128,7 +2135,7 @@ module Mail
if perform_deliveries
delivery_method.deliver!(self)
end
- rescue Exception => e # Net::SMTP errors or sendmail pipe errors
+ rescue => e # Net::SMTP errors or sendmail pipe errors
raise e if raise_delivery_errors
end
end
diff --git a/lib/mail/multibyte/unicode.rb b/lib/mail/multibyte/unicode.rb
index cd47bae..cedfe77 100644
--- a/lib/mail/multibyte/unicode.rb
+++ b/lib/mail/multibyte/unicode.rb
@@ -341,7 +341,7 @@ module Mail
def load
begin
@codepoints, @composition_exclusion, @composition_map, @boundary, @cp1252 = File.open(self.class.filename, 'rb') { |f| Marshal.load f.read }
- rescue Exception => e
+ rescue => e
raise IOError.new("Couldn't load the Unicode tables for UTF8Handler (#{e.message}), Mail::Multibyte is unusable")
end
diff --git a/lib/mail/network/delivery_methods/sendmail.rb b/lib/mail/network/delivery_methods/sendmail.rb
index 1491d03..853470b 100644
--- a/lib/mail/network/delivery_methods/sendmail.rb
+++ b/lib/mail/network/delivery_methods/sendmail.rb
@@ -50,7 +50,7 @@ module Mail
smtp_from, smtp_to, message = check_delivery_params(mail)
from = "-f #{self.class.shellquote(smtp_from)}"
- to = smtp_to.map { |to| self.class.shellquote(to) }.join(' ')
+ to = smtp_to.map { |_to| self.class.shellquote(_to) }.join(' ')
arguments = "#{settings[:arguments]} #{from} --"
self.class.call(settings[:location], arguments, to, message)
diff --git a/lib/mail/network/delivery_methods/smtp.rb b/lib/mail/network/delivery_methods/smtp.rb
index 6904ef3..b0af1f5 100644
--- a/lib/mail/network/delivery_methods/smtp.rb
+++ b/lib/mail/network/delivery_methods/smtp.rb
@@ -132,15 +132,11 @@ module Mail
openssl_verify_mode = "OpenSSL::SSL::VERIFY_#{openssl_verify_mode.upcase}".constantize
end
- if RUBY_VERSION < '1.9.0'
- openssl_verify_mode
- else
- context = Net::SMTP.default_ssl_context
- context.verify_mode = openssl_verify_mode
- context.ca_path = settings[:ca_path] if settings[:ca_path]
- context.ca_file = settings[:ca_file] if settings[:ca_file]
- context
- end
+ context = Net::SMTP.default_ssl_context
+ context.verify_mode = openssl_verify_mode
+ context.ca_path = settings[:ca_path] if settings[:ca_path]
+ context.ca_file = settings[:ca_file] if settings[:ca_file]
+ context
end
end
end
diff --git a/lib/mail/network/retriever_methods/imap.rb b/lib/mail/network/retriever_methods/imap.rb
index a92fffb..9a53357 100644
--- a/lib/mail/network/retriever_methods/imap.rb
+++ b/lib/mail/network/retriever_methods/imap.rb
@@ -73,31 +73,35 @@ module Mail
start do |imap|
options[:read_only] ? imap.examine(options[:mailbox]) : imap.select(options[:mailbox])
- message_ids = imap.uid_search(options[:keys])
- message_ids.reverse! if options[:what].to_sym == :last
- message_ids = message_ids.first(options[:count]) if options[:count].is_a?(Integer)
- message_ids.reverse! if (options[:what].to_sym == :last && options[:order].to_sym == :asc) ||
+ uids = imap.uid_search(options[:keys])
+ uids.reverse! if options[:what].to_sym == :last
+ uids = uids.first(options[:count]) if options[:count].is_a?(Integer)
+ uids.reverse! if (options[:what].to_sym == :last && options[:order].to_sym == :asc) ||
(options[:what].to_sym != :last && options[:order].to_sym == :desc)
if block_given?
- message_ids.each do |message_id|
- fetchdata = imap.uid_fetch(message_id, ['RFC822'])[0]
+ uids.each do |uid|
+ uid = options[:uid].to_i unless options[:uid].nil?
+ fetchdata = imap.uid_fetch(uid, ['RFC822'])[0]
new_message = Mail.new(fetchdata.attr['RFC822'])
new_message.mark_for_delete = true if options[:delete_after_find]
if block.arity == 3
- yield new_message, imap, message_id
+ yield new_message, imap, uid
else
yield new_message
end
- imap.uid_store(message_id, "+FLAGS", [Net::IMAP::DELETED]) if options[:delete_after_find] && new_message.is_marked_for_delete?
+ imap.uid_store(uid, "+FLAGS", [Net::IMAP::DELETED]) if options[:delete_after_find] && new_message.is_marked_for_delete?
+ break unless options[:uid].nil?
end
imap.expunge if options[:delete_after_find]
else
emails = []
- message_ids.each do |message_id|
- fetchdata = imap.uid_fetch(message_id, ['RFC822'])[0]
+ uids.each do |uid|
+ uid = options[:uid].to_i unless options[:uid].nil?
+ fetchdata = imap.uid_fetch(uid, ['RFC822'])[0]
emails << Mail.new(fetchdata.attr['RFC822'])
- imap.uid_store(message_id, "+FLAGS", [Net::IMAP::DELETED]) if options[:delete_after_find]
+ imap.uid_store(uid, "+FLAGS", [Net::IMAP::DELETED]) if options[:delete_after_find]
+ break unless options[:uid].nil?
end
imap.expunge if options[:delete_after_find]
emails.size == 1 && options[:count] == 1 ? emails.first : emails
@@ -111,8 +115,8 @@ module Mail
mailbox = Net::IMAP.encode_utf7(mailbox)
start do |imap|
- imap.uid_search(['ALL']).each do |message_id|
- imap.uid_store(message_id, "+FLAGS", [Net::IMAP::DELETED])
+ imap.uid_search(['ALL']).each do |uid|
+ imap.uid_store(uid, "+FLAGS", [Net::IMAP::DELETED])
end
imap.expunge
end
@@ -137,6 +141,7 @@ module Mail
options[:order] ||= :asc
options[:what] ||= :first
options[:keys] ||= 'ALL'
+ options[:uid] ||= nil
options[:delete_after_find] ||= false
options[:mailbox] = Net::IMAP.encode_utf7(options[:mailbox])
options[:read_only] ||= false
diff --git a/lib/mail/parsers.rb b/lib/mail/parsers.rb
new file mode 100644
index 0000000..70f49ea
--- /dev/null
+++ b/lib/mail/parsers.rb
@@ -0,0 +1,26 @@
+module Mail
+ module Parsers
+
+ # Low-level ragel based parsers
+ require 'mail/parsers/ragel'
+
+ AddressListStruct = Struct.new(:addresses, :group_names, :error)
+ AddressStruct = Struct.new(:raw, :domain, :comments, :local,
+ :obs_domain_list, :display_name, :group, :error)
+ ContentDispositionStruct = Struct.new(:disposition_type, :parameters, :error)
+ ContentLocationStruct = Struct.new(:location, :error)
+ ContentTransferEncodingStruct = Struct.new(:encoding, :error)
+ ContentTypeStruct = Struct.new(:main_type, :sub_type, :parameters, :error)
+ DateTimeStruct = Struct.new(:date_string, :time_string, :error)
+ EnvelopeFromStruct = Struct.new(:address, :ctime_date, :error)
+ MessageIdsStruct = Struct.new(:message_ids, :error)
+ MimeVersionStruct = Struct.new(:major, :minor, :error)
+ PhraseListsStruct = Struct.new(:phrases, :error)
+ ReceivedStruct = Struct.new(:date, :time, :info, :error)
+
+ require 'mail/parsers/ragel/parser_info'
+ Ragel::FIELD_PARSERS.each do |field_parser|
+ require "mail/parsers/#{field_parser}_parser"
+ end
+ end
+end
diff --git a/lib/mail/parsers/address_lists.rb b/lib/mail/parsers/address_lists.rb
deleted file mode 100644
index 23fd2fd..0000000
--- a/lib/mail/parsers/address_lists.rb
+++ /dev/null
@@ -1,64 +0,0 @@
-# Autogenerated from a Treetop grammar. Edits may be lost.
-
-
-module Mail
- module AddressLists
- include Treetop::Runtime
-
- def root
- @root ||= :primary_address
- end
-
- include RFC2822
-
- module PrimaryAddress0
- def addresses
- ([first_addr] + other_addr.elements.map { |o| o.addr_value }).reject { |e| e.empty? }
- end
- end
-
- module PrimaryAddress1
- def addresses
- [first_addr] + other_addr.elements.map { |o| o.addr_value }
- end
- end
-
- def _nt_primary_address
- start_index = index
- if node_cache[:primary_address].has_key?(index)
- cached = node_cache[:primary_address][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_address_list
- r1.extend(PrimaryAddress0)
- if r1
- r0 = r1
- else
- r2 = _nt_obs_addr_list
- r2.extend(PrimaryAddress1)
- if r2
- r0 = r2
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:primary_address][start_index] = r0
-
- r0
- end
-
- end
-
- class AddressListsParser < Treetop::Runtime::CompiledParser
- include AddressLists
- end
-
-end
diff --git a/lib/mail/parsers/address_lists.treetop b/lib/mail/parsers/address_lists.treetop
deleted file mode 100644
index 014394e..0000000
--- a/lib/mail/parsers/address_lists.treetop
+++ /dev/null
@@ -1,19 +0,0 @@
-module Mail
- grammar AddressLists
-
- include RFC2822
-
- rule primary_address
- address_list {
- def addresses
- ([first_addr] + other_addr.elements.map { |o| o.addr_value }).reject { |e| e.empty? }
- end
- } / obs_addr_list {
- def addresses
- [first_addr] + other_addr.elements.map { |o| o.addr_value }
- end
- }
- end
-
- end
-end
diff --git a/lib/mail/parsers/address_lists_parser.rb b/lib/mail/parsers/address_lists_parser.rb
new file mode 100644
index 0000000..07f881d
--- /dev/null
+++ b/lib/mail/parsers/address_lists_parser.rb
@@ -0,0 +1,132 @@
+module Mail::Parsers
+ class AddressListsParser
+ include Mail::Utilities
+
+ def parse(s)
+ address_list = AddressListStruct.new([],[])
+
+ if s.blank?
+ return address_list
+ end
+
+ actions, error = Ragel.parse(:address_lists, s)
+ if error
+ raise Mail::Field::ParseError.new(Mail::AddressList, s, error)
+ end
+
+
+ phrase_s = phrase_e = qstr_s = qstr = comment_s = nil
+ group_name_s = domain_s = group_name = nil
+ local_dot_atom_s = local_dot_atom_e = nil
+ local_dot_atom_pre_comment_e = nil
+ obs_domain_list_s = nil
+
+ address_s = 0
+ address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
+ actions.each_slice(2) do |action_id, p|
+ action = Mail::Parsers::Ragel::ACTIONS[action_id]
+ case action
+
+ # Phrase
+ when :phrase_s then phrase_s = p
+ when :phrase_e then phrase_e = p-1
+
+ # Quoted String.
+ when :qstr_s then qstr_s = p
+ when :qstr_e then qstr = s[qstr_s..(p-1)]
+
+ # Comment
+ when :comment_s
+ comment_s = p unless comment_s
+ when :comment_e
+ if address
+ address.comments << s[comment_s..(p-2)]
+ end
+ comment_s = nil
+
+ # Group Name
+ when :group_name_s then group_name_s = p
+ when :group_name_e
+ if qstr
+ group = qstr
+ qstr = nil
+ else
+ group = s[group_name_s..(p-1)]
+ group_name_s = nil
+ end
+ address_list.group_names << group
+ group_name = group
+
+ # Start next address
+ address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
+ address_s = p
+ address.group = group_name
+
+ # Address
+ when :address_s
+ address_s = p
+ when :address_e
+ # Ignore address end events if they don't have
+ # a matching address start event.
+ next if address_s.nil?
+ if address.local.nil? && local_dot_atom_pre_comment_e && local_dot_atom_s && local_dot_atom_e
+ if address.domain
+ address.local = s[local_dot_atom_s..local_dot_atom_e] if address
+ else
+ address.local = s[local_dot_atom_s..local_dot_atom_pre_comment_e] if address
+ end
+ end
+ address.raw = s[address_s..(p-1)]
+ address_list.addresses << address if address
+
+ # Start next address
+ address = AddressStruct.new(nil, nil, [], nil, nil, nil, nil)
+ address.group = group_name
+ address_s = nil
+
+ # Don't set the display name until the
+ # address has actually started. This allows
+ # us to choose quoted_s version if it
+ # exists and always use the 'full' phrase
+ # version.
+ when :angle_addr_s
+ if qstr
+ address.display_name = qstr
+ qstr = nil
+ elsif phrase_e
+ address.display_name = s[phrase_s..phrase_e].strip
+ phrase_e = phrase_s = nil
+ end
+
+ # Domain
+ when :domain_s
+ domain_s = p
+ when :domain_e
+ address.domain = s[domain_s..(p-1)].rstrip if address
+
+ # Local
+ when :local_dot_atom_s then local_dot_atom_s = p
+ when :local_dot_atom_e then local_dot_atom_e = p-1
+ when :local_dot_atom_pre_comment_e
+ local_dot_atom_pre_comment_e = p-1
+ when :local_quoted_string_e
+ address.local = '"' + qstr + '"' if address
+
+ # obs_domain_list
+ when :obs_domain_list_s then obs_domain_list_s = p
+ when :obs_domain_list_e
+ address.obs_domain_list = s[obs_domain_list_s..(p-1)]
+
+ else
+ raise Mail::Field::ParseError.new(Mail::AddressList, s, "Failed to process unknown action: #{action}")
+ end
+ end
+
+ if address_list.addresses.empty? && address_list.group_names.empty?
+ raise Mail::Field::ParseError.new(Mail::AddressList, s, "Didn't find any addresses or groups")
+ end
+
+ address_list
+ end
+ end
+end
diff --git a/lib/mail/parsers/content_disposition.rb b/lib/mail/parsers/content_disposition.rb
deleted file mode 100644
index 73d0dde..0000000
--- a/lib/mail/parsers/content_disposition.rb
+++ /dev/null
@@ -1,535 +0,0 @@
-# Autogenerated from a Treetop grammar. Edits may be lost.
-
-
-module Mail
- module ContentDisposition
- include Treetop::Runtime
-
- def root
- @root ||= :content_disposition
- end
-
- include RFC2822
-
- include RFC2045
-
- module ContentDisposition0
- def CFWS1
- elements[0]
- end
-
- def parameter
- elements[2]
- end
-
- def CFWS2
- elements[3]
- end
- end
-
- module ContentDisposition1
- def disposition_type
- elements[0]
- end
-
- def param_hashes
- elements[1]
- end
- end
-
- module ContentDisposition2
- def parameters
- param_hashes.elements.map do |param|
- param.parameter.param_hash
- end
- end
- end
-
- def _nt_content_disposition
- start_index = index
- if node_cache[:content_disposition].has_key?(index)
- cached = node_cache[:content_disposition][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r1 = _nt_disposition_type
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- i3, s3 = index, []
- r4 = _nt_CFWS
- s3 << r4
- if r4
- if has_terminal?(";", false, index)
- r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(";")
- r5 = nil
- end
- s3 << r5
- if r5
- r6 = _nt_parameter
- s3 << r6
- if r6
- r7 = _nt_CFWS
- s3 << r7
- end
- end
- end
- if s3.last
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
- r3.extend(ContentDisposition0)
- else
- @index = i3
- r3 = nil
- end
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ContentDisposition1)
- r0.extend(ContentDisposition2)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:content_disposition][start_index] = r0
-
- r0
- end
-
- module DispositionType0
- end
-
- module DispositionType1
- end
-
- def _nt_disposition_type
- start_index = index
- if node_cache[:disposition_type].has_key?(index)
- cached = node_cache[:disposition_type][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- i1, s1 = index, []
- if has_terminal?('\G[iI]', true, index)
- r2 = true
- @index += 1
- else
- r2 = nil
- end
- s1 << r2
- if r2
- if has_terminal?('\G[nN]', true, index)
- r3 = true
- @index += 1
- else
- r3 = nil
- end
- s1 << r3
- if r3
- if has_terminal?('\G[lL]', true, index)
- r4 = true
- @index += 1
- else
- r4 = nil
- end
- s1 << r4
- if r4
- if has_terminal?('\G[iI]', true, index)
- r5 = true
- @index += 1
- else
- r5 = nil
- end
- s1 << r5
- if r5
- if has_terminal?('\G[nN]', true, index)
- r6 = true
- @index += 1
- else
- r6 = nil
- end
- s1 << r6
- if r6
- if has_terminal?('\G[eE]', true, index)
- r7 = true
- @index += 1
- else
- r7 = nil
- end
- s1 << r7
- end
- end
- end
- end
- end
- if s1.last
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- r1.extend(DispositionType0)
- else
- @index = i1
- r1 = nil
- end
- if r1
- r0 = r1
- else
- i8, s8 = index, []
- if has_terminal?('\G[aA]', true, index)
- r9 = true
- @index += 1
- else
- r9 = nil
- end
- s8 << r9
- if r9
- if has_terminal?('\G[tT]', true, index)
- r10 = true
- @index += 1
- else
- r10 = nil
- end
- s8 << r10
- if r10
- if has_terminal?('\G[tT]', true, index)
- r11 = true
- @index += 1
- else
- r11 = nil
- end
- s8 << r11
- if r11
- if has_terminal?('\G[aA]', true, index)
- r12 = true
- @index += 1
- else
- r12 = nil
- end
- s8 << r12
- if r12
- if has_terminal?('\G[cC]', true, index)
- r13 = true
- @index += 1
- else
- r13 = nil
- end
- s8 << r13
- if r13
- if has_terminal?('\G[hH]', true, index)
- r14 = true
- @index += 1
- else
- r14 = nil
- end
- s8 << r14
- if r14
- if has_terminal?('\G[mM]', true, index)
- r15 = true
- @index += 1
- else
- r15 = nil
- end
- s8 << r15
- if r15
- if has_terminal?('\G[eE]', true, index)
- r16 = true
- @index += 1
- else
- r16 = nil
- end
- s8 << r16
- if r16
- if has_terminal?('\G[nN]', true, index)
- r17 = true
- @index += 1
- else
- r17 = nil
- end
- s8 << r17
- if r17
- if has_terminal?('\G[tT]', true, index)
- r18 = true
- @index += 1
- else
- r18 = nil
- end
- s8 << r18
- end
- end
- end
- end
- end
- end
- end
- end
- end
- if s8.last
- r8 = instantiate_node(SyntaxNode,input, i8...index, s8)
- r8.extend(DispositionType1)
- else
- @index = i8
- r8 = nil
- end
- if r8
- r0 = r8
- else
- r19 = _nt_extension_token
- if r19
- r0 = r19
- else
- if has_terminal?('', false, index)
- r20 = instantiate_node(SyntaxNode,input, index...(index + 0))
- @index += 0
- else
- terminal_parse_failure('')
- r20 = nil
- end
- if r20
- r0 = r20
- else
- @index = i0
- r0 = nil
- end
- end
- end
- end
-
- node_cache[:disposition_type][start_index] = r0
-
- r0
- end
-
- def _nt_extension_token
- start_index = index
- if node_cache[:extension_token].has_key?(index)
- cached = node_cache[:extension_token][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_ietf_token
- if r1
- r0 = r1
- else
- r2 = _nt_custom_x_token
- if r2
- r0 = r2
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:extension_token][start_index] = r0
-
- r0
- end
-
- module Parameter0
- def attr
- elements[1]
- end
-
- def val
- elements[3]
- end
-
- end
-
- module Parameter1
- def param_hash
- {attr.text_value => val.text_value}
- end
- end
-
- def _nt_parameter
- start_index = index
- if node_cache[:parameter].has_key?(index)
- cached = node_cache[:parameter][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r2 = _nt_CFWS
- if r2
- r1 = r2
- else
- r1 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r1
- if r1
- r3 = _nt_attribute
- s0 << r3
- if r3
- if has_terminal?("=", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("=")
- r4 = nil
- end
- s0 << r4
- if r4
- r5 = _nt_value
- s0 << r5
- if r5
- r7 = _nt_CFWS
- if r7
- r6 = r7
- else
- r6 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r6
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(Parameter0)
- r0.extend(Parameter1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:parameter][start_index] = r0
-
- r0
- end
-
- def _nt_attribute
- start_index = index
- if node_cache[:attribute].has_key?(index)
- cached = node_cache[:attribute][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- s0, i0 = [], index
- loop do
- r1 = _nt_token
- if r1
- s0 << r1
- else
- break
- end
- end
- if s0.empty?
- @index = i0
- r0 = nil
- else
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- end
-
- node_cache[:attribute][start_index] = r0
-
- r0
- end
-
- module Value0
- def text_value
- quoted_content.text_value
- end
- end
-
- def _nt_value
- start_index = index
- if node_cache[:value].has_key?(index)
- cached = node_cache[:value][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_quoted_string
- r1.extend(Value0)
- if r1
- r0 = r1
- else
- s2, i2 = [], index
- loop do
- i3 = index
- r4 = _nt_token
- if r4
- r3 = r4
- else
- if has_terminal?('\G[\\x3d]', true, index)
- r5 = true
- @index += 1
- else
- r5 = nil
- end
- if r5
- r3 = r5
- else
- @index = i3
- r3 = nil
- end
- end
- if r3
- s2 << r3
- else
- break
- end
- end
- if s2.empty?
- @index = i2
- r2 = nil
- else
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- end
- if r2
- r0 = r2
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:value][start_index] = r0
-
- r0
- end
-
- end
-
- class ContentDispositionParser < Treetop::Runtime::CompiledParser
- include ContentDisposition
- end
-
-end
diff --git a/lib/mail/parsers/content_disposition.treetop b/lib/mail/parsers/content_disposition.treetop
deleted file mode 100644
index ddcef56..0000000
--- a/lib/mail/parsers/content_disposition.treetop
+++ /dev/null
@@ -1,46 +0,0 @@
-module Mail
- grammar ContentDisposition
-
- include RFC2822
- include RFC2045
-
- rule content_disposition
- disposition_type param_hashes:(CFWS ";" parameter CFWS)* {
- def parameters
- param_hashes.elements.map do |param|
- param.parameter.param_hash
- end
- end
- }
- end
-
- rule disposition_type
- [iI] [nN] [lL] [iI] [nN] [eE] / [aA] [tT] [tT] [aA] [cC] [hH] [mM] [eE] [nN] [tT] / extension_token / ''
- end
-
- rule extension_token
- ietf_token / custom_x_token
- end
-
- rule parameter
- CFWS? attr:attribute "=" val:value CFWS? {
- def param_hash
- {attr.text_value => val.text_value}
- end
- }
- end
-
- rule attribute
- token+
- end
-
- rule value
- quoted_string {
- def text_value
- quoted_content.text_value
- end
- } / (token / [\x3d])+
- end
-
- end
-end
diff --git a/lib/mail/parsers/content_disposition_parser.rb b/lib/mail/parsers/content_disposition_parser.rb
new file mode 100644
index 0000000..6017d7d
--- /dev/null
+++ b/lib/mail/parsers/content_disposition_parser.rb
@@ -0,0 +1,67 @@
+module Mail::Parsers
+ class ContentDispositionParser
+ include Mail::Utilities
+
+ def parse(s)
+ content_disposition = ContentDispositionStruct.new("", nil)
+ if s.blank?
+ return content_disposition
+ end
+
+ actions, error = Ragel.parse(:content_disposition, s)
+ if error
+ raise Mail::Field::ParseError.new(Mail::ContentDispositionElement, s, error)
+ end
+
+ content_disposition.parameters = []
+
+ disp_type_s = param_attr_s = param_attr = qstr_s = qstr = param_val_s = nil
+ actions.each_slice(2) do |action_id, p|
+ action = Mail::Parsers::Ragel::ACTIONS[action_id]
+ case action
+
+ # Disposition Type
+ when :disp_type_s then disp_type_s = p
+ when :disp_type_e
+ content_disposition.disposition_type = s[disp_type_s..(p-1)].downcase
+
+ # Parameter Attribute
+ when :param_attr_s then param_attr_s = p
+ when :param_attr_e then param_attr = s[param_attr_s..(p-1)]
+
+ # Quoted String.
+ when :qstr_s then qstr_s = p
+ when :qstr_e then qstr = s[qstr_s..(p-1)]
+
+ # Parameter Value
+ when :param_val_s then param_val_s = p
+ when :param_val_e
+ if param_attr.nil?
+ raise Mail::Field::ParseError.new(Mail::ContentDispositionElement, s, "no attribute for value")
+ end
+
+ # Use quoted string value if one exists, otherwise use parameter value
+ if qstr
+ value = qstr
+ else
+ value = s[param_val_s..(p-1)]
+ end
+
+ content_disposition.parameters << { param_attr => value }
+ param_attr = nil
+ qstr = nil
+
+ else
+ raise Mail::Field::ParseError.new(Mail::ContentDispositionElement, s, "Failed to process unknown action: #{action}")
+ end
+ end
+
+ content_disposition
+ end
+
+ private
+ def cleaned(string)
+ string =~ /(.+);\s*$/ ? $1 : string
+ end
+ end
+end
diff --git a/lib/mail/parsers/content_location.rb b/lib/mail/parsers/content_location.rb
deleted file mode 100644
index d36aab4..0000000
--- a/lib/mail/parsers/content_location.rb
+++ /dev/null
@@ -1,139 +0,0 @@
-# Autogenerated from a Treetop grammar. Edits may be lost.
-
-
-module Mail
- module ContentLocation
- include Treetop::Runtime
-
- def root
- @root ||= :primary
- end
-
- include RFC2822
-
- include RFC2045
-
- module Primary0
- def CFWS1
- elements[0]
- end
-
- def location
- elements[1]
- end
-
- def CFWS2
- elements[2]
- end
- end
-
- def _nt_primary
- start_index = index
- if node_cache[:primary].has_key?(index)
- cached = node_cache[:primary][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r1 = _nt_CFWS
- s0 << r1
- if r1
- r2 = _nt_location
- s0 << r2
- if r2
- r3 = _nt_CFWS
- s0 << r3
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(Primary0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:primary][start_index] = r0
-
- r0
- end
-
- module Location0
- def text_value
- quoted_content.text_value
- end
- end
-
- def _nt_location
- start_index = index
- if node_cache[:location].has_key?(index)
- cached = node_cache[:location][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_quoted_string
- r1.extend(Location0)
- if r1
- r0 = r1
- else
- s2, i2 = [], index
- loop do
- i3 = index
- r4 = _nt_token
- if r4
- r3 = r4
- else
- if has_terminal?('\G[\\x3d]', true, index)
- r5 = true
- @index += 1
- else
- r5 = nil
- end
- if r5
- r3 = r5
- else
- @index = i3
- r3 = nil
- end
- end
- if r3
- s2 << r3
- else
- break
- end
- end
- if s2.empty?
- @index = i2
- r2 = nil
- else
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- end
- if r2
- r0 = r2
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:location][start_index] = r0
-
- r0
- end
-
- end
-
- class ContentLocationParser < Treetop::Runtime::CompiledParser
- include ContentLocation
- end
-
-end
\ No newline at end of file
diff --git a/lib/mail/parsers/content_location.treetop b/lib/mail/parsers/content_location.treetop
deleted file mode 100644
index 83e1d89..0000000
--- a/lib/mail/parsers/content_location.treetop
+++ /dev/null
@@ -1,20 +0,0 @@
-module Mail
- grammar ContentLocation
-
- include RFC2822
- include RFC2045
-
- rule primary
- CFWS location CFWS
- end
-
- rule location
- quoted_string {
- def text_value
- quoted_content.text_value
- end
- } / (token / [\x3d])+
- end
-
- end
-end
\ No newline at end of file
diff --git a/lib/mail/parsers/content_location_parser.rb b/lib/mail/parsers/content_location_parser.rb
new file mode 100644
index 0000000..ed6c2c2
--- /dev/null
+++ b/lib/mail/parsers/content_location_parser.rb
@@ -0,0 +1,35 @@
+module Mail::Parsers
+ class ContentLocationParser
+ def parse(s)
+ content_location = ContentLocationStruct.new(nil)
+ if s.blank?
+ return content_location
+ end
+
+ actions, error = Ragel.parse(:content_location, s)
+ if error
+ raise Mail::Field::ParseError.new(Mail::ContentLocationElement, s, error)
+ end
+
+ qstr_s = token_string_s = nil
+ actions.each_slice(2) do |action_id, p|
+ action = Mail::Parsers::Ragel::ACTIONS[action_id]
+ case action
+
+ # Quoted String.
+ when :qstr_s then qstr_s = p
+ when :qstr_e then content_location.location = s[qstr_s..(p-1)]
+
+ # Token String
+ when :token_string_s then token_string_s = p
+ when :token_string_e
+ content_location.location = s[token_string_s..(p-1)]
+
+ else
+ raise Mail::Field::ParseError.new(Mail::ContentLocationElement, s, "Failed to process unknown action: #{action}")
+ end
+ end
+ content_location
+ end
+ end
+end
diff --git a/lib/mail/parsers/content_transfer_encoding.rb b/lib/mail/parsers/content_transfer_encoding.rb
deleted file mode 100644
index 3e8b277..0000000
--- a/lib/mail/parsers/content_transfer_encoding.rb
+++ /dev/null
@@ -1,201 +0,0 @@
-# Autogenerated from a Treetop grammar. Edits may be lost.
-
-
-module Mail
- module ContentTransferEncoding
- include Treetop::Runtime
-
- def root
- @root ||= :primary
- end
-
- include RFC2822
-
- include RFC2045
-
- module Primary0
- def CFWS1
- elements[0]
- end
-
- def encoding
- elements[1]
- end
-
- def CFWS2
- elements[2]
- end
-
- def CFWS3
- elements[4]
- end
- end
-
- def _nt_primary
- start_index = index
- if node_cache[:primary].has_key?(index)
- cached = node_cache[:primary][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r1 = _nt_CFWS
- s0 << r1
- if r1
- r2 = _nt_encoding
- s0 << r2
- if r2
- r3 = _nt_CFWS
- s0 << r3
- if r3
- if has_terminal?(";", false, index)
- r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(";")
- r5 = nil
- end
- if r5
- r4 = r5
- else
- r4 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r4
- if r4
- r6 = _nt_CFWS
- s0 << r6
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(Primary0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:primary][start_index] = r0
-
- r0
- end
-
- def _nt_encoding
- start_index = index
- if node_cache[:encoding].has_key?(index)
- cached = node_cache[:encoding][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- if has_terminal?("7bits", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 5))
- @index += 5
- else
- terminal_parse_failure("7bits")
- r1 = nil
- end
- if r1
- r0 = r1
- else
- if has_terminal?("8bits", false, index)
- r2 = instantiate_node(SyntaxNode,input, index...(index + 5))
- @index += 5
- else
- terminal_parse_failure("8bits")
- r2 = nil
- end
- if r2
- r0 = r2
- else
- if has_terminal?("7bit", false, index)
- r3 = instantiate_node(SyntaxNode,input, index...(index + 4))
- @index += 4
- else
- terminal_parse_failure("7bit")
- r3 = nil
- end
- if r3
- r0 = r3
- else
- if has_terminal?("8bit", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 4))
- @index += 4
- else
- terminal_parse_failure("8bit")
- r4 = nil
- end
- if r4
- r0 = r4
- else
- if has_terminal?("binary", false, index)
- r5 = instantiate_node(SyntaxNode,input, index...(index + 6))
- @index += 6
- else
- terminal_parse_failure("binary")
- r5 = nil
- end
- if r5
- r0 = r5
- else
- if has_terminal?("quoted-printable", false, index)
- r6 = instantiate_node(SyntaxNode,input, index...(index + 16))
- @index += 16
- else
- terminal_parse_failure("quoted-printable")
- r6 = nil
- end
- if r6
- r0 = r6
- else
- if has_terminal?("base64", false, index)
- r7 = instantiate_node(SyntaxNode,input, index...(index + 6))
- @index += 6
- else
- terminal_parse_failure("base64")
- r7 = nil
- end
- if r7
- r0 = r7
- else
- r8 = _nt_ietf_token
- if r8
- r0 = r8
- else
- r9 = _nt_custom_x_token
- if r9
- r0 = r9
- else
- @index = i0
- r0 = nil
- end
- end
- end
- end
- end
- end
- end
- end
- end
-
- node_cache[:encoding][start_index] = r0
-
- r0
- end
-
- end
-
- class ContentTransferEncodingParser < Treetop::Runtime::CompiledParser
- include ContentTransferEncoding
- end
-
-end
diff --git a/lib/mail/parsers/content_transfer_encoding.treetop b/lib/mail/parsers/content_transfer_encoding.treetop
deleted file mode 100644
index 9db6134..0000000
--- a/lib/mail/parsers/content_transfer_encoding.treetop
+++ /dev/null
@@ -1,18 +0,0 @@
-module Mail
- grammar ContentTransferEncoding
-
- include RFC2822
- include RFC2045
-
- rule primary
- CFWS encoding CFWS ";"? CFWS
- end
-
- rule encoding
- "7bits" / "8bits" /
- "7bit" / "8bit" / "binary" / "quoted-printable" / "base64" /
- ietf_token / custom_x_token
- end
-
- end
-end
diff --git a/lib/mail/parsers/content_transfer_encoding_parser.rb b/lib/mail/parsers/content_transfer_encoding_parser.rb
new file mode 100644
index 0000000..cc480ed
--- /dev/null
+++ b/lib/mail/parsers/content_transfer_encoding_parser.rb
@@ -0,0 +1,33 @@
+module Mail::Parsers
+ class ContentTransferEncodingParser
+
+ def parse(s)
+ content_transfer_encoding = ContentTransferEncodingStruct.new("")
+ if s.blank?
+ return content_transfer_encoding
+ end
+
+ actions, error = Ragel.parse(:content_transfer_encoding, s)
+ if error
+ raise Mail::Field::ParseError.new(Mail::ContentTransferEncodingElement, s, error)
+ end
+
+ encoding_s = nil
+ actions.each_slice(2) do |action_id, p|
+ action = Mail::Parsers::Ragel::ACTIONS[action_id]
+ case action
+
+ # Encoding
+ when :encoding_s then encoding_s = p
+ when :encoding_e
+ content_transfer_encoding.encoding = s[encoding_s..(p-1)].downcase
+
+ else
+ raise Mail::Field::ParseError.new(Mail::ContentTransferEncodingElement, s, "Failed to process unknown action: #{action}")
+ end
+ end
+
+ content_transfer_encoding
+ end
+ end
+end
diff --git a/lib/mail/parsers/content_type.rb b/lib/mail/parsers/content_type.rb
deleted file mode 100644
index 5429f3c..0000000
--- a/lib/mail/parsers/content_type.rb
+++ /dev/null
@@ -1,971 +0,0 @@
-# Autogenerated from a Treetop grammar. Edits may be lost.
-
-
-module Mail
- module ContentType
- include Treetop::Runtime
-
- def root
- @root ||= :content_type
- end
-
- include RFC2822
-
- include RFC2045
-
- module ContentType0
- def CFWS1
- elements[0]
- end
-
- def parameter
- elements[2]
- end
-
- def CFWS2
- elements[3]
- end
- end
-
- module ContentType1
- def main_type
- elements[0]
- end
-
- def sub_type
- elements[2]
- end
-
- def param_hashes
- elements[3]
- end
- end
-
- module ContentType2
- def parameters
- param_hashes.elements.map do |param|
- param.parameter.param_hash
- end
- end
- end
-
- def _nt_content_type
- start_index = index
- if node_cache[:content_type].has_key?(index)
- cached = node_cache[:content_type][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r1 = _nt_main_type
- s0 << r1
- if r1
- if has_terminal?("/", false, index)
- r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("/")
- r2 = nil
- end
- s0 << r2
- if r2
- r3 = _nt_sub_type
- s0 << r3
- if r3
- s4, i4 = [], index
- loop do
- i5, s5 = index, []
- r6 = _nt_CFWS
- s5 << r6
- if r6
- s7, i7 = [], index
- loop do
- if has_terminal?(";", false, index)
- r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(";")
- r8 = nil
- end
- if r8
- s7 << r8
- else
- break
- end
- end
- r7 = instantiate_node(SyntaxNode,input, i7...index, s7)
- s5 << r7
- if r7
- r9 = _nt_parameter
- s5 << r9
- if r9
- r10 = _nt_CFWS
- s5 << r10
- end
- end
- end
- if s5.last
- r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
- r5.extend(ContentType0)
- else
- @index = i5
- r5 = nil
- end
- if r5
- s4 << r5
- else
- break
- end
- end
- r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
- s0 << r4
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ContentType1)
- r0.extend(ContentType2)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:content_type][start_index] = r0
-
- r0
- end
-
- def _nt_main_type
- start_index = index
- if node_cache[:main_type].has_key?(index)
- cached = node_cache[:main_type][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_discrete_type
- if r1
- r0 = r1
- else
- r2 = _nt_composite_type
- if r2
- r0 = r2
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:main_type][start_index] = r0
-
- r0
- end
-
- module DiscreteType0
- end
-
- module DiscreteType1
- end
-
- module DiscreteType2
- end
-
- module DiscreteType3
- end
-
- module DiscreteType4
- end
-
- def _nt_discrete_type
- start_index = index
- if node_cache[:discrete_type].has_key?(index)
- cached = node_cache[:discrete_type][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- i1, s1 = index, []
- if has_terminal?('\G[tT]', true, index)
- r2 = true
- @index += 1
- else
- r2 = nil
- end
- s1 << r2
- if r2
- if has_terminal?('\G[eE]', true, index)
- r3 = true
- @index += 1
- else
- r3 = nil
- end
- s1 << r3
- if r3
- if has_terminal?('\G[xX]', true, index)
- r4 = true
- @index += 1
- else
- r4 = nil
- end
- s1 << r4
- if r4
- if has_terminal?('\G[tT]', true, index)
- r5 = true
- @index += 1
- else
- r5 = nil
- end
- s1 << r5
- end
- end
- end
- if s1.last
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- r1.extend(DiscreteType0)
- else
- @index = i1
- r1 = nil
- end
- if r1
- r0 = r1
- else
- i6, s6 = index, []
- if has_terminal?('\G[iI]', true, index)
- r7 = true
- @index += 1
- else
- r7 = nil
- end
- s6 << r7
- if r7
- if has_terminal?('\G[mM]', true, index)
- r8 = true
- @index += 1
- else
- r8 = nil
- end
- s6 << r8
- if r8
- if has_terminal?('\G[aA]', true, index)
- r9 = true
- @index += 1
- else
- r9 = nil
- end
- s6 << r9
- if r9
- if has_terminal?('\G[gG]', true, index)
- r10 = true
- @index += 1
- else
- r10 = nil
- end
- s6 << r10
- if r10
- if has_terminal?('\G[eE]', true, index)
- r11 = true
- @index += 1
- else
- r11 = nil
- end
- s6 << r11
- end
- end
- end
- end
- if s6.last
- r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
- r6.extend(DiscreteType1)
- else
- @index = i6
- r6 = nil
- end
- if r6
- r0 = r6
- else
- i12, s12 = index, []
- if has_terminal?('\G[aA]', true, index)
- r13 = true
- @index += 1
- else
- r13 = nil
- end
- s12 << r13
- if r13
- if has_terminal?('\G[uU]', true, index)
- r14 = true
- @index += 1
- else
- r14 = nil
- end
- s12 << r14
- if r14
- if has_terminal?('\G[dD]', true, index)
- r15 = true
- @index += 1
- else
- r15 = nil
- end
- s12 << r15
- if r15
- if has_terminal?('\G[iI]', true, index)
- r16 = true
- @index += 1
- else
- r16 = nil
- end
- s12 << r16
- if r16
- if has_terminal?('\G[oO]', true, index)
- r17 = true
- @index += 1
- else
- r17 = nil
- end
- s12 << r17
- end
- end
- end
- end
- if s12.last
- r12 = instantiate_node(SyntaxNode,input, i12...index, s12)
- r12.extend(DiscreteType2)
- else
- @index = i12
- r12 = nil
- end
- if r12
- r0 = r12
- else
- i18, s18 = index, []
- if has_terminal?('\G[vV]', true, index)
- r19 = true
- @index += 1
- else
- r19 = nil
- end
- s18 << r19
- if r19
- if has_terminal?('\G[iI]', true, index)
- r20 = true
- @index += 1
- else
- r20 = nil
- end
- s18 << r20
- if r20
- if has_terminal?('\G[dD]', true, index)
- r21 = true
- @index += 1
- else
- r21 = nil
- end
- s18 << r21
- if r21
- if has_terminal?('\G[eE]', true, index)
- r22 = true
- @index += 1
- else
- r22 = nil
- end
- s18 << r22
- if r22
- if has_terminal?('\G[oO]', true, index)
- r23 = true
- @index += 1
- else
- r23 = nil
- end
- s18 << r23
- end
- end
- end
- end
- if s18.last
- r18 = instantiate_node(SyntaxNode,input, i18...index, s18)
- r18.extend(DiscreteType3)
- else
- @index = i18
- r18 = nil
- end
- if r18
- r0 = r18
- else
- i24, s24 = index, []
- if has_terminal?('\G[aA]', true, index)
- r25 = true
- @index += 1
- else
- r25 = nil
- end
- s24 << r25
- if r25
- if has_terminal?('\G[pP]', true, index)
- r26 = true
- @index += 1
- else
- r26 = nil
- end
- s24 << r26
- if r26
- if has_terminal?('\G[pP]', true, index)
- r27 = true
- @index += 1
- else
- r27 = nil
- end
- s24 << r27
- if r27
- if has_terminal?('\G[lL]', true, index)
- r28 = true
- @index += 1
- else
- r28 = nil
- end
- s24 << r28
- if r28
- if has_terminal?('\G[iI]', true, index)
- r29 = true
- @index += 1
- else
- r29 = nil
- end
- s24 << r29
- if r29
- if has_terminal?('\G[cC]', true, index)
- r30 = true
- @index += 1
- else
- r30 = nil
- end
- s24 << r30
- if r30
- if has_terminal?('\G[aA]', true, index)
- r31 = true
- @index += 1
- else
- r31 = nil
- end
- s24 << r31
- if r31
- if has_terminal?('\G[tT]', true, index)
- r32 = true
- @index += 1
- else
- r32 = nil
- end
- s24 << r32
- if r32
- if has_terminal?('\G[iI]', true, index)
- r33 = true
- @index += 1
- else
- r33 = nil
- end
- s24 << r33
- if r33
- if has_terminal?('\G[oO]', true, index)
- r34 = true
- @index += 1
- else
- r34 = nil
- end
- s24 << r34
- if r34
- if has_terminal?('\G[nN]', true, index)
- r35 = true
- @index += 1
- else
- r35 = nil
- end
- s24 << r35
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- if s24.last
- r24 = instantiate_node(SyntaxNode,input, i24...index, s24)
- r24.extend(DiscreteType4)
- else
- @index = i24
- r24 = nil
- end
- if r24
- r0 = r24
- else
- r36 = _nt_extension_token
- if r36
- r0 = r36
- else
- @index = i0
- r0 = nil
- end
- end
- end
- end
- end
- end
-
- node_cache[:discrete_type][start_index] = r0
-
- r0
- end
-
- module CompositeType0
- end
-
- module CompositeType1
- end
-
- def _nt_composite_type
- start_index = index
- if node_cache[:composite_type].has_key?(index)
- cached = node_cache[:composite_type][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- i1, s1 = index, []
- if has_terminal?('\G[mM]', true, index)
- r2 = true
- @index += 1
- else
- r2 = nil
- end
- s1 << r2
- if r2
- if has_terminal?('\G[eE]', true, index)
- r3 = true
- @index += 1
- else
- r3 = nil
- end
- s1 << r3
- if r3
- if has_terminal?('\G[sS]', true, index)
- r4 = true
- @index += 1
- else
- r4 = nil
- end
- s1 << r4
- if r4
- if has_terminal?('\G[sS]', true, index)
- r5 = true
- @index += 1
- else
- r5 = nil
- end
- s1 << r5
- if r5
- if has_terminal?('\G[aA]', true, index)
- r6 = true
- @index += 1
- else
- r6 = nil
- end
- s1 << r6
- if r6
- if has_terminal?('\G[gG]', true, index)
- r7 = true
- @index += 1
- else
- r7 = nil
- end
- s1 << r7
- if r7
- if has_terminal?('\G[eE]', true, index)
- r8 = true
- @index += 1
- else
- r8 = nil
- end
- s1 << r8
- end
- end
- end
- end
- end
- end
- if s1.last
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- r1.extend(CompositeType0)
- else
- @index = i1
- r1 = nil
- end
- if r1
- r0 = r1
- else
- i9, s9 = index, []
- if has_terminal?('\G[mM]', true, index)
- r10 = true
- @index += 1
- else
- r10 = nil
- end
- s9 << r10
- if r10
- if has_terminal?('\G[uU]', true, index)
- r11 = true
- @index += 1
- else
- r11 = nil
- end
- s9 << r11
- if r11
- if has_terminal?('\G[lL]', true, index)
- r12 = true
- @index += 1
- else
- r12 = nil
- end
- s9 << r12
- if r12
- if has_terminal?('\G[tT]', true, index)
- r13 = true
- @index += 1
- else
- r13 = nil
- end
- s9 << r13
- if r13
- if has_terminal?('\G[iI]', true, index)
- r14 = true
- @index += 1
- else
- r14 = nil
- end
- s9 << r14
- if r14
- if has_terminal?('\G[pP]', true, index)
- r15 = true
- @index += 1
- else
- r15 = nil
- end
- s9 << r15
- if r15
- if has_terminal?('\G[aA]', true, index)
- r16 = true
- @index += 1
- else
- r16 = nil
- end
- s9 << r16
- if r16
- if has_terminal?('\G[rR]', true, index)
- r17 = true
- @index += 1
- else
- r17 = nil
- end
- s9 << r17
- if r17
- if has_terminal?('\G[tT]', true, index)
- r18 = true
- @index += 1
- else
- r18 = nil
- end
- s9 << r18
- end
- end
- end
- end
- end
- end
- end
- end
- if s9.last
- r9 = instantiate_node(SyntaxNode,input, i9...index, s9)
- r9.extend(CompositeType1)
- else
- @index = i9
- r9 = nil
- end
- if r9
- r0 = r9
- else
- r19 = _nt_extension_token
- if r19
- r0 = r19
- else
- @index = i0
- r0 = nil
- end
- end
- end
-
- node_cache[:composite_type][start_index] = r0
-
- r0
- end
-
- def _nt_extension_token
- start_index = index
- if node_cache[:extension_token].has_key?(index)
- cached = node_cache[:extension_token][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_ietf_token
- if r1
- r0 = r1
- else
- r2 = _nt_custom_x_token
- if r2
- r0 = r2
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:extension_token][start_index] = r0
-
- r0
- end
-
- def _nt_sub_type
- start_index = index
- if node_cache[:sub_type].has_key?(index)
- cached = node_cache[:sub_type][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_extension_token
- if r1
- r0 = r1
- else
- r2 = _nt_iana_token
- if r2
- r0 = r2
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:sub_type][start_index] = r0
-
- r0
- end
-
- module Parameter0
- def attr
- elements[1]
- end
-
- def val
- elements[3]
- end
-
- end
-
- module Parameter1
- def param_hash
- {attr.text_value => val.text_value}
- end
- end
-
- def _nt_parameter
- start_index = index
- if node_cache[:parameter].has_key?(index)
- cached = node_cache[:parameter][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r2 = _nt_CFWS
- if r2
- r1 = r2
- else
- r1 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r1
- if r1
- r3 = _nt_attribute
- s0 << r3
- if r3
- if has_terminal?("=", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("=")
- r4 = nil
- end
- s0 << r4
- if r4
- r5 = _nt_value
- s0 << r5
- if r5
- r7 = _nt_CFWS
- if r7
- r6 = r7
- else
- r6 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r6
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(Parameter0)
- r0.extend(Parameter1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:parameter][start_index] = r0
-
- r0
- end
-
- def _nt_attribute
- start_index = index
- if node_cache[:attribute].has_key?(index)
- cached = node_cache[:attribute][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- s0, i0 = [], index
- loop do
- r1 = _nt_token
- if r1
- s0 << r1
- else
- break
- end
- end
- if s0.empty?
- @index = i0
- r0 = nil
- else
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- end
-
- node_cache[:attribute][start_index] = r0
-
- r0
- end
-
- module Value0
- def text_value
- quoted_content.text_value
- end
- end
-
- def _nt_value
- start_index = index
- if node_cache[:value].has_key?(index)
- cached = node_cache[:value][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_quoted_string
- r1.extend(Value0)
- if r1
- r0 = r1
- else
- s2, i2 = [], index
- loop do
- i3 = index
- r4 = _nt_token
- if r4
- r3 = r4
- else
- if has_terminal?('\G[\\x3d]', true, index)
- r5 = true
- @index += 1
- else
- r5 = nil
- end
- if r5
- r3 = r5
- else
- @index = i3
- r3 = nil
- end
- end
- if r3
- s2 << r3
- else
- break
- end
- end
- if s2.empty?
- @index = i2
- r2 = nil
- else
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- end
- if r2
- r0 = r2
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:value][start_index] = r0
-
- r0
- end
-
- end
-
- class ContentTypeParser < Treetop::Runtime::CompiledParser
- include ContentType
- end
-
-end
diff --git a/lib/mail/parsers/content_type.treetop b/lib/mail/parsers/content_type.treetop
deleted file mode 100644
index 84eeced..0000000
--- a/lib/mail/parsers/content_type.treetop
+++ /dev/null
@@ -1,68 +0,0 @@
-module Mail
- grammar ContentType
-
- include RFC2822
- include RFC2045
-
- rule content_type
- main_type "/" sub_type param_hashes:(CFWS ";"* parameter CFWS)* {
- def parameters
- param_hashes.elements.map do |param|
- param.parameter.param_hash
- end
- end
- }
- end
-
- rule main_type
- discrete_type / composite_type
- end
-
- # This matches in a case insensitive way:
- #
- # rule discrete_type
- # "text" / "image" / "audio" / "video" / "application" / extension_token
- # end
- rule discrete_type
- [tT] [eE] [xX] [tT] / [iI] [mM] [aA] [gG] [eE] / [aA] [uU] [dD] [iI] [oO] / [vV] [iI] [dD] [eE] [oO] / [aA] [pP] [pP] [lL] [iI] [cC] [aA] [tT] [iI] [oO] [nN] / extension_token
- end
-
- # This matches in a case insensitive way:
- #
- # rule composite_type
- # "message" / "multipart" / extension_token
- # end
- rule composite_type
- [mM] [eE] [sS] [sS] [aA] [gG] [eE] / [mM] [uU] [lL] [tT] [iI] [pP] [aA] [rR] [tT] / extension_token
- end
-
- rule extension_token
- ietf_token / custom_x_token
- end
-
- rule sub_type
- extension_token / iana_token
- end
-
- rule parameter
- CFWS? attr:attribute "=" val:value CFWS? {
- def param_hash
- {attr.text_value => val.text_value}
- end
- }
- end
-
- rule attribute
- token+
- end
-
- rule value
- quoted_string {
- def text_value
- quoted_content.text_value
- end
- } / (token / [\x3d])+
- end
-
- end
-end
diff --git a/lib/mail/parsers/content_type_parser.rb b/lib/mail/parsers/content_type_parser.rb
new file mode 100644
index 0000000..8ec24e6
--- /dev/null
+++ b/lib/mail/parsers/content_type_parser.rb
@@ -0,0 +1,64 @@
+module Mail::Parsers
+ class ContentTypeParser
+ include Mail::Utilities
+
+ def parse(s)
+ actions, error = Ragel.parse(:content_type, s)
+ if error
+ raise Mail::Field::ParseError.new(Mail::ContentTypeElement, s, error)
+ end
+
+ content_type = ContentTypeStruct.new(nil,nil,[])
+
+ content_type.parameters = []
+
+ main_type_s = sub_type_s = param_attr_s = param_attr = nil
+ qstr_s = qstr = param_val_s = nil
+ actions.each_slice(2) do |action_id, p|
+ action = Mail::Parsers::Ragel::ACTIONS[action_id]
+ case action
+
+ # Main Type
+ when :main_type_s then main_type_s = p
+ when :main_type_e then
+ content_type.main_type = s[main_type_s..(p-1)].downcase
+
+ # Sub Type
+ when :sub_type_s then sub_type_s = p
+ when :sub_type_e
+ content_type.sub_type = s[sub_type_s..(p-1)].downcase
+
+ # Parameter Attribute
+ when :param_attr_s then param_attr_s = p
+ when :param_attr_e then param_attr = s[param_attr_s..(p-1)]
+
+ # Quoted String.
+ when :qstr_s then qstr_s = p
+ when :qstr_e then qstr = s[qstr_s..(p-1)]
+
+ # Parameter Value
+ when :param_val_s then param_val_s = p
+ when :param_val_e
+ if param_attr.nil?
+ raise Mail::Field::ParseError.new(Mail::ContentTypeElement, s, "no attribute for value")
+ end
+
+ # Use quoted s value if one exists, otherwise use parameter value
+ if qstr
+ value = qstr
+ else
+ value = s[param_val_s..(p-1)]
+ end
+
+ content_type.parameters << { param_attr => value }
+ param_attr = nil
+ qstr = nil
+
+ else
+ raise Mail::Field::ParseError.new(Mail::ContentTypeElement, s, "Failed to process unknown action: #{action}")
+ end
+ end
+ content_type
+ end
+ end
+end
diff --git a/lib/mail/parsers/date_time.rb b/lib/mail/parsers/date_time.rb
deleted file mode 100644
index 72f2f2e..0000000
--- a/lib/mail/parsers/date_time.rb
+++ /dev/null
@@ -1,114 +0,0 @@
-# Autogenerated from a Treetop grammar. Edits may be lost.
-
-
-module Mail
- module DateTime
- include Treetop::Runtime
-
- def root
- @root ||= :primary
- end
-
- include RFC2822
-
- module Primary0
- def day_of_week
- elements[0]
- end
-
- end
-
- module Primary1
- def date
- elements[1]
- end
-
- def FWS
- elements[2]
- end
-
- def time
- elements[3]
- end
-
- end
-
- def _nt_primary
- start_index = index
- if node_cache[:primary].has_key?(index)
- cached = node_cache[:primary][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- i2, s2 = index, []
- r3 = _nt_day_of_week
- s2 << r3
- if r3
- if has_terminal?(",", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(",")
- r4 = nil
- end
- s2 << r4
- end
- if s2.last
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- r2.extend(Primary0)
- else
- @index = i2
- r2 = nil
- end
- if r2
- r1 = r2
- else
- r1 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r1
- if r1
- r5 = _nt_date
- s0 << r5
- if r5
- r6 = _nt_FWS
- s0 << r6
- if r6
- r7 = _nt_time
- s0 << r7
- if r7
- r9 = _nt_CFWS
- if r9
- r8 = r9
- else
- r8 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r8
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(Primary1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:primary][start_index] = r0
-
- r0
- end
-
- end
-
- class DateTimeParser < Treetop::Runtime::CompiledParser
- include DateTime
- end
-
-end
\ No newline at end of file
diff --git a/lib/mail/parsers/date_time.treetop b/lib/mail/parsers/date_time.treetop
deleted file mode 100644
index 98321f9..0000000
--- a/lib/mail/parsers/date_time.treetop
+++ /dev/null
@@ -1,11 +0,0 @@
-module Mail
- grammar DateTime
-
- include RFC2822
-
- rule primary
- ( day_of_week ",")? date FWS time CFWS?
- end
-
- end
-end
\ No newline at end of file
diff --git a/lib/mail/parsers/date_time_parser.rb b/lib/mail/parsers/date_time_parser.rb
new file mode 100644
index 0000000..cb10736
--- /dev/null
+++ b/lib/mail/parsers/date_time_parser.rb
@@ -0,0 +1,36 @@
+module Mail::Parsers
+ class DateTimeParser
+ include Mail::Utilities
+
+ def parse(s)
+ date_time = DateTimeStruct.new([])
+
+ actions, error = Ragel.parse(:date_time, s)
+ if error
+ raise Mail::Field::ParseError.new(Mail::DateTimeElement, s, error)
+ end
+
+ date_s = time_s = nil
+ actions.each_slice(2) do |action_id, p|
+ action = Mail::Parsers::Ragel::ACTIONS[action_id]
+ case action
+
+ # Date
+ when :date_s then date_s = p
+ when :date_e
+ date_time.date_string = s[date_s..(p-1)]
+
+ # Time
+ when :time_s then time_s = p
+ when :time_e
+ date_time.time_string = s[time_s..(p-1)]
+
+ else
+ raise Mail::Field::ParseError.new(Mail::DateTimeElement, s, "Failed to process unknown action: #{action}")
+ end
+ end
+
+ date_time
+ end
+ end
+end
diff --git a/lib/mail/parsers/envelope_from.rb b/lib/mail/parsers/envelope_from.rb
deleted file mode 100644
index 277a8a8..0000000
--- a/lib/mail/parsers/envelope_from.rb
+++ /dev/null
@@ -1,194 +0,0 @@
-# Autogenerated from a Treetop grammar. Edits may be lost.
-
-
-module Mail
- module EnvelopeFrom
- include Treetop::Runtime
-
- def root
- @root ||= :primary
- end
-
- include RFC2822
-
- module Primary0
- def addr_spec
- elements[0]
- end
-
- def ctime_date
- elements[1]
- end
- end
-
- def _nt_primary
- start_index = index
- if node_cache[:primary].has_key?(index)
- cached = node_cache[:primary][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r1 = _nt_addr_spec
- s0 << r1
- if r1
- r2 = _nt_ctime_date
- s0 << r2
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(Primary0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:primary][start_index] = r0
-
- r0
- end
-
- module CtimeDate0
- def day_name
- elements[0]
- end
-
- def month_name
- elements[2]
- end
-
- def day
- elements[4]
- end
-
- def time_of_day
- elements[6]
- end
-
- def year
- elements[8]
- end
- end
-
- def _nt_ctime_date
- start_index = index
- if node_cache[:ctime_date].has_key?(index)
- cached = node_cache[:ctime_date][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r1 = _nt_day_name
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- if has_terminal?(" ", false, index)
- r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(" ")
- r3 = nil
- end
- if r3
- s2 << r3
- else
- break
- end
- end
- if s2.empty?
- @index = i2
- r2 = nil
- else
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- end
- s0 << r2
- if r2
- r4 = _nt_month_name
- s0 << r4
- if r4
- s5, i5 = [], index
- loop do
- if has_terminal?(" ", false, index)
- r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(" ")
- r6 = nil
- end
- if r6
- s5 << r6
- else
- break
- end
- end
- if s5.empty?
- @index = i5
- r5 = nil
- else
- r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
- end
- s0 << r5
- if r5
- r7 = _nt_day
- s0 << r7
- if r7
- if has_terminal?(" ", false, index)
- r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(" ")
- r8 = nil
- end
- s0 << r8
- if r8
- r9 = _nt_time_of_day
- s0 << r9
- if r9
- if has_terminal?(" ", false, index)
- r10 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(" ")
- r10 = nil
- end
- s0 << r10
- if r10
- r11 = _nt_year
- s0 << r11
- end
- end
- end
- end
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(CtimeDate0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:ctime_date][start_index] = r0
-
- r0
- end
-
- end
-
- class EnvelopeFromParser < Treetop::Runtime::CompiledParser
- include EnvelopeFrom
- end
-
-end
\ No newline at end of file
diff --git a/lib/mail/parsers/envelope_from.treetop b/lib/mail/parsers/envelope_from.treetop
deleted file mode 100644
index 2c20f40..0000000
--- a/lib/mail/parsers/envelope_from.treetop
+++ /dev/null
@@ -1,32 +0,0 @@
-module Mail
- grammar EnvelopeFrom
-
- include RFC2822
-
- # The exact character sequence of "From";
- #
- # a single Space character (0x20);
- #
- # the email address of the message sender (as obtained from the
- # message envelope or other authoritative source), conformant
- # with the "addr-spec" syntax from RFC 2822;
- #
- # a single Space character;
- #
- # a timestamp indicating the UTC date and time when the message
- # was originally received, conformant with the syntax of the
- # traditional UNIX 'ctime' output sans timezone (note that the
- # use of UTC precludes the need for a timezone indicator);
- # Thu Nov 24 18:22:48 1986
- #
- # an end-of-line marker.
- rule primary
- addr_spec ctime_date
- end
-
- rule ctime_date
- day_name " "+ month_name " "+ day " " time_of_day " " year
- end
-
- end
-end
\ No newline at end of file
diff --git a/lib/mail/parsers/envelope_from_parser.rb b/lib/mail/parsers/envelope_from_parser.rb
new file mode 100644
index 0000000..c56b7eb
--- /dev/null
+++ b/lib/mail/parsers/envelope_from_parser.rb
@@ -0,0 +1,45 @@
+module Mail::Parsers
+ class EnvelopeFromParser
+ def parse(s)
+ envelope_from = EnvelopeFromStruct.new
+ if s.blank?
+ return envelope_from
+ end
+
+ actions, error = Ragel.parse(:envelope_from, s)
+ if error
+ raise Mail::Field::ParseError.new(Mail::EnvelopeFromElement, s, error)
+ end
+
+ address_s = ctime_date_s = nil
+ envelope_from = EnvelopeFromStruct.new
+ actions.each_slice(2) do |action_id, p|
+ action = Mail::Parsers::Ragel::ACTIONS[action_id]
+ case action
+
+ # Address
+ when :address_s then address_s = p
+ when :address_e
+ envelope_from.address = s[address_s..(p-1)].rstrip
+
+ # ctime_date
+ when :ctime_date_s then ctime_date_s = p
+ when :ctime_date_e
+ envelope_from.ctime_date = s[ctime_date_s..(p-1)]
+
+ # ignored actions
+ when :angle_addr_s, :comment_e, :comment_s,
+ :domain_e, :domain_s, :local_dot_atom_e,
+ :local_dot_atom_pre_comment_e,
+ :local_dot_atom_pre_comment_s,
+ :local_dot_atom_s, :qstr_e, :qstr_s
+ nil
+
+ else
+ raise Mail::Field::ParseError.new(Mail::EnvelopeFromElement, s, "Failed to process unknown action: #{action}")
+ end
+ end
+ envelope_from
+ end
+ end
+end
diff --git a/lib/mail/parsers/message_ids.rb b/lib/mail/parsers/message_ids.rb
deleted file mode 100644
index bc4cc81..0000000
--- a/lib/mail/parsers/message_ids.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-# Autogenerated from a Treetop grammar. Edits may be lost.
-
-
-module Mail
- module MessageIds
- include Treetop::Runtime
-
- def root
- @root ||= :primary
- end
-
- include RFC2822
-
- module Primary0
- def message_ids
- [first_msg_id] + other_msg_ids.elements.map { |o| o.msg_id_value }
- end
- end
-
- def _nt_primary
- start_index = index
- if node_cache[:primary].has_key?(index)
- cached = node_cache[:primary][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- r0 = _nt_message_ids
- r0.extend(Primary0)
-
- node_cache[:primary][start_index] = r0
-
- r0
- end
-
- end
-
- class MessageIdsParser < Treetop::Runtime::CompiledParser
- include MessageIds
- end
-
-end
\ No newline at end of file
diff --git a/lib/mail/parsers/message_ids.treetop b/lib/mail/parsers/message_ids.treetop
deleted file mode 100644
index 68c5fad..0000000
--- a/lib/mail/parsers/message_ids.treetop
+++ /dev/null
@@ -1,15 +0,0 @@
-module Mail
- grammar MessageIds
-
- include RFC2822
-
- rule primary
- message_ids {
- def message_ids
- [first_msg_id] + other_msg_ids.elements.map { |o| o.msg_id_value }
- end
- }
- end
-
- end
-end
\ No newline at end of file
diff --git a/lib/mail/parsers/message_ids_parser.rb b/lib/mail/parsers/message_ids_parser.rb
new file mode 100644
index 0000000..2942883
--- /dev/null
+++ b/lib/mail/parsers/message_ids_parser.rb
@@ -0,0 +1,39 @@
+module Mail::Parsers
+ class MessageIdsParser
+ def parse(s)
+ if s.blank?
+ return MessageIdsStruct.new
+ end
+
+ message_ids = MessageIdsStruct.new([])
+
+ actions, error = Ragel.parse(:message_ids, s)
+ if error
+ raise Mail::Field::ParseError.new(Mail::MessageIdsElement, s, error)
+ end
+
+ msg_id_s = nil
+ actions.each_slice(2) do |action_id, p|
+ action = Mail::Parsers::Ragel::ACTIONS[action_id]
+ case action
+
+ # Message Ids
+ when :msg_id_s then msg_id_s = p
+ when :msg_id_e
+ message_ids.message_ids << s[msg_id_s..(p-1)].rstrip
+
+ when :domain_e, :domain_s, :local_dot_atom_e,
+ :local_dot_atom_pre_comment_e,
+ :local_dot_atom_pre_comment_s,
+ :local_dot_atom_s
+
+ # ignored actions
+
+ else
+ raise Mail::Field::ParseError.new(Mail::MessageIdsElement, s, "Failed to process unknown action: #{action}")
+ end
+ end
+ message_ids
+ end
+ end
+end
diff --git a/lib/mail/parsers/mime_version.rb b/lib/mail/parsers/mime_version.rb
deleted file mode 100644
index d1ad91b..0000000
--- a/lib/mail/parsers/mime_version.rb
+++ /dev/null
@@ -1,144 +0,0 @@
-# Autogenerated from a Treetop grammar. Edits may be lost.
-
-
-module Mail
- module MimeVersion
- include Treetop::Runtime
-
- def root
- @root ||= :version
- end
-
- include RFC2822
-
- module Version0
- def CFWS1
- elements[0]
- end
-
- def major_digits
- elements[1]
- end
-
- def minor_digits
- elements[5]
- end
-
- def CFWS2
- elements[6]
- end
- end
-
- module Version1
- def major
- major_digits
- end
-
- def minor
- minor_digits
- end
- end
-
- def _nt_version
- start_index = index
- if node_cache[:version].has_key?(index)
- cached = node_cache[:version][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r1 = _nt_CFWS
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- r3 = _nt_DIGIT
- if r3
- s2 << r3
- else
- break
- end
- end
- if s2.empty?
- @index = i2
- r2 = nil
- else
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- end
- s0 << r2
- if r2
- r5 = _nt_comment
- if r5
- r4 = r5
- else
- r4 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r4
- if r4
- if has_terminal?(".", false, index)
- r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(".")
- r6 = nil
- end
- s0 << r6
- if r6
- r8 = _nt_comment
- if r8
- r7 = r8
- else
- r7 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r7
- if r7
- s9, i9 = [], index
- loop do
- r10 = _nt_DIGIT
- if r10
- s9 << r10
- else
- break
- end
- end
- if s9.empty?
- @index = i9
- r9 = nil
- else
- r9 = instantiate_node(SyntaxNode,input, i9...index, s9)
- end
- s0 << r9
- if r9
- r11 = _nt_CFWS
- s0 << r11
- end
- end
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(Version0)
- r0.extend(Version1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:version][start_index] = r0
-
- r0
- end
-
- end
-
- class MimeVersionParser < Treetop::Runtime::CompiledParser
- include MimeVersion
- end
-
-end
\ No newline at end of file
diff --git a/lib/mail/parsers/mime_version.treetop b/lib/mail/parsers/mime_version.treetop
deleted file mode 100644
index 6f2a9c8..0000000
--- a/lib/mail/parsers/mime_version.treetop
+++ /dev/null
@@ -1,19 +0,0 @@
-module Mail
- grammar MimeVersion
-
- include RFC2822
-
- rule version
- CFWS major_digits:DIGIT+ comment? "." comment? minor_digits:DIGIT+ CFWS {
- def major
- major_digits
- end
-
- def minor
- minor_digits
- end
- }
- end
-
- end
-end
\ No newline at end of file
diff --git a/lib/mail/parsers/mime_version_parser.rb b/lib/mail/parsers/mime_version_parser.rb
new file mode 100644
index 0000000..71b7b09
--- /dev/null
+++ b/lib/mail/parsers/mime_version_parser.rb
@@ -0,0 +1,41 @@
+module Mail::Parsers
+ class MimeVersionParser
+ include Mail::Utilities
+
+ def parse(s)
+ if s.blank?
+ return MimeVersionStruct.new("", nil)
+ end
+
+ mime_version = MimeVersionStruct.new
+
+ actions, error = Ragel.parse(:mime_version, s)
+ if error
+ raise Mail::Field::ParseError.new(Mail::MimeVersionElement, s, error)
+ end
+
+ major_digits_s = minor_digits_s = nil
+ actions.each_slice(2) do |action_id, p|
+ action = Mail::Parsers::Ragel::ACTIONS[action_id]
+ case action
+
+ # Major Digits
+ when :major_digits_s then major_digits_s = p
+ when :major_digits_e
+ mime_version.major = s[major_digits_s..(p-1)]
+
+ # Minor Digits
+ when :minor_digits_s then minor_digits_s = p
+ when :minor_digits_e
+ mime_version.minor = s[minor_digits_s..(p-1)]
+
+ when :comment_e, :comment_s then nil
+
+ else
+ raise Mail::Field::ParseError.new(Mail::MimeVersionElement, s, "Failed to process unknown action: #{action}")
+ end
+ end
+ mime_version
+ end
+ end
+end
diff --git a/lib/mail/parsers/phrase_lists.rb b/lib/mail/parsers/phrase_lists.rb
deleted file mode 100644
index 89b10b8..0000000
--- a/lib/mail/parsers/phrase_lists.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-# Autogenerated from a Treetop grammar. Edits may be lost.
-
-
-module Mail
- module PhraseLists
- include Treetop::Runtime
-
- def root
- @root ||= :primary_phrase
- end
-
- include RFC2822
-
- module PrimaryPhrase0
- def phrases
- [first_phrase] + other_phrases.elements.map { |o| o.phrase_value }
- end
- end
-
- def _nt_primary_phrase
- start_index = index
- if node_cache[:primary_phrase].has_key?(index)
- cached = node_cache[:primary_phrase][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- r0 = _nt_phrase_list
- r0.extend(PrimaryPhrase0)
-
- node_cache[:primary_phrase][start_index] = r0
-
- r0
- end
-
- end
-
- class PhraseListsParser < Treetop::Runtime::CompiledParser
- include PhraseLists
- end
-
-end
\ No newline at end of file
diff --git a/lib/mail/parsers/phrase_lists.treetop b/lib/mail/parsers/phrase_lists.treetop
deleted file mode 100644
index 46ba327..0000000
--- a/lib/mail/parsers/phrase_lists.treetop
+++ /dev/null
@@ -1,15 +0,0 @@
-module Mail
- grammar PhraseLists
-
- include RFC2822
-
- rule primary_phrase
- phrase_list {
- def phrases
- [first_phrase] + other_phrases.elements.map { |o| o.phrase_value }
- end
- }
- end
-
- end
-end
\ No newline at end of file
diff --git a/lib/mail/parsers/phrase_lists_parser.rb b/lib/mail/parsers/phrase_lists_parser.rb
new file mode 100644
index 0000000..4c19121
--- /dev/null
+++ b/lib/mail/parsers/phrase_lists_parser.rb
@@ -0,0 +1,33 @@
+module Mail::Parsers
+ class PhraseListsParser
+
+ def parse(s)
+ actions, error = Ragel.parse(:phrase_lists, s)
+ if error
+ raise Mail::Field::ParseError.new(Mail::PhraseList, s, error)
+ end
+
+ phrase_lists = PhraseListsStruct.new([])
+
+ phrase_s = nil
+ actions.each_slice(2) do |action_id, p|
+ action = Mail::Parsers::Ragel::ACTIONS[action_id]
+ case action
+
+ # Phrase
+ when :phrase_s then phrase_s = p
+ when :phrase_e
+ phrase_lists.phrases << s[phrase_s..(p-1)] if phrase_s
+ phrase_s = nil
+
+ when :comment_e, :comment_s, :qstr_s, :qstr_e then nil
+
+ else
+ raise Mail::Field::ParseError.new(Mail::PhraseList, s, "Failed to process unknown action: #{action}")
+ end
+ end
+
+ phrase_lists
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel.rb b/lib/mail/parsers/ragel.rb
new file mode 100644
index 0000000..306ed8d
--- /dev/null
+++ b/lib/mail/parsers/ragel.rb
@@ -0,0 +1,17 @@
+module Mail
+ module Parsers
+ module Ragel
+ require 'mail/parsers/ragel/parser_info'
+ require "mail/parsers/ragel/ruby"
+
+ def self.parse(machine, string)
+ @machine_module ||= Ruby
+ @machine_module.parse(machine, string)
+ end
+
+ def self.machine_module=(m)
+ @machine_module = m
+ end
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel/common.rl b/lib/mail/parsers/ragel/common.rl
new file mode 100644
index 0000000..ce23b31
--- /dev/null
+++ b/lib/mail/parsers/ragel/common.rl
@@ -0,0 +1,184 @@
+%%{
+
+ machine common;
+
+ action comment_begin { fcall comment_tail; }
+ action comment_exit { fret; }
+
+ # RFC5322: address_lists, date_time, message_ids, phrase_lists, received
+
+ obs_NO_WS_CTL = 0x01..0x08 | 0x0b | 0x0c | 0x0e..0x1f | 0x7f;
+ LF = "\n";
+ CR = "\r";
+ CRLF = "\r\n";
+ WSP = 0x09 | 0x20;
+ obs_ctext = obs_NO_WS_CTL;
+ VCHAR = 0x21..0x7e;
+ obs_qp = "\\" (0x00 | obs_NO_WS_CTL | LF | CR);
+ obs_FWS = (CRLF? WSP)+;
+ ctext = 0x21..0x27 | 0x2a..0x5b | 0x5d..0x7e | obs_ctext;
+ quoted_pair = ("\\" (VCHAR | WSP)) | obs_qp;
+ FWS = (WSP* CRLF WSP+) | (CRLF WSP+) | obs_FWS;
+ ALPHA = [a-zA-Z];
+ DIGIT = [0-9];
+ DQUOTE = '"';
+ obs_qtext = obs_NO_WS_CTL;
+ atext = ALPHA | DIGIT | "!" | "#" | "$" | "%" | "&" |
+ "'" | "*" | "+" | "-" | "/" | "=" | "?" | "^" |
+ "_" | "`" | "{" | "|" | "}" | "~";
+ qtext = 0x21 | 0x23..0x5b | 0x5d..0x7e | obs_qtext;
+ obs_dtext = obs_NO_WS_CTL | quoted_pair;
+ qcontent = qtext | quoted_pair;
+
+ # Handle recursive comments
+ ccontent = ctext | quoted_pair | "(" @comment_begin;
+ comment_tail := ((FWS? ccontent)* >comment_s) FWS? ")" @comment_exit;
+ comment = "(" @comment_begin %comment_e;
+ CFWS = ((FWS? comment)+ FWS?) | FWS;
+
+ quoted_string = CFWS?
+ (DQUOTE
+ (((FWS? qcontent)* FWS?) >qstr_s %qstr_e)
+ DQUOTE)
+ CFWS?;
+
+ atom = CFWS? atext+ CFWS?;
+ word = atom | quoted_string;
+
+ # phrase_lists
+ obs_phrase = (word | "." | "@")+;
+ phrase = (obs_phrase | word+) >phrase_s %phrase_e;
+ phrase_lists = phrase ("," FWS* phrase)*;
+
+ # address_lists
+
+ # local_part:
+ domain_text = (DQUOTE (FWS? qcontent)+ FWS? DQUOTE) | atext+;
+ local_dot_atom_text = ("."* domain_text "."*)+;
+ local_dot_atom = CFWS?
+ (local_dot_atom_text >local_dot_atom_s %local_dot_atom_pre_comment_e)
+ CFWS?;
+ obs_local_part = word ("." word)*;
+ local_part = (local_dot_atom >local_dot_atom_s %local_dot_atom_e |
+ (quoted_string %local_quoted_string_e) |
+ obs_local_part);
+
+ # Treetop parser behavior was to ignore addresses missing '@' inside of angle
+ # brackets. This construction preserves that behavior.
+ local_part_no_capture = (local_dot_atom | quoted_string | obs_local_part);
+
+ # domain:
+ dot_atom_text = "."* domain_text ("."* domain_text)*;
+ dtext = 0x21..0x5a | 0x5e..0x7e | obs_dtext;
+ dot_atom = CFWS? dot_atom_text (CFWS? >(comment_after_address,1));
+ domain_literal = CFWS? "[" (FWS? dtext)* FWS? "]" CFWS?;
+ obs_domain = atom ("." atom)*;
+ domain = (dot_atom | domain_literal | obs_domain) >domain_s %domain_e;
+
+ # addr_spec:
+
+ # The %(end_addr,N) priority resolves uncertainty when whitespace
+ # after an addr_spec could cause it to be interpreted as a
+ # display name: "bar at example.com ,..."
+
+ addr_spec_in_angle_brackets =
+ (local_part "@" domain) %(end_addr,1) |
+ local_part_no_capture %(end_addr,0);
+
+ addr_spec_no_angle_brackets =
+ (local_part "@" domain) %(end_addr,1) |
+ local_part %(end_addr,0);
+
+ # angle_addr:
+ obs_domain_list = (CFWS | ",")* "@" domain ("," CFWS? ("@" domain)?)*;
+ obs_route = (obs_domain_list ":") >obs_domain_list_s %obs_domain_list_e;
+ obs_angle_addr = CFWS? "<" obs_route? addr_spec_in_angle_brackets ">" CFWS?;
+
+ angle_addr = CFWS? ("<" >angle_addr_s) addr_spec_in_angle_brackets ">" CFWS? |
+ obs_angle_addr;
+
+ # Address
+ display_name = phrase;
+ name_addr = display_name? %(end_addr,2) angle_addr;
+ mailbox = (name_addr | addr_spec_no_angle_brackets) >address_s %address_e;
+ obs_mbox_list = (CFWS? ",")* mailbox ("," (mailbox | CFWS)?)*;
+ mailbox_list = (mailbox (("," | ";") mailbox)*) | obs_mbox_list;
+ obs_group_list = (CFWS? ",")+ CFWS?;
+ group_list = mailbox_list | CFWS | obs_group_list;
+ group = (display_name >group_name_s %group_name_e) ":"
+ (group_list?) ";" CFWS?;
+ address = group | mailbox;
+ #obs_addr_list = (CFWS? ",")* address ("," (address | CFWS)?)*;
+ address_lists = address? %(comment_after_address,0)
+ (FWS* ("," | ";") FWS* address?)*;
+
+ # message_ids
+ obs_id_left = local_part;
+ id_left = dot_atom_text | obs_id_left;
+ # id_right modifications to support multiple '@' in msg_id.
+ msg_id_atext = ALPHA | DIGIT | "!" | "#" | "$" | "%" | "&" | "'" | "*" |
+ "+" | "-" | "/" | "=" | "?" | "^" | "_" | "`" | "{" | "|" |
+ "}" | "~" | "@";
+ msg_id_dot_atom_text = (msg_id_atext+ "."?)+;
+ obs_id_right = domain;
+ no_fold_literal = "[" (dtext)* "]";
+ id_right = msg_id_dot_atom_text | no_fold_literal | obs_id_right;
+ msg_id = (CFWS)?
+ (("<" id_left "@" id_right ">") >msg_id_s %msg_id_e)
+ (CFWS)?;
+ message_ids = msg_id (CFWS? msg_id)*;
+
+ include date_time "date_time.rl";
+ date_time = (day_of_week ",")?
+ (date >date_s %date_e) <: (time >time_s %time_e) CFWS?;
+
+ # Added CFWS? to increase robustness
+ # (qmail likes to include a comment style string...?)
+ received_token = word | angle_addr | addr_spec_no_angle_brackets | domain;
+ received = ((CFWS? received_token*) >received_tokens_s %received_tokens_e)
+ ";" date_time;
+
+ # RFC2045: mime_version, content_type, content_transfer_encoding
+ mime_version = CFWS?
+ (DIGIT+ >major_digits_s %major_digits_e)
+ comment? "." comment?
+ (DIGIT+ >minor_digits_s %minor_digits_e)
+ CFWS?;
+
+ token = 0x21..0x27 | 0x2a..0x2b | 0x2c..0x2e |
+ 0x30..0x39 | 0x41..0x5a | 0x5e..0x7e;
+ value = (quoted_string | (token -- '"' | 0x3d)+) >param_val_s %param_val_e;
+ attribute = (token+) >param_attr_s %param_attr_e;
+ parameter = CFWS? attribute "=" value CFWS?;
+
+ ietf_token = token+;
+ custom_x_token = 'x'i "-" token+;
+ extension_token = ietf_token | custom_x_token;
+ discrete_type = 'text'i | 'image'i | 'audio'i | 'video'i |
+ 'application'i | extension_token;
+ composite_type = 'message'i | 'multipart'i | extension_token;
+ iana_token = token+;
+ main_type = (discrete_type | composite_type) >main_type_s %main_type_e;
+ sub_type = (extension_token | iana_token) >sub_type_s %sub_type_e;
+ content_type = main_type "/" sub_type (((CFWS? ";"+) | CFWS) parameter CFWS?)*;
+
+ encoding = ('7bits' | '8bits' | '7bit' | '8bit' | 'binary' |
+ 'quoted-printable' | 'base64' | ietf_token |
+ custom_x_token) >encoding_s %encoding_e;
+ content_transfer_encoding = CFWS? encoding CFWS? ";"? CFWS?;
+
+ # RFC2183: content_disposition
+ # TODO: recognize filename, size, creation date, etc.
+ disposition_type = 'inline'i | 'attachment'i | extension_token | '';
+ content_disposition = (disposition_type >disp_type_s %disp_type_e)
+ (CFWS? ";" parameter CFWS?)*;
+
+ # Envelope From
+ ctime_date = day_name " "+ month " "+ day " " time_of_day " " year;
+ envelope_from = (addr_spec_no_angle_brackets) >address_s %address_e " "
+ (ctime_date >ctime_date_s %ctime_date_e);
+
+ # content_location
+ location = quoted_string | ((token | 0x3d)+ >token_string_s %token_string_e);
+ content_location = CFWS? location CFWS?;
+}%%
diff --git a/lib/mail/parsers/ragel/date_time.rl b/lib/mail/parsers/ragel/date_time.rl
new file mode 100644
index 0000000..44eb6c1
--- /dev/null
+++ b/lib/mail/parsers/ragel/date_time.rl
@@ -0,0 +1,30 @@
+%%{
+
+ machine date_time;
+
+ # day_of_week
+ day_name = "Mon" | "Tue" | "Wed" | "Thu" | "Fri" | "Sat" | "Sun";
+ obs_day_of_week = CFWS? day_name CFWS?;
+ day_of_week = (FWS? day_name) | obs_day_of_week;
+
+ # date
+ obs_day = CFWS? (DIGIT | (DIGIT DIGIT)) CFWS?;
+ day = (FWS? DIGIT DIGIT? FWS) | obs_day;
+ month = "Jan" | "Feb" | "Mar" | "Apr" | "May" | "Jun" | "Jul" | "Aug" | "Sep" | "Oct" | "Nov" | "Dec";
+ obs_year = CFWS? (DIGIT DIGIT DIGIT*) CFWS?;
+ year = FWS DIGIT DIGIT DIGIT DIGIT FWS | obs_year;
+ date = day month year;
+
+ # time
+ obs_hour = CFWS? (DIGIT DIGIT) CFWS?;
+ hour = DIGIT DIGIT | obs_hour;
+ obs_minute = CFWS? (DIGIT DIGIT) CFWS?;
+ minute = DIGIT DIGIT | obs_minute;
+ obs_second = CFWS? (DIGIT DIGIT) CFWS?;
+ second = DIGIT DIGIT | obs_second;
+ obs_zone = "UT" | "GMT" | "EST" | "EDT" | "CST" | "CDT" | "MST" | "MDT" | "PST" | "PDT" | 0x41..0x49 | 0x4B..0x5A | 0x61..0x69 | 0x6B..0x7A;
+ time_of_day = hour ":" minute (":" second)?;
+ zone = FWS ((("+" | "-") DIGIT DIGIT DIGIT DIGIT) | obs_zone);
+ time = time_of_day zone;
+
+}%%
diff --git a/lib/mail/parsers/ragel/parser_info.rb b/lib/mail/parsers/ragel/parser_info.rb
new file mode 100644
index 0000000..aed32a5
--- /dev/null
+++ b/lib/mail/parsers/ragel/parser_info.rb
@@ -0,0 +1,61 @@
+module Mail
+ module Parsers
+ module Ragel
+ ACTIONS = [
+ :addr_spec,
+ :address_e,
+ :address_s,
+ :angle_addr_s,
+ :comment_e,
+ :comment_s,
+ :ctime_date_e,
+ :ctime_date_s,
+ :date_e,
+ :date_s,
+ :disp_type_e,
+ :disp_type_s,
+ :domain_e,
+ :domain_s,
+ :encoding_e,
+ :encoding_s,
+ :group_name_e,
+ :group_name_s,
+ :local_dot_atom_e,
+ :local_dot_atom_pre_comment_e,
+ :local_dot_atom_s,
+ :local_quoted_string_e,
+ :main_type_e,
+ :main_type_s,
+ :major_digits_e,
+ :major_digits_s,
+ :minor_digits_e,
+ :minor_digits_s,
+ :msg_id_e,
+ :msg_id_s,
+ :obs_domain_list_e,
+ :obs_domain_list_s,
+ :param_attr_e,
+ :param_attr_s,
+ :param_val_e,
+ :param_val_s,
+ :phrase_e,
+ :phrase_s,
+ :qstr_e,
+ :qstr_s,
+ :received_tokens_e,
+ :received_tokens_s,
+ :sub_type_e,
+ :sub_type_s,
+ :time_e,
+ :time_s,
+ :token_string_e,
+ :token_string_s
+ ]
+
+ FIELD_PARSERS = %w[ address_lists phrase_lists
+ date_time received message_ids envelope_from
+ mime_version content_type content_disposition
+ content_transfer_encoding content_location ]
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel/ruby.rb b/lib/mail/parsers/ragel/ruby.rb
new file mode 100644
index 0000000..18c0916
--- /dev/null
+++ b/lib/mail/parsers/ragel/ruby.rb
@@ -0,0 +1,39 @@
+module Mail
+ module Parsers
+ module Ragel
+ module Ruby
+ def self.silence_warnings
+ original_verbose = $VERBOSE
+ $VERBOSE = nil
+ yield
+ $VERBOSE = original_verbose
+ end
+ # Ragel-generated parsers give a lot of warnings
+ # and may cause logs to balloon in size
+ silence_warnings do
+ Mail::Parsers::Ragel::FIELD_PARSERS.each do |field_parser|
+ require "mail/parsers/ragel/ruby/machines/#{field_parser}_machine"
+ end
+ end
+
+ MACHINE_LIST = {
+ :address_lists => AddressListsMachine,
+ :phrase_lists => PhraseListsMachine,
+ :date_time => DateTimeMachine,
+ :received => ReceivedMachine,
+ :message_ids => MessageIdsMachine,
+ :envelope_from => EnvelopeFromMachine,
+ :mime_version => MimeVersionMachine,
+ :content_type => ContentTypeMachine,
+ :content_disposition => ContentDispositionMachine,
+ :content_transfer_encoding => ContentTransferEncodingMachine,
+ :content_location => ContentLocationMachine
+ }
+
+ def self.parse(machine, string)
+ MACHINE_LIST[machine].parse(string)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb b/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb
new file mode 100644
index 0000000..d6f5f87
--- /dev/null
+++ b/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb
@@ -0,0 +1,14864 @@
+
+# line 1 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb.rl"
+
+# line 10 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb.rl"
+
+
+module Mail
+ module Parsers
+ module Ragel
+ module AddressListsMachine
+
+# line 13 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb"
+class << self
+ attr_accessor :_address_lists_trans_keys
+ private :_address_lists_trans_keys, :_address_lists_trans_keys=
+end
+self._address_lists_trans_keys = [
+ 0, 0, 9, 126, 10, 10,
+ 9, 32, 10, 10, 9,
+ 32, 9, 126, 10, 10,
+ 9, 32, 1, 127, 1, 127,
+ 10, 10, 9, 32, -128,
+ -1, 9, 126, 9, 126,
+ 9, 126, 10, 10, 9, 32,
+ 9, 126, 9, 126, 9,
+ 126, 10, 10, 9, 32,
+ 9, 126, 9, 64, 10, 10,
+ 9, 32, 9, 64, 9,
+ 126, 10, 10, 9, 32,
+ 9, 126, 9, 64, 10, 10,
+ 9, 32, 9, 64, 10,
+ 10, 9, 32, 10, 10,
+ 9, 32, 10, 10, 9, 32,
+ 9, 126, 9, 126, 10,
+ 10, 9, 32, 10, 10,
+ 9, 32, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9,
+ 126, 9, 126, 10, 10,
+ 9, 32, 9, 126, 10, 10,
+ 9, 32, 1, 127, 1,
+ 127, 10, 10, 9, 32,
+ 0, 127, 9, 126, 9, 126,
+ 9, 126, 10, 10, 9,
+ 32, 9, 126, 9, 126,
+ 9, 126, 10, 10, 9, 32,
+ 9, 126, 9, 64, 10,
+ 10, 9, 32, 9, 64,
+ 9, 126, 10, 10, 9, 32,
+ 9, 126, 9, 64, 10,
+ 10, 9, 32, 9, 64,
+ 9, 59, 10, 10, 9, 32,
+ 9, 59, 9, 126, 9,
+ 126, 10, 10, 9, 32,
+ 1, 127, 1, 127, 10, 10,
+ 9, 32, 9, 126, 9,
+ 126, 10, 10, 9, 32,
+ 9, 126, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9,
+ 126, 9, 126, 10, 10,
+ 9, 32, 9, 126, 10, 10,
+ 9, 32, 9, 126, 9,
+ 126, 10, 10, 9, 32,
+ 9, 126, 10, 10, 9, 32,
+ 1, 127, 1, 127, 10,
+ 10, 9, 32, -128, -1,
+ 9, 126, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9,
+ 126, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9, 126,
+ 9, 64, 10, 10, 9,
+ 32, 9, 64, 9, 126,
+ 10, 10, 9, 32, 9, 126,
+ 9, 64, 10, 10, 9,
+ 32, 9, 64, 9, 59,
+ 10, 10, 9, 32, 9, 59,
+ 9, 126, 9, 126, 10,
+ 10, 9, 32, 1, 127,
+ 1, 127, 10, 10, 9, 32,
+ 9, 126, 9, 126, 10,
+ 10, 9, 32, 9, 126,
+ 9, 126, 9, 126, 10, 10,
+ 9, 32, 9, 126, 9,
+ 126, 10, 10, 9, 32,
+ 9, 126, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9,
+ 126, 9, 126, 10, 10,
+ 9, 32, 9, 126, 9, 126,
+ 9, 126, 10, 10, 9,
+ 32, 9, 126, 9, 126,
+ 1, 127, 1, 127, 10, 10,
+ 9, 32, 9, 126, 9,
+ 126, 10, 10, 9, 32,
+ 9, 126, 9, 126, 0, 127,
+ 1, 127, 10, 10, 9,
+ 32, 9, 126, 9, 126,
+ 33, 126, 9, 126, 9, 59,
+ 10, 10, 9, 32, 9,
+ 59, 1, 127, 1, 127,
+ 10, 10, 9, 32, 0, 127,
+ 10, 10, 9, 32, 1,
+ 127, 10, 10, 9, 32,
+ -128, -1, 1, 127, 1, 127,
+ 10, 10, 9, 32, 0,
+ 127, 9, 126, 9, 126,
+ 9, 126, 10, 10, 9, 32,
+ 9, 126, 1, 127, 1,
+ 127, 10, 10, 9, 32,
+ -128, -1, 1, 127, 10, 10,
+ 9, 32, 9, 126, 9,
+ 126, 10, 10, 9, 32,
+ 9, 126, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9,
+ 126, 9, 59, 10, 10,
+ 9, 32, 9, 59, 9, 126,
+ 10, 10, 9, 32, 9,
+ 126, 9, 126, 9, 126,
+ 9, 126, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9,
+ 126, 1, 127, 1, 127,
+ 10, 10, 9, 32, 9, 126,
+ 9, 126, 0, 127, 1,
+ 127, 10, 10, 9, 32,
+ -128, -1, 1, 127, 10, 10,
+ 9, 32, 9, 126, 10,
+ 10, 9, 32, 9, 126,
+ 9, 126, 33, 126, 9, 126,
+ 9, 64, 10, 10, 9,
+ 32, 9, 64, 1, 127,
+ 1, 127, 10, 10, 9, 32,
+ -128, -1, 10, 10, 9,
+ 32, 9, 126, 9, 126,
+ 9, 126, 10, 10, 9, 32,
+ 9, 126, 9, 62, 10,
+ 10, 9, 32, 9, 62,
+ 9, 126, 10, 10, 9, 32,
+ 9, 126, 9, 126, 1,
+ 127, 1, 127, 10, 10,
+ 9, 32, 9, 126, 9, 62,
+ 10, 10, 9, 32, 9,
+ 62, 33, 126, 0, 127,
+ 10, 10, 9, 32, 9, 126,
+ 9, 126, 1, 127, 10,
+ 10, 9, 32, -128, -1,
+ 1, 127, 1, 127, 10, 10,
+ 9, 32, 0, 127, 9,
+ 126, 1, 127, 1, 127,
+ 10, 10, 9, 32, 9, 126,
+ 9, 64, 10, 10, 9,
+ 32, 9, 64, 0, 127,
+ 10, 10, 9, 32, 9, 126,
+ 9, 126, 10, 10, 9,
+ 32, 9, 126, 1, 127,
+ 1, 127, 10, 10, 9, 32,
+ 9, 126, -128, -1, 1,
+ 127, 10, 10, 9, 32,
+ 1, 127, 1, 127, 10, 10,
+ 9, 32, 9, 126, 9,
+ 64, 10, 10, 9, 32,
+ 9, 64, 0, 127, 1, 127,
+ 10, 10, 9, 32, 9,
+ 64, 10, 10, 9, 32,
+ 9, 64, 9, 126, 9, 64,
+ 10, 10, 9, 32, 9,
+ 64, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9, 126,
+ 9, 58, 10, 10, 9,
+ 32, 9, 58, 9, 64,
+ 10, 10, 9, 32, 9, 64,
+ 9, 126, 9, 126, 10,
+ 10, 9, 32, 9, 126,
+ 33, 126, 9, 126, 10, 10,
+ 9, 32, 9, 126, 9,
+ 126, 1, 127, 1, 127,
+ 10, 10, 9, 32, 9, 126,
+ 9, 58, 10, 10, 9,
+ 32, 9, 58, 33, 126,
+ -128, -1, 10, 10, 9, 32,
+ 9, 126, 9, 126, 1,
+ 127, 10, 10, 9, 32,
+ 0, 127, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9,
+ 126, 9, 126, 10, 10,
+ 9, 32, 9, 126, 9, 126,
+ 9, 126, 10, 10, 9,
+ 32, 9, 126, 9, 126,
+ 1, 127, 1, 127, 10, 10,
+ 9, 32, 9, 126, 9,
+ 126, 10, 10, 9, 32,
+ 9, 126, 9, 126, -128, -1,
+ 1, 127, 10, 10, 9,
+ 32, 9, 126, 9, 126,
+ 33, 126, 9, 126, 9, 59,
+ 10, 10, 9, 32, 9,
+ 59, 1, 127, 1, 127,
+ 10, 10, 9, 32, -128, -1,
+ 10, 10, 9, 32, 1,
+ 127, 10, 10, 9, 32,
+ -128, -1, 1, 127, 1, 127,
+ 10, 10, 9, 32, 0,
+ 127, 9, 126, 9, 126,
+ 9, 126, 10, 10, 9, 32,
+ 9, 126, 1, 127, 1,
+ 127, 10, 10, 9, 32,
+ -128, -1, 1, 127, 10, 10,
+ 9, 32, 9, 126, 9,
+ 126, 10, 10, 9, 32,
+ 9, 126, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9,
+ 126, 9, 59, 10, 10,
+ 9, 32, 9, 59, 9, 126,
+ 10, 10, 9, 32, 9,
+ 126, 9, 126, 9, 126,
+ 9, 126, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9,
+ 126, 1, 127, 1, 127,
+ 10, 10, 9, 32, 9, 126,
+ 9, 126, 0, 127, 1,
+ 127, 10, 10, 9, 32,
+ 0, 127, 1, 127, 10, 10,
+ 9, 32, 9, 126, 10,
+ 10, 9, 32, 9, 126,
+ 9, 126, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9,
+ 126, 9, 126, 10, 10,
+ 9, 32, 9, 126, 10, 10,
+ 9, 32, 1, 127, 1,
+ 127, 10, 10, 9, 32,
+ -128, -1, 9, 126, 9, 126,
+ 9, 126, 10, 10, 9,
+ 32, 9, 126, 9, 126,
+ 9, 126, 10, 10, 9, 32,
+ 9, 126, 9, 64, 10,
+ 10, 9, 32, 9, 64,
+ 9, 126, 10, 10, 9, 32,
+ 9, 126, 9, 64, 10,
+ 10, 9, 32, 9, 64,
+ 9, 59, 10, 10, 9, 32,
+ 9, 59, 10, 10, 9,
+ 32, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9, 126,
+ 9, 62, 10, 10, 9,
+ 32, 9, 62, 9, 126,
+ 10, 10, 9, 32, 9, 126,
+ 9, 126, 1, 127, 1,
+ 127, 10, 10, 9, 32,
+ 9, 126, 9, 62, 10, 10,
+ 9, 32, 9, 62, 33,
+ 126, -128, -1, 10, 10,
+ 9, 32, 9, 126, 9, 126,
+ 1, 127, 10, 10, 9,
+ 32, -128, -1, 1, 127,
+ 1, 127, 10, 10, 9, 32,
+ -128, -1, 9, 126, 1,
+ 127, 1, 127, 10, 10,
+ 9, 32, 9, 126, 9, 64,
+ 10, 10, 9, 32, 9,
+ 64, 0, 127, 10, 10,
+ 9, 32, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9,
+ 126, 1, 127, 1, 127,
+ 10, 10, 9, 32, 9, 126,
+ 0, 127, 1, 127, 10,
+ 10, 9, 32, 1, 127,
+ 1, 127, 10, 10, 9, 32,
+ 9, 126, 9, 64, 10,
+ 10, 9, 32, 9, 64,
+ -128, -1, 1, 127, 10, 10,
+ 9, 32, 9, 64, 10,
+ 10, 9, 32, 9, 64,
+ 9, 126, 9, 64, 10, 10,
+ 9, 32, 9, 64, 9,
+ 126, 9, 126, 10, 10,
+ 9, 32, 9, 126, 9, 58,
+ 10, 10, 9, 32, 9,
+ 58, 9, 64, 10, 10,
+ 9, 32, 9, 64, 9, 126,
+ 9, 126, 10, 10, 9,
+ 32, 9, 126, 33, 126,
+ 9, 126, 10, 10, 9, 32,
+ 9, 126, 9, 126, 1,
+ 127, 1, 127, 10, 10,
+ 9, 32, 9, 126, 9, 58,
+ 10, 10, 9, 32, 9,
+ 58, 33, 126, 0, 127,
+ 10, 10, 9, 32, 9, 126,
+ 9, 126, 1, 127, 10,
+ 10, 9, 32, 0, 127,
+ 9, 126, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9,
+ 126, 9, 126, 10, 10,
+ 9, 32, 9, 126, 9, 126,
+ 9, 126, 10, 10, 9,
+ 32, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9, 126,
+ 9, 126, 9, 126, 10,
+ 10, 9, 32, 9, 126,
+ 9, 126, 1, 127, 1, 127,
+ 10, 10, 9, 32, 9,
+ 126, 9, 126, 10, 10,
+ 9, 32, 9, 126, 9, 126,
+ -128, -1, 1, 127, 10,
+ 10, 9, 32, 9, 126,
+ 9, 126, 33, 126, 9, 126,
+ 9, 59, 10, 10, 9,
+ 32, 9, 59, 1, 127,
+ 1, 127, 10, 10, 9, 32,
+ 0, 127, 10, 10, 9,
+ 32, 1, 127, 10, 10,
+ 9, 32, -128, -1, 1, 127,
+ 1, 127, 10, 10, 9,
+ 32, -128, -1, 9, 126,
+ 1, 127, 1, 127, 10, 10,
+ 9, 32, 9, 126, 9,
+ 126, 10, 10, 9, 32,
+ 9, 126, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9,
+ 126, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9, 126,
+ 9, 59, 10, 10, 9,
+ 32, 9, 59, 9, 126,
+ 10, 10, 9, 32, 9, 126,
+ 9, 126, 9, 126, 9,
+ 126, -128, -1, 1, 127,
+ 10, 10, 9, 32, 9, 126,
+ 9, 126, 10, 10, 9,
+ 32, 9, 126, 1, 127,
+ 1, 127, 10, 10, 9, 32,
+ 9, 126, -128, -1, 1,
+ 127, 10, 10, 9, 32,
+ 1, 127, 1, 127, 10, 10,
+ 9, 32, 9, 126, 9,
+ 126, 10, 10, 9, 32,
+ 9, 126, -128, -1, 1, 127,
+ 10, 10, 9, 32, 9,
+ 126, 10, 10, 9, 32,
+ 9, 126, 9, 126, 33, 126,
+ 9, 126, 9, 64, 10,
+ 10, 9, 32, 9, 64,
+ 1, 127, 1, 127, 10, 10,
+ 9, 32, -128, -1, 10,
+ 10, 9, 32, 9, 126,
+ 33, 126, 9, 126, 9, 64,
+ 10, 10, 9, 32, 9,
+ 64, 1, 127, 1, 127,
+ 10, 10, 9, 32, 0, 127,
+ 10, 10, 9, 32, 9,
+ 126, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9, 126,
+ 9, 62, 10, 10, 9,
+ 32, 9, 62, 9, 126,
+ 10, 10, 9, 32, 9, 126,
+ 9, 126, 1, 127, 1,
+ 127, 10, 10, 9, 32,
+ 9, 126, 9, 62, 10, 10,
+ 9, 32, 9, 62, 33,
+ 126, -128, -1, 10, 10,
+ 9, 32, 9, 126, 9, 126,
+ 1, 127, 10, 10, 9,
+ 32, -128, -1, 1, 127,
+ 1, 127, 10, 10, 9, 32,
+ -128, -1, 9, 126, 1,
+ 127, 1, 127, 10, 10,
+ 9, 32, 9, 126, 9, 64,
+ 10, 10, 9, 32, 9,
+ 64, -128, -1, 10, 10,
+ 9, 32, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9,
+ 126, 1, 127, 1, 127,
+ 10, 10, 9, 32, 9, 126,
+ -128, -1, 1, 127, 10,
+ 10, 9, 32, 1, 127,
+ 1, 127, 10, 10, 9, 32,
+ 9, 126, 9, 64, 10,
+ 10, 9, 32, 9, 64,
+ 0, 127, 1, 127, 10, 10,
+ 9, 32, 9, 64, 10,
+ 10, 9, 32, 9, 64,
+ 9, 126, 9, 64, 10, 10,
+ 9, 32, 9, 64, 9,
+ 126, 9, 126, 10, 10,
+ 9, 32, 9, 126, 9, 58,
+ 10, 10, 9, 32, 9,
+ 58, 9, 64, 10, 10,
+ 9, 32, 9, 64, 9, 126,
+ 9, 126, 10, 10, 9,
+ 32, 9, 126, 33, 126,
+ 9, 126, 10, 10, 9, 32,
+ 9, 126, 9, 126, 1,
+ 127, 1, 127, 10, 10,
+ 9, 32, 9, 126, 9, 58,
+ 10, 10, 9, 32, 9,
+ 58, 33, 126, -128, -1,
+ 10, 10, 9, 32, 9, 126,
+ 9, 126, 1, 127, 10,
+ 10, 9, 32, 0, 127,
+ 9, 126, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9,
+ 126, 9, 126, 9, 126,
+ 10, 10, 9, 32, 10, 10,
+ 9, 32, 9, 126, 9,
+ 126, 10, 10, 9, 32,
+ 9, 126, 1, 127, 1, 127,
+ 10, 10, 9, 32, 10,
+ 10, 9, 32, 9, 126,
+ -128, -1, 1, 127, 10, 10,
+ 9, 32, 9, 126, 9,
+ 126, 33, 126, 10, 10,
+ 9, 32, 1, 127, 1, 127,
+ 10, 10, 9, 32, -128,
+ -1, 10, 10, 9, 32,
+ 1, 127, 10, 10, 9, 32,
+ 0, 127, 1, 127, 1,
+ 127, 10, 10, 9, 32,
+ 0, 127, 9, 126, 1, 127,
+ 1, 127, 10, 10, 9,
+ 32, 10, 10, 9, 32,
+ 10, 10, 9, 32, 9, 126,
+ 9, 126, 10, 10, 9,
+ 32, 10, 10, 9, 32,
+ 9, 126, 10, 10, 9, 32,
+ 9, 126, 9, 126, 9,
+ 126, -128, -1, 1, 127,
+ 10, 10, 9, 32, 10, 10,
+ 9, 32, 1, 127, 1,
+ 127, 10, 10, 9, 32,
+ -128, -1, 1, 127, 10, 10,
+ 9, 32, 1, 127, 1,
+ 127, 10, 10, 9, 32,
+ 10, 10, 9, 32, -128, -1,
+ 1, 127, 10, 10, 9,
+ 32, 10, 10, 9, 32,
+ 9, 126, 9, 126, 10, 10,
+ 9, 32, 33, 126, 10,
+ 10, 9, 32, 1, 127,
+ 1, 127, 10, 10, 9, 32,
+ -128, -1, 10, 10, 9,
+ 32, 9, 126, 9, 126,
+ 9, 126, 10, 10, 9, 32,
+ 9, 126, 9, 62, 10,
+ 10, 9, 32, 9, 62,
+ 9, 126, 10, 10, 9, 32,
+ 9, 126, 9, 126, 1,
+ 127, 1, 127, 10, 10,
+ 9, 32, 9, 126, 9, 62,
+ 10, 10, 9, 32, 9,
+ 62, 33, 126, 0, 127,
+ 10, 10, 9, 32, 9, 126,
+ 9, 126, 1, 127, 10,
+ 10, 9, 32, -128, -1,
+ 1, 127, 1, 127, 10, 10,
+ 9, 32, -128, -1, 9,
+ 126, 1, 127, 1, 127,
+ 10, 10, 9, 32, 9, 126,
+ 9, 64, 10, 10, 9,
+ 32, 9, 64, -128, -1,
+ 10, 10, 9, 32, 9, 126,
+ 9, 126, 10, 10, 9,
+ 32, 9, 126, 1, 127,
+ 1, 127, 10, 10, 9, 32,
+ 9, 126, 0, 127, 1,
+ 127, 10, 10, 9, 32,
+ 1, 127, 1, 127, 10, 10,
+ 9, 32, 9, 126, 9,
+ 64, 10, 10, 9, 32,
+ 9, 64, 0, 127, 1, 127,
+ 10, 10, 9, 32, 9,
+ 64, 10, 10, 9, 32,
+ 9, 64, 9, 126, 9, 64,
+ 10, 10, 9, 32, 9,
+ 64, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9, 126,
+ 9, 58, 10, 10, 9,
+ 32, 9, 58, 9, 64,
+ 10, 10, 9, 32, 9, 64,
+ 9, 126, 9, 126, 10,
+ 10, 9, 32, 9, 126,
+ 33, 126, 9, 126, 10, 10,
+ 9, 32, 9, 126, 9,
+ 126, 1, 127, 1, 127,
+ 10, 10, 9, 32, 9, 126,
+ 9, 58, 10, 10, 9,
+ 32, 9, 58, 33, 126,
+ 0, 127, 10, 10, 9, 32,
+ 9, 126, 9, 126, 1,
+ 127, 10, 10, 9, 32,
+ 0, 127, 9, 126, 9, 126,
+ 10, 10, 9, 32, 10,
+ 10, 9, 32, 9, 126,
+ 9, 126, 10, 10, 9, 32,
+ 9, 126, 33, 126, 1,
+ 127, 1, 127, 10, 10,
+ 9, 32, 0, 127, 10, 10,
+ 9, 32, 1, 127, 1,
+ 127, 10, 10, 9, 32,
+ -128, -1, 9, 126, 1, 127,
+ 1, 127, 10, 10, 9,
+ 32, 10, 10, 9, 32,
+ 10, 10, 9, 32, 9, 126,
+ 9, 126, 10, 10, 9,
+ 32, 9, 126, 9, 126,
+ -128, -1, 1, 127, 10, 10,
+ 9, 32, 10, 10, 9,
+ 32, 1, 127, 1, 127,
+ 10, 10, 9, 32, -128, -1,
+ 1, 127, 10, 10, 9,
+ 32, 1, 127, 1, 127,
+ 10, 10, 9, 32, 10, 10,
+ 9, 32, -128, -1, 1,
+ 127, 10, 10, 9, 32,
+ 10, 10, 9, 32, 9, 126,
+ 9, 126, 10, 10, 9,
+ 32, 33, 126, 10, 10,
+ 9, 32, 1, 127, 1, 127,
+ 10, 10, 9, 32, -128,
+ -1, 10, 10, 9, 32,
+ 9, 126, 1, 127, 1, 127,
+ 10, 10, 9, 32, -128,
+ -1, 9, 126, 9, 126,
+ 9, 126, 9, 59, 9, 59,
+ 9, 126, 9, 126, 9,
+ 126, 9, 126, 9, 126,
+ 9, 126, 9, 126, 9, 126,
+ 9, 126, 9, 126, 9,
+ 59, 9, 59, 9, 126,
+ 9, 126, 9, 126, 9, 126,
+ 9, 126, 9, 126, 9,
+ 126, 9, 126, 9, 59,
+ 9, 59, 9, 126, 9, 126,
+ 9, 126, 9, 126, 9,
+ 126, 9, 126, 9, 126,
+ 9, 59, 9, 59, 9, 126,
+ 9, 126, 9, 126, 9,
+ 126, 9, 126, 9, 126,
+ 9, 126, 9, 126, 9, 126,
+ 9, 126, 9, 126, 9,
+ 64, 9, 64, 9, 126,
+ 9, 126, 9, 126, 9, 126,
+ 9, 126, 9, 126, 9,
+ 126, 9, 126, 9, 126,
+ 9, 126, 9, 126, 9, 126,
+ 9, 126, 9, 126, 9,
+ 126, 9, 126, 9, 126,
+ 9, 126, 9, 126, 9, 126,
+ 9, 126, 9, 126, 9,
+ 64, 9, 64, 0, 0,
+ 0
+]
+
+class << self
+ attr_accessor :_address_lists_key_spans
+ private :_address_lists_key_spans, :_address_lists_key_spans=
+end
+self._address_lists_key_spans = [
+ 0, 118, 1, 24, 1, 24, 118, 1,
+ 24, 127, 127, 1, 24, 128, 118, 118,
+ 118, 1, 24, 118, 118, 118, 1, 24,
+ 118, 56, 1, 24, 56, 118, 1, 24,
+ 118, 56, 1, 24, 56, 1, 24, 1,
+ 24, 1, 24, 118, 118, 1, 24, 1,
+ 24, 118, 118, 1, 24, 118, 118, 1,
+ 24, 118, 1, 24, 127, 127, 1, 24,
+ 128, 118, 118, 118, 1, 24, 118, 118,
+ 118, 1, 24, 118, 56, 1, 24, 56,
+ 118, 1, 24, 118, 56, 1, 24, 56,
+ 51, 1, 24, 51, 118, 118, 1, 24,
+ 127, 127, 1, 24, 118, 118, 1, 24,
+ 118, 118, 118, 1, 24, 118, 118, 1,
+ 24, 118, 1, 24, 118, 118, 1, 24,
+ 118, 1, 24, 127, 127, 1, 24, 128,
+ 118, 118, 118, 1, 24, 118, 118, 118,
+ 1, 24, 118, 56, 1, 24, 56, 118,
+ 1, 24, 118, 56, 1, 24, 56, 51,
+ 1, 24, 51, 118, 118, 1, 24, 127,
+ 127, 1, 24, 118, 118, 1, 24, 118,
+ 118, 118, 1, 24, 118, 118, 1, 24,
+ 118, 118, 118, 1, 24, 118, 118, 1,
+ 24, 118, 118, 118, 1, 24, 118, 118,
+ 127, 127, 1, 24, 118, 118, 1, 24,
+ 118, 118, 128, 127, 1, 24, 118, 118,
+ 94, 118, 51, 1, 24, 51, 127, 127,
+ 1, 24, 128, 1, 24, 127, 1, 24,
+ 128, 127, 127, 1, 24, 128, 118, 118,
+ 118, 1, 24, 118, 127, 127, 1, 24,
+ 128, 127, 1, 24, 118, 118, 1, 24,
+ 118, 118, 118, 1, 24, 118, 51, 1,
+ 24, 51, 118, 1, 24, 118, 118, 118,
+ 118, 118, 118, 1, 24, 118, 127, 127,
+ 1, 24, 118, 118, 128, 127, 1, 24,
+ 128, 127, 1, 24, 118, 1, 24, 118,
+ 118, 94, 118, 56, 1, 24, 56, 127,
+ 127, 1, 24, 128, 1, 24, 118, 118,
+ 118, 1, 24, 118, 54, 1, 24, 54,
+ 118, 1, 24, 118, 118, 127, 127, 1,
+ 24, 118, 54, 1, 24, 54, 94, 128,
+ 1, 24, 118, 118, 127, 1, 24, 128,
+ 127, 127, 1, 24, 128, 118, 127, 127,
+ 1, 24, 118, 56, 1, 24, 56, 128,
+ 1, 24, 118, 118, 1, 24, 118, 127,
+ 127, 1, 24, 118, 128, 127, 1, 24,
+ 127, 127, 1, 24, 118, 56, 1, 24,
+ 56, 128, 127, 1, 24, 56, 1, 24,
+ 56, 118, 56, 1, 24, 56, 118, 118,
+ 1, 24, 118, 50, 1, 24, 50, 56,
+ 1, 24, 56, 118, 118, 1, 24, 118,
+ 94, 118, 1, 24, 118, 118, 127, 127,
+ 1, 24, 118, 50, 1, 24, 50, 94,
+ 128, 1, 24, 118, 118, 127, 1, 24,
+ 128, 118, 118, 1, 24, 118, 118, 1,
+ 24, 118, 118, 118, 1, 24, 118, 118,
+ 127, 127, 1, 24, 118, 118, 1, 24,
+ 118, 118, 128, 127, 1, 24, 118, 118,
+ 94, 118, 51, 1, 24, 51, 127, 127,
+ 1, 24, 128, 1, 24, 127, 1, 24,
+ 128, 127, 127, 1, 24, 128, 118, 118,
+ 118, 1, 24, 118, 127, 127, 1, 24,
+ 128, 127, 1, 24, 118, 118, 1, 24,
+ 118, 118, 118, 1, 24, 118, 51, 1,
+ 24, 51, 118, 1, 24, 118, 118, 118,
+ 118, 118, 118, 1, 24, 118, 127, 127,
+ 1, 24, 118, 118, 128, 127, 1, 24,
+ 128, 127, 1, 24, 118, 1, 24, 118,
+ 118, 118, 118, 1, 24, 118, 118, 1,
+ 24, 118, 1, 24, 127, 127, 1, 24,
+ 128, 118, 118, 118, 1, 24, 118, 118,
+ 118, 1, 24, 118, 56, 1, 24, 56,
+ 118, 1, 24, 118, 56, 1, 24, 56,
+ 51, 1, 24, 51, 1, 24, 118, 118,
+ 1, 24, 118, 54, 1, 24, 54, 118,
+ 1, 24, 118, 118, 127, 127, 1, 24,
+ 118, 54, 1, 24, 54, 94, 128, 1,
+ 24, 118, 118, 127, 1, 24, 128, 127,
+ 127, 1, 24, 128, 118, 127, 127, 1,
+ 24, 118, 56, 1, 24, 56, 128, 1,
+ 24, 118, 118, 1, 24, 118, 127, 127,
+ 1, 24, 118, 128, 127, 1, 24, 127,
+ 127, 1, 24, 118, 56, 1, 24, 56,
+ 128, 127, 1, 24, 56, 1, 24, 56,
+ 118, 56, 1, 24, 56, 118, 118, 1,
+ 24, 118, 50, 1, 24, 50, 56, 1,
+ 24, 56, 118, 118, 1, 24, 118, 94,
+ 118, 1, 24, 118, 118, 127, 127, 1,
+ 24, 118, 50, 1, 24, 50, 94, 128,
+ 1, 24, 118, 118, 127, 1, 24, 128,
+ 118, 118, 118, 1, 24, 118, 118, 1,
+ 24, 118, 118, 118, 1, 24, 118, 118,
+ 1, 24, 118, 118, 118, 1, 24, 118,
+ 118, 127, 127, 1, 24, 118, 118, 1,
+ 24, 118, 118, 128, 127, 1, 24, 118,
+ 118, 94, 118, 51, 1, 24, 51, 127,
+ 127, 1, 24, 128, 1, 24, 127, 1,
+ 24, 128, 127, 127, 1, 24, 128, 118,
+ 127, 127, 1, 24, 118, 118, 1, 24,
+ 118, 118, 118, 1, 24, 118, 118, 118,
+ 1, 24, 118, 51, 1, 24, 51, 118,
+ 1, 24, 118, 118, 118, 118, 128, 127,
+ 1, 24, 118, 118, 1, 24, 118, 127,
+ 127, 1, 24, 118, 128, 127, 1, 24,
+ 127, 127, 1, 24, 118, 118, 1, 24,
+ 118, 128, 127, 1, 24, 118, 1, 24,
+ 118, 118, 94, 118, 56, 1, 24, 56,
+ 127, 127, 1, 24, 128, 1, 24, 118,
+ 94, 118, 56, 1, 24, 56, 127, 127,
+ 1, 24, 128, 1, 24, 118, 118, 118,
+ 1, 24, 118, 54, 1, 24, 54, 118,
+ 1, 24, 118, 118, 127, 127, 1, 24,
+ 118, 54, 1, 24, 54, 94, 128, 1,
+ 24, 118, 118, 127, 1, 24, 128, 127,
+ 127, 1, 24, 128, 118, 127, 127, 1,
+ 24, 118, 56, 1, 24, 56, 128, 1,
+ 24, 118, 118, 1, 24, 118, 127, 127,
+ 1, 24, 118, 128, 127, 1, 24, 127,
+ 127, 1, 24, 118, 56, 1, 24, 56,
+ 128, 127, 1, 24, 56, 1, 24, 56,
+ 118, 56, 1, 24, 56, 118, 118, 1,
+ 24, 118, 50, 1, 24, 50, 56, 1,
+ 24, 56, 118, 118, 1, 24, 118, 94,
+ 118, 1, 24, 118, 118, 127, 127, 1,
+ 24, 118, 50, 1, 24, 50, 94, 128,
+ 1, 24, 118, 118, 127, 1, 24, 128,
+ 118, 118, 118, 1, 24, 118, 118, 118,
+ 1, 24, 1, 24, 118, 118, 1, 24,
+ 118, 127, 127, 1, 24, 1, 24, 118,
+ 128, 127, 1, 24, 118, 118, 94, 1,
+ 24, 127, 127, 1, 24, 128, 1, 24,
+ 127, 1, 24, 128, 127, 127, 1, 24,
+ 128, 118, 127, 127, 1, 24, 1, 24,
+ 1, 24, 118, 118, 1, 24, 1, 24,
+ 118, 1, 24, 118, 118, 118, 128, 127,
+ 1, 24, 1, 24, 127, 127, 1, 24,
+ 128, 127, 1, 24, 127, 127, 1, 24,
+ 1, 24, 128, 127, 1, 24, 1, 24,
+ 118, 118, 1, 24, 94, 1, 24, 127,
+ 127, 1, 24, 128, 1, 24, 118, 118,
+ 118, 1, 24, 118, 54, 1, 24, 54,
+ 118, 1, 24, 118, 118, 127, 127, 1,
+ 24, 118, 54, 1, 24, 54, 94, 128,
+ 1, 24, 118, 118, 127, 1, 24, 128,
+ 127, 127, 1, 24, 128, 118, 127, 127,
+ 1, 24, 118, 56, 1, 24, 56, 128,
+ 1, 24, 118, 118, 1, 24, 118, 127,
+ 127, 1, 24, 118, 128, 127, 1, 24,
+ 127, 127, 1, 24, 118, 56, 1, 24,
+ 56, 128, 127, 1, 24, 56, 1, 24,
+ 56, 118, 56, 1, 24, 56, 118, 118,
+ 1, 24, 118, 50, 1, 24, 50, 56,
+ 1, 24, 56, 118, 118, 1, 24, 118,
+ 94, 118, 1, 24, 118, 118, 127, 127,
+ 1, 24, 118, 50, 1, 24, 50, 94,
+ 128, 1, 24, 118, 118, 127, 1, 24,
+ 128, 118, 118, 1, 24, 1, 24, 118,
+ 118, 1, 24, 118, 94, 127, 127, 1,
+ 24, 128, 1, 24, 127, 127, 1, 24,
+ 128, 118, 127, 127, 1, 24, 1, 24,
+ 1, 24, 118, 118, 1, 24, 118, 118,
+ 128, 127, 1, 24, 1, 24, 127, 127,
+ 1, 24, 128, 127, 1, 24, 127, 127,
+ 1, 24, 1, 24, 128, 127, 1, 24,
+ 1, 24, 118, 118, 1, 24, 94, 1,
+ 24, 127, 127, 1, 24, 128, 1, 24,
+ 118, 127, 127, 1, 24, 128, 118, 118,
+ 118, 51, 51, 118, 118, 118, 118, 118,
+ 118, 118, 118, 118, 118, 51, 51, 118,
+ 118, 118, 118, 118, 118, 118, 118, 51,
+ 51, 118, 118, 118, 118, 118, 118, 118,
+ 51, 51, 118, 118, 118, 118, 118, 118,
+ 118, 118, 118, 118, 118, 56, 56, 118,
+ 118, 118, 118, 118, 118, 118, 118, 118,
+ 118, 118, 118, 118, 118, 118, 118, 118,
+ 118, 118, 118, 118, 118, 56, 56, 0
+]
+
+class << self
+ attr_accessor :_address_lists_index_offsets
+ private :_address_lists_index_offsets, :_address_lists_index_offsets=
+end
+self._address_lists_index_offsets = [
+ 0, 0, 119, 121, 146, 148, 173, 292,
+ 294, 319, 447, 575, 577, 602, 731, 850,
+ 969, 1088, 1090, 1115, 1234, 1353, 1472, 1474,
+ 1499, 1618, 1675, 1677, 1702, 1759, 1878, 1880,
+ 1905, 2024, 2081, 2083, 2108, 2165, 2167, 2192,
+ 2194, 2219, 2221, 2246, 2365, 2484, 2486, 2511,
+ 2513, 2538, 2657, 2776, 2778, 2803, 2922, 3041,
+ 3043, 3068, 3187, 3189, 3214, 3342, 3470, 3472,
+ 3497, 3626, 3745, 3864, 3983, 3985, 4010, 4129,
+ 4248, 4367, 4369, 4394, 4513, 4570, 4572, 4597,
+ 4654, 4773, 4775, 4800, 4919, 4976, 4978, 5003,
+ 5060, 5112, 5114, 5139, 5191, 5310, 5429, 5431,
+ 5456, 5584, 5712, 5714, 5739, 5858, 5977, 5979,
+ 6004, 6123, 6242, 6361, 6363, 6388, 6507, 6626,
+ 6628, 6653, 6772, 6774, 6799, 6918, 7037, 7039,
+ 7064, 7183, 7185, 7210, 7338, 7466, 7468, 7493,
+ 7622, 7741, 7860, 7979, 7981, 8006, 8125, 8244,
+ 8363, 8365, 8390, 8509, 8566, 8568, 8593, 8650,
+ 8769, 8771, 8796, 8915, 8972, 8974, 8999, 9056,
+ 9108, 9110, 9135, 9187, 9306, 9425, 9427, 9452,
+ 9580, 9708, 9710, 9735, 9854, 9973, 9975, 10000,
+ 10119, 10238, 10357, 10359, 10384, 10503, 10622, 10624,
+ 10649, 10768, 10887, 11006, 11008, 11033, 11152, 11271,
+ 11273, 11298, 11417, 11536, 11655, 11657, 11682, 11801,
+ 11920, 12048, 12176, 12178, 12203, 12322, 12441, 12443,
+ 12468, 12587, 12706, 12835, 12963, 12965, 12990, 13109,
+ 13228, 13323, 13442, 13494, 13496, 13521, 13573, 13701,
+ 13829, 13831, 13856, 13985, 13987, 14012, 14140, 14142,
+ 14167, 14296, 14424, 14552, 14554, 14579, 14708, 14827,
+ 14946, 15065, 15067, 15092, 15211, 15339, 15467, 15469,
+ 15494, 15623, 15751, 15753, 15778, 15897, 16016, 16018,
+ 16043, 16162, 16281, 16400, 16402, 16427, 16546, 16598,
+ 16600, 16625, 16677, 16796, 16798, 16823, 16942, 17061,
+ 17180, 17299, 17418, 17537, 17539, 17564, 17683, 17811,
+ 17939, 17941, 17966, 18085, 18204, 18333, 18461, 18463,
+ 18488, 18617, 18745, 18747, 18772, 18891, 18893, 18918,
+ 19037, 19156, 19251, 19370, 19427, 19429, 19454, 19511,
+ 19639, 19767, 19769, 19794, 19923, 19925, 19950, 20069,
+ 20188, 20307, 20309, 20334, 20453, 20508, 20510, 20535,
+ 20590, 20709, 20711, 20736, 20855, 20974, 21102, 21230,
+ 21232, 21257, 21376, 21431, 21433, 21458, 21513, 21608,
+ 21737, 21739, 21764, 21883, 22002, 22130, 22132, 22157,
+ 22286, 22414, 22542, 22544, 22569, 22698, 22817, 22945,
+ 23073, 23075, 23100, 23219, 23276, 23278, 23303, 23360,
+ 23489, 23491, 23516, 23635, 23754, 23756, 23781, 23900,
+ 24028, 24156, 24158, 24183, 24302, 24431, 24559, 24561,
+ 24586, 24714, 24842, 24844, 24869, 24988, 25045, 25047,
+ 25072, 25129, 25258, 25386, 25388, 25413, 25470, 25472,
+ 25497, 25554, 25673, 25730, 25732, 25757, 25814, 25933,
+ 26052, 26054, 26079, 26198, 26249, 26251, 26276, 26327,
+ 26384, 26386, 26411, 26468, 26587, 26706, 26708, 26733,
+ 26852, 26947, 27066, 27068, 27093, 27212, 27331, 27459,
+ 27587, 27589, 27614, 27733, 27784, 27786, 27811, 27862,
+ 27957, 28086, 28088, 28113, 28232, 28351, 28479, 28481,
+ 28506, 28635, 28754, 28873, 28875, 28900, 29019, 29138,
+ 29140, 29165, 29284, 29403, 29522, 29524, 29549, 29668,
+ 29787, 29915, 30043, 30045, 30070, 30189, 30308, 30310,
+ 30335, 30454, 30573, 30702, 30830, 30832, 30857, 30976,
+ 31095, 31190, 31309, 31361, 31363, 31388, 31440, 31568,
+ 31696, 31698, 31723, 31852, 31854, 31879, 32007, 32009,
+ 32034, 32163, 32291, 32419, 32421, 32446, 32575, 32694,
+ 32813, 32932, 32934, 32959, 33078, 33206, 33334, 33336,
+ 33361, 33490, 33618, 33620, 33645, 33764, 33883, 33885,
+ 33910, 34029, 34148, 34267, 34269, 34294, 34413, 34465,
+ 34467, 34492, 34544, 34663, 34665, 34690, 34809, 34928,
+ 35047, 35166, 35285, 35404, 35406, 35431, 35550, 35678,
+ 35806, 35808, 35833, 35952, 36071, 36200, 36328, 36330,
+ 36355, 36484, 36612, 36614, 36639, 36758, 36760, 36785,
+ 36904, 37023, 37142, 37261, 37263, 37288, 37407, 37526,
+ 37528, 37553, 37672, 37674, 37699, 37827, 37955, 37957,
+ 37982, 38111, 38230, 38349, 38468, 38470, 38495, 38614,
+ 38733, 38852, 38854, 38879, 38998, 39055, 39057, 39082,
+ 39139, 39258, 39260, 39285, 39404, 39461, 39463, 39488,
+ 39545, 39597, 39599, 39624, 39676, 39678, 39703, 39822,
+ 39941, 39943, 39968, 40087, 40142, 40144, 40169, 40224,
+ 40343, 40345, 40370, 40489, 40608, 40736, 40864, 40866,
+ 40891, 41010, 41065, 41067, 41092, 41147, 41242, 41371,
+ 41373, 41398, 41517, 41636, 41764, 41766, 41791, 41920,
+ 42048, 42176, 42178, 42203, 42332, 42451, 42579, 42707,
+ 42709, 42734, 42853, 42910, 42912, 42937, 42994, 43123,
+ 43125, 43150, 43269, 43388, 43390, 43415, 43534, 43662,
+ 43790, 43792, 43817, 43936, 44065, 44193, 44195, 44220,
+ 44348, 44476, 44478, 44503, 44622, 44679, 44681, 44706,
+ 44763, 44892, 45020, 45022, 45047, 45104, 45106, 45131,
+ 45188, 45307, 45364, 45366, 45391, 45448, 45567, 45686,
+ 45688, 45713, 45832, 45883, 45885, 45910, 45961, 46018,
+ 46020, 46045, 46102, 46221, 46340, 46342, 46367, 46486,
+ 46581, 46700, 46702, 46727, 46846, 46965, 47093, 47221,
+ 47223, 47248, 47367, 47418, 47420, 47445, 47496, 47591,
+ 47720, 47722, 47747, 47866, 47985, 48113, 48115, 48140,
+ 48269, 48388, 48507, 48626, 48628, 48653, 48772, 48891,
+ 48893, 48918, 49037, 49156, 49275, 49277, 49302, 49421,
+ 49540, 49542, 49567, 49686, 49805, 49924, 49926, 49951,
+ 50070, 50189, 50317, 50445, 50447, 50472, 50591, 50710,
+ 50712, 50737, 50856, 50975, 51104, 51232, 51234, 51259,
+ 51378, 51497, 51592, 51711, 51763, 51765, 51790, 51842,
+ 51970, 52098, 52100, 52125, 52254, 52256, 52281, 52409,
+ 52411, 52436, 52565, 52693, 52821, 52823, 52848, 52977,
+ 53096, 53224, 53352, 53354, 53379, 53498, 53617, 53619,
+ 53644, 53763, 53882, 54001, 54003, 54028, 54147, 54266,
+ 54385, 54387, 54412, 54531, 54583, 54585, 54610, 54662,
+ 54781, 54783, 54808, 54927, 55046, 55165, 55284, 55413,
+ 55541, 55543, 55568, 55687, 55806, 55808, 55833, 55952,
+ 56080, 56208, 56210, 56235, 56354, 56483, 56611, 56613,
+ 56638, 56766, 56894, 56896, 56921, 57040, 57159, 57161,
+ 57186, 57305, 57434, 57562, 57564, 57589, 57708, 57710,
+ 57735, 57854, 57973, 58068, 58187, 58244, 58246, 58271,
+ 58328, 58456, 58584, 58586, 58611, 58740, 58742, 58767,
+ 58886, 58981, 59100, 59157, 59159, 59184, 59241, 59369,
+ 59497, 59499, 59524, 59653, 59655, 59680, 59799, 59918,
+ 60037, 60039, 60064, 60183, 60238, 60240, 60265, 60320,
+ 60439, 60441, 60466, 60585, 60704, 60832, 60960, 60962,
+ 60987, 61106, 61161, 61163, 61188, 61243, 61338, 61467,
+ 61469, 61494, 61613, 61732, 61860, 61862, 61887, 62016,
+ 62144, 62272, 62274, 62299, 62428, 62547, 62675, 62803,
+ 62805, 62830, 62949, 63006, 63008, 63033, 63090, 63219,
+ 63221, 63246, 63365, 63484, 63486, 63511, 63630, 63758,
+ 63886, 63888, 63913, 64032, 64161, 64289, 64291, 64316,
+ 64444, 64572, 64574, 64599, 64718, 64775, 64777, 64802,
+ 64859, 64988, 65116, 65118, 65143, 65200, 65202, 65227,
+ 65284, 65403, 65460, 65462, 65487, 65544, 65663, 65782,
+ 65784, 65809, 65928, 65979, 65981, 66006, 66057, 66114,
+ 66116, 66141, 66198, 66317, 66436, 66438, 66463, 66582,
+ 66677, 66796, 66798, 66823, 66942, 67061, 67189, 67317,
+ 67319, 67344, 67463, 67514, 67516, 67541, 67592, 67687,
+ 67816, 67818, 67843, 67962, 68081, 68209, 68211, 68236,
+ 68365, 68484, 68603, 68722, 68724, 68749, 68868, 68987,
+ 69106, 69108, 69133, 69135, 69160, 69279, 69398, 69400,
+ 69425, 69544, 69672, 69800, 69802, 69827, 69829, 69854,
+ 69973, 70102, 70230, 70232, 70257, 70376, 70495, 70590,
+ 70592, 70617, 70745, 70873, 70875, 70900, 71029, 71031,
+ 71056, 71184, 71186, 71211, 71340, 71468, 71596, 71598,
+ 71623, 71752, 71871, 71999, 72127, 72129, 72154, 72156,
+ 72181, 72183, 72208, 72327, 72446, 72448, 72473, 72475,
+ 72500, 72619, 72621, 72646, 72765, 72884, 73003, 73132,
+ 73260, 73262, 73287, 73289, 73314, 73442, 73570, 73572,
+ 73597, 73726, 73854, 73856, 73881, 74009, 74137, 74139,
+ 74164, 74166, 74191, 74320, 74448, 74450, 74475, 74477,
+ 74502, 74621, 74740, 74742, 74767, 74862, 74864, 74889,
+ 75017, 75145, 75147, 75172, 75301, 75303, 75328, 75447,
+ 75566, 75685, 75687, 75712, 75831, 75886, 75888, 75913,
+ 75968, 76087, 76089, 76114, 76233, 76352, 76480, 76608,
+ 76610, 76635, 76754, 76809, 76811, 76836, 76891, 76986,
+ 77115, 77117, 77142, 77261, 77380, 77508, 77510, 77535,
+ 77664, 77792, 77920, 77922, 77947, 78076, 78195, 78323,
+ 78451, 78453, 78478, 78597, 78654, 78656, 78681, 78738,
+ 78867, 78869, 78894, 79013, 79132, 79134, 79159, 79278,
+ 79406, 79534, 79536, 79561, 79680, 79809, 79937, 79939,
+ 79964, 80092, 80220, 80222, 80247, 80366, 80423, 80425,
+ 80450, 80507, 80636, 80764, 80766, 80791, 80848, 80850,
+ 80875, 80932, 81051, 81108, 81110, 81135, 81192, 81311,
+ 81430, 81432, 81457, 81576, 81627, 81629, 81654, 81705,
+ 81762, 81764, 81789, 81846, 81965, 82084, 82086, 82111,
+ 82230, 82325, 82444, 82446, 82471, 82590, 82709, 82837,
+ 82965, 82967, 82992, 83111, 83162, 83164, 83189, 83240,
+ 83335, 83464, 83466, 83491, 83610, 83729, 83857, 83859,
+ 83884, 84013, 84132, 84251, 84253, 84278, 84280, 84305,
+ 84424, 84543, 84545, 84570, 84689, 84784, 84912, 85040,
+ 85042, 85067, 85196, 85198, 85223, 85351, 85479, 85481,
+ 85506, 85635, 85754, 85882, 86010, 86012, 86037, 86039,
+ 86064, 86066, 86091, 86210, 86329, 86331, 86356, 86475,
+ 86594, 86723, 86851, 86853, 86878, 86880, 86905, 87033,
+ 87161, 87163, 87188, 87317, 87445, 87447, 87472, 87600,
+ 87728, 87730, 87755, 87757, 87782, 87911, 88039, 88041,
+ 88066, 88068, 88093, 88212, 88331, 88333, 88358, 88453,
+ 88455, 88480, 88608, 88736, 88738, 88763, 88892, 88894,
+ 88919, 89038, 89166, 89294, 89296, 89321, 89450, 89569,
+ 89688, 89807, 89859, 89911, 90030, 90149, 90268, 90387,
+ 90506, 90625, 90744, 90863, 90982, 91101, 91153, 91205,
+ 91324, 91443, 91562, 91681, 91800, 91919, 92038, 92157,
+ 92209, 92261, 92380, 92499, 92618, 92737, 92856, 92975,
+ 93094, 93146, 93198, 93317, 93436, 93555, 93674, 93793,
+ 93912, 94031, 94150, 94269, 94388, 94507, 94564, 94621,
+ 94740, 94859, 94978, 95097, 95216, 95335, 95454, 95573,
+ 95692, 95811, 95930, 96049, 96168, 96287, 96406, 96525,
+ 96644, 96763, 96882, 97001, 97120, 97239, 97296, 97353
+]
+
+class << self
+ attr_accessor :_address_lists_indicies
+ private :_address_lists_indicies, :_address_lists_indicies=
+end
+self._address_lists_indicies = [
+ 0, 1, 1, 1, 2, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 0,
+ 3, 4, 3, 3, 3, 3, 3, 5,
+ 1, 3, 3, 6, 3, 7, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 1, 6, 8, 3, 1, 3, 1,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 1, 1, 1, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 1, 9,
+ 1, 0, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 1, 10, 1, 11, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 11, 1, 12, 1, 1,
+ 1, 13, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 12, 14, 15, 14,
+ 14, 14, 14, 14, 16, 1, 14, 14,
+ 1, 14, 17, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 18, 1,
+ 19, 14, 1, 14, 17, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 1,
+ 1, 1, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 1, 20, 1, 14, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 14, 1, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 1, 21, 21, 22, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 23, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 24, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 1, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 1, 25, 25, 26, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 27, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 28, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 25, 1, 29,
+ 1, 25, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 25, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 25, 30, 1, 1, 1, 31,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 30, 32, 33, 32, 32, 32,
+ 32, 32, 34, 1, 32, 32, 1, 32,
+ 35, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 36, 1, 37, 32,
+ 1, 32, 35, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 1, 1, 1,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 1, 38, 1, 1, 1, 39, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 38, 14, 15, 14, 14, 14, 14,
+ 14, 40, 1, 14, 14, 1, 14, 17,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 18, 1, 19, 14, 1,
+ 14, 17, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 1, 1, 1, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 1, 41, 1, 1, 1, 42, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 41, 14, 15, 14, 14, 14, 14, 14,
+ 43, 1, 14, 14, 1, 14, 1, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 1, 1, 8, 14, 1, 14,
+ 1, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 1, 1, 1, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 1,
+ 44, 1, 41, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 41, 1, 45, 1, 1, 1, 46,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 45, 32, 33, 32, 32, 32,
+ 32, 32, 47, 1, 32, 32, 1, 32,
+ 1, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 1, 1, 48, 32,
+ 1, 32, 1, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 1, 1, 1,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 1, 49, 1, 1, 1, 50, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 49, 51, 52, 51, 51, 51, 51,
+ 51, 53, 1, 51, 51, 54, 51, 55,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 1, 1, 1, 51, 1,
+ 51, 56, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 1, 1, 1, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 1, 57, 1, 1, 1, 58, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 57, 51, 52, 51, 51, 51, 51, 51,
+ 59, 1, 51, 51, 60, 51, 55, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 1, 1, 1, 51, 1, 51,
+ 61, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 1, 1, 1, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 1,
+ 62, 1, 57, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 57, 1, 63, 1, 1, 1, 64,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 63, 65, 66, 65, 65, 65,
+ 65, 65, 67, 1, 65, 65, 1, 65,
+ 68, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 1, 1, 1, 65,
+ 69, 65, 70, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 1, 1, 1,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 1, 71, 1, 1, 1, 72, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 71, 1, 1, 1, 1, 1, 1,
+ 1, 73, 1, 1, 1, 1, 1, 74,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 75,
+ 1, 76, 1, 77, 1, 71, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 71, 1, 78, 1,
+ 1, 1, 79, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 78, 1, 1,
+ 1, 1, 1, 1, 1, 80, 1, 1,
+ 1, 1, 1, 81, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 82, 1, 83, 1, 74,
+ 1, 1, 1, 84, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 74, 85,
+ 86, 85, 85, 85, 85, 85, 87, 1,
+ 85, 85, 1, 85, 1, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85,
+ 1, 1, 1, 85, 1, 85, 1, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 1, 1, 1, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 1, 88, 1,
+ 74, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 74,
+ 1, 89, 1, 1, 1, 90, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 89, 85, 1, 85, 85, 85, 85, 85,
+ 91, 1, 85, 85, 1, 85, 74, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 1, 1, 1, 85, 75, 85,
+ 92, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 1, 1, 1, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 1,
+ 89, 1, 1, 1, 90, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 89,
+ 1, 1, 1, 1, 1, 1, 1, 91,
+ 1, 1, 1, 1, 1, 74, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 75, 1, 92,
+ 1, 93, 1, 89, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 89, 1, 94, 1, 1, 1,
+ 95, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 94, 1, 1, 1, 1,
+ 1, 1, 1, 96, 1, 1, 1, 1,
+ 1, 81, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 82, 1, 97, 1, 98, 1, 75,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 75, 1,
+ 99, 1, 6, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 6, 1, 100, 1, 101, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 101, 1, 102, 1,
+ 1, 1, 103, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 102, 104, 105,
+ 104, 104, 104, 104, 104, 106, 1, 104,
+ 104, 1, 104, 17, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 18,
+ 1, 19, 104, 1, 104, 17, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ 1, 1, 1, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 1, 107, 1, 1,
+ 1, 108, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 107, 104, 105, 104,
+ 104, 104, 104, 104, 109, 1, 104, 104,
+ 1, 104, 1, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 1, 1,
+ 8, 104, 1, 104, 1, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 1,
+ 1, 1, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 1, 110, 1, 107, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 107, 1, 111,
+ 1, 112, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 112, 1, 113, 1, 1, 1, 114, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 113, 115, 116, 115, 115, 115, 115,
+ 115, 117, 1, 115, 115, 118, 115, 119,
+ 115, 115, 115, 115, 115, 115, 115, 115,
+ 115, 115, 115, 1, 120, 121, 115, 1,
+ 115, 122, 115, 115, 115, 115, 115, 115,
+ 115, 115, 115, 115, 115, 115, 115, 115,
+ 115, 115, 115, 115, 115, 115, 115, 115,
+ 115, 115, 115, 115, 1, 1, 1, 115,
+ 115, 115, 115, 115, 115, 115, 115, 115,
+ 115, 115, 115, 115, 115, 115, 115, 115,
+ 115, 115, 115, 115, 115, 115, 115, 115,
+ 115, 115, 115, 115, 115, 115, 115, 115,
+ 1, 123, 1, 1, 1, 124, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 123, 125, 126, 125, 125, 125, 125, 125,
+ 127, 1, 125, 125, 118, 125, 128, 125,
+ 125, 125, 125, 125, 125, 125, 125, 125,
+ 125, 125, 1, 120, 129, 125, 1, 125,
+ 1, 125, 125, 125, 125, 125, 125, 125,
+ 125, 125, 125, 125, 125, 125, 125, 125,
+ 125, 125, 125, 125, 125, 125, 125, 125,
+ 125, 125, 125, 1, 1, 1, 125, 125,
+ 125, 125, 125, 125, 125, 125, 125, 125,
+ 125, 125, 125, 125, 125, 125, 125, 125,
+ 125, 125, 125, 125, 125, 125, 125, 125,
+ 125, 125, 125, 125, 125, 125, 125, 1,
+ 130, 1, 123, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 123, 1, 131, 1, 1, 1, 132,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 131, 133, 134, 133, 133, 133,
+ 133, 133, 135, 1, 133, 133, 136, 133,
+ 137, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 1, 138, 139, 133,
+ 1, 133, 140, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 1, 1, 1,
+ 133, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133,
+ 133, 1, 141, 1, 1, 1, 142, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 141, 143, 144, 143, 143, 143, 143,
+ 143, 145, 1, 143, 143, 146, 143, 147,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 1, 148, 139, 143, 1,
+ 143, 149, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 1, 1, 1, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 1, 150, 1, 151, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 151, 1, 152, 1, 1, 1,
+ 153, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 152, 143, 144, 143, 143,
+ 143, 143, 143, 154, 1, 143, 143, 1,
+ 143, 155, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 1, 1, 139,
+ 143, 1, 143, 155, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 1, 1,
+ 1, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 1, 156, 1, 143, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 143, 1, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 1,
+ 157, 157, 158, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 159,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 160, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 1, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 1,
+ 161, 161, 162, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 163,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 164, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 1, 165, 1,
+ 161, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 161,
+ 1, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 161, 161, 161, 161, 161,
+ 161, 1, 166, 1, 1, 1, 167, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 166, 168, 169, 168, 168, 168, 168,
+ 168, 170, 1, 168, 168, 1, 168, 171,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 1, 1, 172, 168, 1,
+ 168, 171, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 1, 1, 1, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 1, 173, 1, 1, 1, 174, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 173, 143, 144, 143, 143, 143, 143, 143,
+ 175, 1, 143, 143, 1, 143, 155, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 1, 1, 139, 143, 1, 143,
+ 155, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 1, 1, 1, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 1,
+ 176, 1, 1, 1, 177, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 176,
+ 143, 144, 143, 143, 143, 143, 143, 178,
+ 1, 143, 143, 1, 143, 1, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 1, 1, 129, 143, 1, 143, 1,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 1, 1, 1, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 1, 179,
+ 1, 176, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 176, 1, 180, 1, 1, 1, 181, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 180, 168, 169, 168, 168, 168, 168,
+ 168, 182, 1, 168, 168, 1, 168, 1,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 1, 1, 183, 168, 1,
+ 168, 1, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 1, 1, 1, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 1, 184, 1, 1, 1, 185, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 184, 186, 187, 186, 186, 186, 186, 186,
+ 188, 1, 186, 186, 189, 186, 190, 186,
+ 186, 186, 186, 186, 186, 186, 186, 186,
+ 186, 186, 1, 1, 1, 186, 1, 186,
+ 191, 186, 186, 186, 186, 186, 186, 186,
+ 186, 186, 186, 186, 186, 186, 186, 186,
+ 186, 186, 186, 186, 186, 186, 186, 186,
+ 186, 186, 186, 1, 1, 1, 186, 186,
+ 186, 186, 186, 186, 186, 186, 186, 186,
+ 186, 186, 186, 186, 186, 186, 186, 186,
+ 186, 186, 186, 186, 186, 186, 186, 186,
+ 186, 186, 186, 186, 186, 186, 186, 1,
+ 192, 1, 1, 1, 193, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 192,
+ 186, 187, 186, 186, 186, 186, 186, 194,
+ 1, 186, 186, 195, 186, 190, 186, 186,
+ 186, 186, 186, 186, 186, 186, 186, 186,
+ 186, 1, 1, 1, 186, 1, 186, 196,
+ 186, 186, 186, 186, 186, 186, 186, 186,
+ 186, 186, 186, 186, 186, 186, 186, 186,
+ 186, 186, 186, 186, 186, 186, 186, 186,
+ 186, 186, 1, 1, 1, 186, 186, 186,
+ 186, 186, 186, 186, 186, 186, 186, 186,
+ 186, 186, 186, 186, 186, 186, 186, 186,
+ 186, 186, 186, 186, 186, 186, 186, 186,
+ 186, 186, 186, 186, 186, 186, 1, 197,
+ 1, 192, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 192, 1, 198, 1, 1, 1, 199, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 198, 200, 201, 200, 200, 200, 200,
+ 200, 202, 1, 200, 200, 1, 200, 203,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 1, 1, 1, 200, 204,
+ 200, 205, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 1, 1, 1, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 1, 206, 1, 1, 1, 207, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 206, 1, 1, 1, 1, 1, 1, 1,
+ 208, 1, 1, 1, 1, 1, 209, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 210, 1,
+ 211, 1, 212, 1, 206, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 206, 1, 213, 1, 1,
+ 1, 214, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 213, 1, 1, 1,
+ 1, 1, 1, 1, 215, 1, 1, 1,
+ 1, 1, 216, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 217, 1, 218, 1, 209, 1,
+ 1, 1, 219, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 209, 220, 221,
+ 220, 220, 220, 220, 220, 222, 1, 220,
+ 220, 1, 220, 1, 220, 220, 220, 220,
+ 220, 220, 220, 220, 220, 220, 220, 1,
+ 1, 1, 220, 1, 220, 1, 220, 220,
+ 220, 220, 220, 220, 220, 220, 220, 220,
+ 220, 220, 220, 220, 220, 220, 220, 220,
+ 220, 220, 220, 220, 220, 220, 220, 220,
+ 1, 1, 1, 220, 220, 220, 220, 220,
+ 220, 220, 220, 220, 220, 220, 220, 220,
+ 220, 220, 220, 220, 220, 220, 220, 220,
+ 220, 220, 220, 220, 220, 220, 220, 220,
+ 220, 220, 220, 220, 1, 223, 1, 209,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 209, 1,
+ 224, 1, 1, 1, 225, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 224,
+ 220, 1, 220, 220, 220, 220, 220, 226,
+ 1, 220, 220, 1, 220, 209, 220, 220,
+ 220, 220, 220, 220, 220, 220, 220, 220,
+ 220, 1, 1, 1, 220, 210, 220, 227,
+ 220, 220, 220, 220, 220, 220, 220, 220,
+ 220, 220, 220, 220, 220, 220, 220, 220,
+ 220, 220, 220, 220, 220, 220, 220, 220,
+ 220, 220, 1, 1, 1, 220, 220, 220,
+ 220, 220, 220, 220, 220, 220, 220, 220,
+ 220, 220, 220, 220, 220, 220, 220, 220,
+ 220, 220, 220, 220, 220, 220, 220, 220,
+ 220, 220, 220, 220, 220, 220, 1, 224,
+ 1, 1, 1, 225, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 224, 1,
+ 1, 1, 1, 1, 1, 1, 226, 1,
+ 1, 1, 1, 1, 209, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 210, 1, 227, 1,
+ 228, 1, 224, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 224, 1, 229, 1, 1, 1, 230,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 229, 1, 1, 1, 1, 1,
+ 1, 1, 231, 1, 1, 1, 1, 1,
+ 216, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 217, 1, 232, 1, 210, 1, 1, 1,
+ 233, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 210, 1, 1, 1, 1,
+ 1, 1, 1, 234, 1, 1, 1, 235,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 236, 1,
+ 237, 1, 210, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 210, 1, 217, 1, 1, 1, 238,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 217, 1, 1, 1, 1, 1,
+ 1, 1, 239, 1, 1, 1, 240, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 241, 1, 242,
+ 1, 1, 1, 243, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 242, 115,
+ 116, 115, 115, 115, 115, 115, 244, 1,
+ 115, 115, 245, 115, 119, 115, 115, 115,
+ 115, 115, 115, 115, 115, 115, 115, 115,
+ 1, 120, 121, 115, 1, 115, 122, 115,
+ 115, 115, 115, 115, 115, 115, 115, 115,
+ 115, 115, 115, 115, 115, 115, 115, 115,
+ 115, 115, 115, 115, 115, 115, 115, 115,
+ 115, 1, 1, 1, 115, 115, 115, 115,
+ 115, 115, 115, 115, 115, 115, 115, 115,
+ 115, 115, 115, 115, 115, 115, 115, 115,
+ 115, 115, 115, 115, 115, 115, 115, 115,
+ 115, 115, 115, 115, 115, 1, 246, 1,
+ 1, 1, 247, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 246, 125, 126,
+ 125, 125, 125, 125, 125, 248, 1, 125,
+ 125, 245, 125, 128, 125, 125, 125, 125,
+ 125, 125, 125, 125, 125, 125, 125, 1,
+ 120, 129, 125, 1, 125, 1, 125, 125,
+ 125, 125, 125, 125, 125, 125, 125, 125,
+ 125, 125, 125, 125, 125, 125, 125, 125,
+ 125, 125, 125, 125, 125, 125, 125, 125,
+ 1, 1, 1, 125, 125, 125, 125, 125,
+ 125, 125, 125, 125, 125, 125, 125, 125,
+ 125, 125, 125, 125, 125, 125, 125, 125,
+ 125, 125, 125, 125, 125, 125, 125, 125,
+ 125, 125, 125, 125, 1, 249, 1, 246,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 246, 1,
+ 250, 250, 250, 250, 250, 250, 250, 250,
+ 251, 1, 250, 250, 252, 250, 250, 250,
+ 250, 250, 250, 250, 250, 250, 250, 250,
+ 250, 250, 250, 250, 250, 250, 250, 251,
+ 250, 253, 250, 250, 250, 250, 250, 250,
+ 250, 250, 250, 250, 250, 250, 250, 250,
+ 250, 250, 250, 250, 250, 250, 250, 250,
+ 250, 250, 250, 250, 250, 250, 250, 250,
+ 250, 250, 250, 250, 250, 250, 250, 250,
+ 250, 250, 250, 250, 250, 250, 250, 250,
+ 250, 250, 250, 250, 250, 250, 250, 250,
+ 250, 250, 250, 254, 250, 250, 250, 250,
+ 250, 250, 250, 250, 250, 250, 250, 250,
+ 250, 250, 250, 250, 250, 250, 250, 250,
+ 250, 250, 250, 250, 250, 250, 250, 250,
+ 250, 250, 250, 250, 250, 250, 250, 1,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 1, 255, 255, 256, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 257, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 258, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 1,
+ 259, 1, 255, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 255, 1, 260, 1, 1, 1, 261,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 260, 262, 134, 262, 262, 262,
+ 262, 262, 263, 1, 262, 262, 264, 262,
+ 137, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 1, 265, 139, 262,
+ 1, 262, 266, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 1, 1, 1,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 1, 267, 1, 1, 1, 268, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 267, 143, 144, 143, 143, 143, 143,
+ 143, 269, 1, 143, 143, 270, 143, 147,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 1, 271, 139, 143, 1,
+ 143, 272, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 1, 1, 1, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 1, 273, 1, 274, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 274, 1, 275, 1, 1, 1,
+ 276, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 275, 168, 169, 168, 168,
+ 168, 168, 168, 277, 1, 168, 168, 278,
+ 168, 279, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 1, 280, 172,
+ 168, 1, 168, 281, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 1, 1,
+ 1, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 1, 282, 1, 1, 1, 283,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 282, 284, 285, 284, 284, 284,
+ 284, 284, 286, 1, 284, 284, 1, 284,
+ 155, 284, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 1, 1, 139, 284,
+ 1, 284, 155, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 284, 1, 1, 1,
+ 284, 284, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 284, 284, 284, 284,
+ 284, 1, 287, 1, 1, 1, 288, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 287, 284, 285, 284, 284, 284, 284,
+ 284, 289, 1, 284, 284, 1, 284, 1,
+ 284, 284, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 1, 1, 129, 284, 1,
+ 284, 1, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 1, 1, 1, 284,
+ 284, 284, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 284, 284, 284, 284,
+ 1, 290, 1, 287, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 287, 1, 291, 1, 1, 1,
+ 292, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 291, 284, 144, 284, 284,
+ 284, 284, 284, 293, 1, 284, 284, 235,
+ 284, 147, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 284, 1, 236, 139,
+ 284, 1, 284, 294, 284, 284, 284, 284,
+ 284, 284, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 284, 284, 1, 1,
+ 1, 284, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 284, 284, 284, 284,
+ 284, 284, 1, 291, 1, 1, 1, 292,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 291, 143, 144, 143, 143, 143,
+ 143, 143, 293, 1, 143, 143, 235, 143,
+ 147, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 1, 236, 139, 143,
+ 1, 143, 294, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 1, 1, 1,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 1, 295, 1, 296, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 296, 1, 297, 1, 1,
+ 1, 298, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 297, 168, 169, 168,
+ 168, 168, 168, 168, 299, 1, 168, 168,
+ 240, 168, 279, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 1, 241,
+ 172, 168, 1, 168, 300, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 1,
+ 1, 1, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 1, 301, 1, 302, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 302, 1, 303,
+ 1, 1, 1, 304, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 303, 305,
+ 306, 305, 305, 305, 305, 305, 307, 1,
+ 305, 305, 308, 305, 309, 305, 305, 305,
+ 305, 305, 305, 305, 305, 305, 305, 305,
+ 1, 138, 310, 305, 1, 305, 311, 305,
+ 305, 305, 305, 305, 305, 305, 305, 305,
+ 305, 305, 305, 305, 305, 305, 305, 305,
+ 305, 305, 305, 305, 305, 305, 305, 305,
+ 305, 1, 1, 1, 305, 305, 305, 305,
+ 305, 305, 305, 305, 305, 305, 305, 305,
+ 305, 305, 305, 305, 305, 305, 305, 305,
+ 305, 305, 305, 305, 305, 305, 305, 305,
+ 305, 305, 305, 305, 305, 1, 312, 1,
+ 1, 1, 313, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 312, 314, 315,
+ 314, 314, 314, 314, 314, 316, 1, 314,
+ 314, 317, 314, 318, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 1,
+ 148, 310, 314, 1, 314, 319, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 1, 1, 1, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 1, 320, 1, 321,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 321, 1,
+ 322, 1, 1, 1, 323, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 322,
+ 314, 315, 314, 314, 314, 314, 314, 324,
+ 1, 314, 314, 1, 314, 325, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 1, 1, 310, 314, 1, 314, 325,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 1, 1, 1, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 1, 326,
+ 1, 314, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 314, 1, 327, 327, 327, 327, 327, 327,
+ 327, 327, 327, 1, 327, 327, 328, 327,
+ 327, 327, 327, 327, 327, 327, 327, 327,
+ 327, 327, 327, 327, 327, 327, 327, 327,
+ 327, 327, 327, 329, 327, 327, 327, 327,
+ 327, 327, 327, 327, 327, 327, 327, 327,
+ 327, 327, 327, 327, 327, 327, 327, 327,
+ 327, 327, 327, 327, 327, 327, 327, 327,
+ 327, 327, 327, 327, 327, 327, 327, 327,
+ 327, 327, 327, 327, 327, 327, 327, 327,
+ 327, 327, 327, 327, 327, 327, 327, 327,
+ 327, 327, 327, 327, 327, 330, 327, 327,
+ 327, 327, 327, 327, 327, 327, 327, 327,
+ 327, 327, 327, 327, 327, 327, 327, 327,
+ 327, 327, 327, 327, 327, 327, 327, 327,
+ 327, 327, 327, 327, 327, 327, 327, 327,
+ 327, 1, 331, 331, 331, 331, 331, 331,
+ 331, 331, 331, 1, 331, 331, 332, 331,
+ 331, 331, 331, 331, 331, 331, 331, 331,
+ 331, 331, 331, 331, 331, 331, 331, 331,
+ 331, 331, 331, 333, 331, 331, 331, 331,
+ 331, 331, 331, 331, 331, 331, 331, 331,
+ 331, 331, 331, 331, 331, 331, 331, 331,
+ 331, 331, 331, 331, 331, 331, 331, 331,
+ 331, 331, 331, 331, 331, 331, 331, 331,
+ 331, 331, 331, 331, 331, 331, 331, 331,
+ 331, 331, 331, 331, 331, 331, 331, 331,
+ 331, 331, 331, 331, 331, 334, 331, 331,
+ 331, 331, 331, 331, 331, 331, 331, 331,
+ 331, 331, 331, 331, 331, 331, 331, 331,
+ 331, 331, 331, 331, 331, 331, 331, 331,
+ 331, 331, 331, 331, 331, 331, 331, 331,
+ 331, 1, 335, 1, 331, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 331, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 331, 336, 1,
+ 1, 1, 337, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 336, 338, 339,
+ 338, 338, 338, 338, 338, 340, 1, 338,
+ 338, 1, 338, 341, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 1,
+ 1, 342, 338, 1, 338, 341, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 1, 1, 1, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 1, 343, 1, 1,
+ 1, 344, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 343, 314, 315, 314,
+ 314, 314, 314, 314, 345, 1, 314, 314,
+ 1, 314, 325, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 1, 1,
+ 310, 314, 1, 314, 325, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 1,
+ 1, 1, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 1, 346, 1, 1, 1,
+ 347, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 346, 314, 315, 314, 314,
+ 314, 314, 314, 348, 1, 314, 314, 1,
+ 314, 1, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 1, 1, 349,
+ 314, 1, 314, 1, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 1, 1,
+ 1, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 1, 350, 1, 346, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 346, 1, 351, 1,
+ 1, 1, 352, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 351, 338, 339,
+ 338, 338, 338, 338, 338, 353, 1, 338,
+ 338, 1, 338, 1, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 1,
+ 1, 354, 338, 1, 338, 1, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 1, 1, 1, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 1, 355, 1, 1,
+ 1, 356, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 355, 357, 358, 357,
+ 357, 357, 357, 357, 359, 1, 357, 357,
+ 360, 357, 361, 357, 357, 357, 357, 357,
+ 357, 357, 357, 357, 357, 357, 1, 1,
+ 1, 357, 1, 357, 362, 357, 357, 357,
+ 357, 357, 357, 357, 357, 357, 357, 357,
+ 357, 357, 357, 357, 357, 357, 357, 357,
+ 357, 357, 357, 357, 357, 357, 357, 1,
+ 1, 1, 357, 357, 357, 357, 357, 357,
+ 357, 357, 357, 357, 357, 357, 357, 357,
+ 357, 357, 357, 357, 357, 357, 357, 357,
+ 357, 357, 357, 357, 357, 357, 357, 357,
+ 357, 357, 357, 1, 363, 1, 1, 1,
+ 364, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 363, 357, 358, 357, 357,
+ 357, 357, 357, 365, 1, 357, 357, 366,
+ 357, 361, 357, 357, 357, 357, 357, 357,
+ 357, 357, 357, 357, 357, 1, 1, 1,
+ 357, 1, 357, 367, 357, 357, 357, 357,
+ 357, 357, 357, 357, 357, 357, 357, 357,
+ 357, 357, 357, 357, 357, 357, 357, 357,
+ 357, 357, 357, 357, 357, 357, 1, 1,
+ 1, 357, 357, 357, 357, 357, 357, 357,
+ 357, 357, 357, 357, 357, 357, 357, 357,
+ 357, 357, 357, 357, 357, 357, 357, 357,
+ 357, 357, 357, 357, 357, 357, 357, 357,
+ 357, 357, 1, 368, 1, 363, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 363, 1, 369, 1,
+ 1, 1, 370, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 369, 371, 372,
+ 371, 371, 371, 371, 371, 373, 1, 371,
+ 371, 1, 371, 374, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 1,
+ 1, 1, 371, 375, 371, 376, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 1, 1, 1, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 1, 377, 1, 1,
+ 1, 378, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 377, 1, 1, 1,
+ 1, 1, 1, 1, 379, 1, 1, 1,
+ 1, 1, 380, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 381, 1, 382, 1, 383, 1,
+ 377, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 377,
+ 1, 384, 1, 1, 1, 385, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 384, 1, 1, 1, 1, 1, 1, 1,
+ 386, 1, 1, 1, 1, 1, 387, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 388, 1,
+ 389, 1, 380, 1, 1, 1, 390, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 380, 391, 392, 391, 391, 391, 391,
+ 391, 393, 1, 391, 391, 1, 391, 1,
+ 391, 391, 391, 391, 391, 391, 391, 391,
+ 391, 391, 391, 1, 1, 1, 391, 1,
+ 391, 1, 391, 391, 391, 391, 391, 391,
+ 391, 391, 391, 391, 391, 391, 391, 391,
+ 391, 391, 391, 391, 391, 391, 391, 391,
+ 391, 391, 391, 391, 1, 1, 1, 391,
+ 391, 391, 391, 391, 391, 391, 391, 391,
+ 391, 391, 391, 391, 391, 391, 391, 391,
+ 391, 391, 391, 391, 391, 391, 391, 391,
+ 391, 391, 391, 391, 391, 391, 391, 391,
+ 1, 394, 1, 380, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 380, 1, 395, 1, 1, 1,
+ 396, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 395, 391, 1, 391, 391,
+ 391, 391, 391, 397, 1, 391, 391, 1,
+ 391, 380, 391, 391, 391, 391, 391, 391,
+ 391, 391, 391, 391, 391, 1, 1, 1,
+ 391, 381, 391, 398, 391, 391, 391, 391,
+ 391, 391, 391, 391, 391, 391, 391, 391,
+ 391, 391, 391, 391, 391, 391, 391, 391,
+ 391, 391, 391, 391, 391, 391, 1, 1,
+ 1, 391, 391, 391, 391, 391, 391, 391,
+ 391, 391, 391, 391, 391, 391, 391, 391,
+ 391, 391, 391, 391, 391, 391, 391, 391,
+ 391, 391, 391, 391, 391, 391, 391, 391,
+ 391, 391, 1, 395, 1, 1, 1, 396,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 395, 1, 1, 1, 1, 1,
+ 1, 1, 397, 1, 1, 1, 1, 1,
+ 380, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 381, 1, 398, 1, 399, 1, 395, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 395, 1, 400,
+ 1, 1, 1, 401, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 400, 1,
+ 1, 1, 1, 1, 1, 1, 402, 1,
+ 1, 1, 1, 1, 387, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 388, 1, 403, 1,
+ 381, 1, 1, 1, 404, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 381,
+ 1, 1, 1, 1, 1, 1, 1, 405,
+ 1, 1, 1, 406, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 236, 1, 407, 1, 381, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 381, 1, 388,
+ 1, 1, 1, 408, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 388, 1,
+ 1, 1, 1, 1, 1, 1, 409, 1,
+ 1, 1, 410, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 241, 1, 411, 1, 1, 1, 412,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 411, 413, 414, 413, 413, 413,
+ 413, 413, 415, 1, 413, 413, 1, 413,
+ 416, 413, 413, 413, 413, 413, 413, 413,
+ 413, 413, 413, 413, 1, 1, 417, 413,
+ 1, 413, 418, 413, 413, 413, 413, 413,
+ 413, 413, 413, 413, 413, 413, 413, 413,
+ 413, 413, 413, 413, 413, 413, 413, 413,
+ 413, 413, 413, 413, 413, 1, 1, 1,
+ 413, 413, 413, 413, 413, 413, 413, 413,
+ 413, 413, 413, 413, 413, 413, 413, 413,
+ 413, 413, 413, 413, 413, 413, 413, 413,
+ 413, 413, 413, 413, 413, 413, 413, 413,
+ 413, 1, 419, 1, 1, 1, 420, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 419, 421, 422, 421, 421, 421, 421,
+ 421, 423, 1, 421, 421, 1, 421, 424,
+ 421, 421, 421, 421, 421, 421, 421, 421,
+ 421, 421, 421, 1, 1, 349, 421, 1,
+ 421, 1, 421, 421, 421, 421, 421, 421,
+ 421, 421, 421, 421, 421, 421, 421, 421,
+ 421, 421, 421, 421, 421, 421, 421, 421,
+ 421, 421, 421, 421, 1, 1, 1, 421,
+ 421, 421, 421, 421, 421, 421, 421, 421,
+ 421, 421, 421, 421, 421, 421, 421, 421,
+ 421, 421, 421, 421, 421, 421, 421, 421,
+ 421, 421, 421, 421, 421, 421, 421, 421,
+ 1, 425, 1, 419, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 419, 1, 426, 426, 426, 426,
+ 426, 426, 426, 426, 427, 1, 426, 426,
+ 428, 426, 426, 426, 426, 426, 426, 426,
+ 426, 426, 426, 426, 426, 426, 426, 426,
+ 426, 426, 426, 427, 426, 429, 426, 426,
+ 426, 426, 426, 426, 426, 426, 426, 426,
+ 426, 426, 426, 426, 426, 426, 426, 426,
+ 426, 426, 426, 426, 426, 426, 426, 426,
+ 426, 426, 426, 426, 426, 426, 426, 426,
+ 426, 426, 426, 426, 426, 426, 426, 426,
+ 426, 426, 426, 426, 426, 426, 426, 426,
+ 426, 426, 426, 426, 426, 426, 426, 430,
+ 426, 426, 426, 426, 426, 426, 426, 426,
+ 426, 426, 426, 426, 426, 426, 426, 426,
+ 426, 426, 426, 426, 426, 426, 426, 426,
+ 426, 426, 426, 426, 426, 426, 426, 426,
+ 426, 426, 426, 1, 431, 431, 431, 431,
+ 431, 431, 431, 431, 431, 1, 431, 431,
+ 432, 431, 431, 431, 431, 431, 431, 431,
+ 431, 431, 431, 431, 431, 431, 431, 431,
+ 431, 431, 431, 431, 431, 433, 431, 431,
+ 431, 431, 431, 431, 431, 431, 431, 431,
+ 431, 431, 431, 431, 431, 431, 431, 431,
+ 431, 431, 431, 431, 431, 431, 431, 431,
+ 431, 431, 431, 431, 431, 431, 431, 431,
+ 431, 431, 431, 431, 431, 431, 431, 431,
+ 431, 431, 431, 431, 431, 431, 431, 431,
+ 431, 431, 431, 431, 431, 431, 431, 434,
+ 431, 431, 431, 431, 431, 431, 431, 431,
+ 431, 431, 431, 431, 431, 431, 431, 431,
+ 431, 431, 431, 431, 431, 431, 431, 431,
+ 431, 431, 431, 431, 431, 431, 431, 431,
+ 431, 431, 431, 1, 435, 1, 431, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 431, 1, 436,
+ 1, 1, 1, 437, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 436, 438,
+ 306, 438, 438, 438, 438, 438, 439, 1,
+ 438, 438, 440, 438, 309, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 1, 265, 310, 438, 1, 438, 441, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 1, 1, 1, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 1, 442, 1,
+ 1, 1, 443, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 442, 314, 315,
+ 314, 314, 314, 314, 314, 444, 1, 314,
+ 314, 445, 314, 318, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 1,
+ 271, 310, 314, 1, 314, 446, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 1, 1, 1, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 1, 447, 1, 448,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 448, 1,
+ 449, 1, 1, 1, 450, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 449,
+ 338, 339, 338, 338, 338, 338, 338, 451,
+ 1, 338, 338, 452, 338, 453, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 1, 280, 342, 338, 1, 338, 454,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 1, 1, 1, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 1, 455,
+ 1, 1, 1, 456, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 455, 457,
+ 458, 457, 457, 457, 457, 457, 459, 1,
+ 457, 457, 1, 457, 325, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 1, 1, 310, 457, 1, 457, 325, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 1, 1, 1, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 1, 460, 1,
+ 1, 1, 461, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 460, 457, 458,
+ 457, 457, 457, 457, 457, 462, 1, 457,
+ 457, 1, 457, 1, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 1,
+ 1, 349, 457, 1, 457, 1, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 1, 1, 1, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 1, 463, 1, 460,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 460, 1,
+ 464, 1, 1, 1, 465, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 464,
+ 457, 315, 457, 457, 457, 457, 457, 466,
+ 1, 457, 457, 406, 457, 318, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 1, 236, 310, 457, 1, 457, 467,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 457, 1, 1, 1, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 1, 464,
+ 1, 1, 1, 465, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 464, 314,
+ 315, 314, 314, 314, 314, 314, 466, 1,
+ 314, 314, 406, 314, 318, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 1, 236, 310, 314, 1, 314, 467, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 1, 1, 1, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 1, 468, 1,
+ 469, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 469,
+ 1, 470, 1, 1, 1, 471, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 470, 338, 339, 338, 338, 338, 338, 338,
+ 472, 1, 338, 338, 410, 338, 453, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 1, 241, 342, 338, 1, 338,
+ 473, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 1, 1, 1, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 1,
+ 474, 1, 1, 1, 475, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 474,
+ 476, 477, 476, 476, 476, 476, 476, 478,
+ 1, 476, 476, 1, 476, 479, 476, 476,
+ 476, 476, 476, 476, 476, 476, 476, 476,
+ 476, 1, 1, 310, 476, 1, 476, 325,
+ 476, 476, 476, 476, 476, 476, 476, 476,
+ 476, 476, 476, 476, 476, 476, 476, 476,
+ 476, 476, 476, 476, 476, 476, 476, 476,
+ 476, 476, 480, 1, 1, 476, 476, 476,
+ 476, 476, 476, 476, 476, 476, 476, 476,
+ 476, 476, 476, 476, 476, 476, 476, 476,
+ 476, 476, 476, 476, 476, 476, 476, 476,
+ 476, 476, 476, 476, 476, 476, 1, 481,
+ 1, 1, 1, 482, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 481, 483,
+ 484, 483, 483, 483, 483, 483, 485, 1,
+ 483, 483, 1, 483, 486, 483, 483, 483,
+ 483, 483, 483, 483, 483, 483, 483, 483,
+ 1, 1, 349, 483, 1, 483, 1, 483,
+ 483, 483, 483, 483, 483, 483, 483, 483,
+ 483, 483, 483, 483, 483, 483, 483, 483,
+ 483, 483, 483, 483, 483, 483, 483, 483,
+ 483, 487, 1, 1, 483, 483, 483, 483,
+ 483, 483, 483, 483, 483, 483, 483, 483,
+ 483, 483, 483, 483, 483, 483, 483, 483,
+ 483, 483, 483, 483, 483, 483, 483, 483,
+ 483, 483, 483, 483, 483, 1, 488, 1,
+ 481, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 481,
+ 1, 489, 1, 1, 1, 490, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 489, 483, 484, 483, 483, 483, 483, 483,
+ 491, 1, 483, 483, 492, 483, 493, 483,
+ 483, 483, 483, 483, 483, 483, 483, 483,
+ 483, 483, 1, 494, 310, 483, 1, 483,
+ 325, 483, 483, 483, 483, 483, 483, 483,
+ 483, 483, 483, 483, 483, 483, 483, 483,
+ 483, 483, 483, 483, 483, 483, 483, 483,
+ 483, 483, 483, 1, 1, 1, 483, 483,
+ 483, 483, 483, 483, 483, 483, 483, 483,
+ 483, 483, 483, 483, 483, 483, 483, 483,
+ 483, 483, 483, 483, 483, 483, 483, 483,
+ 483, 483, 483, 483, 483, 483, 483, 1,
+ 489, 1, 1, 1, 490, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 489,
+ 314, 315, 314, 314, 314, 314, 314, 491,
+ 1, 314, 314, 492, 314, 495, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 1, 494, 310, 314, 1, 314, 325,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 1, 1, 1, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 1, 496,
+ 1, 497, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 497, 1, 498, 1, 1, 1, 499, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 498, 338, 339, 338, 338, 338, 338,
+ 338, 500, 1, 338, 338, 501, 338, 502,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 1, 503, 342, 338, 1,
+ 338, 341, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 1, 1, 1, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 1, 504, 1, 1, 1, 505, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 504, 506, 315, 506, 506, 506, 506, 506,
+ 507, 1, 506, 506, 1, 506, 325, 506,
+ 506, 506, 506, 506, 506, 506, 506, 506,
+ 506, 506, 1, 1, 310, 506, 1, 506,
+ 325, 506, 506, 506, 506, 506, 506, 506,
+ 506, 506, 506, 506, 506, 506, 506, 506,
+ 506, 506, 506, 506, 506, 506, 506, 506,
+ 506, 506, 506, 1, 1, 1, 506, 506,
+ 506, 506, 506, 506, 506, 506, 506, 506,
+ 506, 506, 506, 506, 506, 506, 506, 506,
+ 506, 506, 506, 506, 506, 506, 506, 506,
+ 506, 506, 506, 506, 506, 506, 506, 1,
+ 508, 1, 1, 1, 509, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 508,
+ 506, 315, 506, 506, 506, 506, 506, 510,
+ 1, 506, 506, 1, 506, 1, 506, 506,
+ 506, 506, 506, 506, 506, 506, 506, 506,
+ 506, 1, 1, 349, 506, 1, 506, 1,
+ 506, 506, 506, 506, 506, 506, 506, 506,
+ 506, 506, 506, 506, 506, 506, 506, 506,
+ 506, 506, 506, 506, 506, 506, 506, 506,
+ 506, 506, 1, 1, 1, 506, 506, 506,
+ 506, 506, 506, 506, 506, 506, 506, 506,
+ 506, 506, 506, 506, 506, 506, 506, 506,
+ 506, 506, 506, 506, 506, 506, 506, 506,
+ 506, 506, 506, 506, 506, 506, 1, 511,
+ 1, 508, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 508, 1, 489, 1, 1, 1, 490, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 489, 506, 315, 506, 506, 506, 506,
+ 506, 491, 1, 506, 506, 492, 506, 495,
+ 506, 506, 506, 506, 506, 506, 506, 506,
+ 506, 506, 506, 1, 494, 310, 506, 1,
+ 506, 325, 506, 506, 506, 506, 506, 506,
+ 506, 506, 506, 506, 506, 506, 506, 506,
+ 506, 506, 506, 506, 506, 506, 506, 506,
+ 506, 506, 506, 506, 1, 1, 1, 506,
+ 506, 506, 506, 506, 506, 506, 506, 506,
+ 506, 506, 506, 506, 506, 506, 506, 506,
+ 506, 506, 506, 506, 506, 506, 506, 506,
+ 506, 506, 506, 506, 506, 506, 506, 506,
+ 1, 512, 1, 1, 1, 513, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 512, 514, 339, 514, 514, 514, 514, 514,
+ 515, 1, 514, 514, 1, 514, 1, 514,
+ 514, 514, 514, 514, 514, 514, 514, 514,
+ 514, 514, 1, 1, 354, 514, 1, 514,
+ 1, 514, 514, 514, 514, 514, 514, 514,
+ 514, 514, 514, 514, 514, 514, 514, 514,
+ 514, 514, 514, 514, 514, 514, 514, 514,
+ 514, 514, 514, 1, 1, 1, 514, 514,
+ 514, 514, 514, 514, 514, 514, 514, 514,
+ 514, 514, 514, 514, 514, 514, 514, 514,
+ 514, 514, 514, 514, 514, 514, 514, 514,
+ 514, 514, 514, 514, 514, 514, 514, 1,
+ 516, 516, 516, 516, 516, 516, 516, 516,
+ 517, 1, 516, 516, 518, 516, 516, 516,
+ 516, 516, 516, 516, 516, 516, 516, 516,
+ 516, 516, 516, 516, 516, 516, 516, 517,
+ 516, 329, 516, 516, 516, 516, 516, 516,
+ 516, 516, 516, 516, 516, 516, 516, 516,
+ 516, 516, 516, 516, 516, 516, 516, 516,
+ 516, 516, 516, 516, 516, 516, 516, 516,
+ 516, 516, 516, 516, 516, 516, 516, 516,
+ 516, 516, 516, 516, 516, 516, 516, 516,
+ 516, 516, 516, 516, 516, 516, 516, 516,
+ 516, 516, 516, 519, 516, 516, 516, 516,
+ 516, 516, 516, 516, 516, 516, 516, 516,
+ 516, 516, 516, 516, 516, 516, 516, 516,
+ 516, 516, 516, 516, 516, 516, 516, 516,
+ 516, 516, 516, 516, 516, 516, 516, 1,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 1, 520, 520, 521, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 522, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 523, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 1,
+ 524, 1, 520, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 520, 1, 525, 1, 1, 1, 526,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 525, 527, 484, 527, 527, 527,
+ 527, 527, 528, 1, 527, 527, 492, 527,
+ 529, 527, 527, 527, 527, 527, 527, 527,
+ 527, 527, 527, 527, 1, 494, 310, 527,
+ 1, 527, 325, 527, 527, 527, 527, 527,
+ 527, 527, 527, 527, 527, 527, 527, 527,
+ 527, 527, 527, 527, 527, 527, 527, 527,
+ 527, 527, 527, 527, 527, 1, 1, 1,
+ 527, 527, 527, 527, 527, 527, 527, 527,
+ 527, 527, 527, 527, 527, 527, 527, 527,
+ 527, 527, 527, 527, 527, 527, 527, 527,
+ 527, 527, 527, 527, 527, 527, 527, 527,
+ 527, 1, 525, 1, 1, 1, 526, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 525, 314, 315, 314, 314, 314, 314,
+ 314, 528, 1, 314, 314, 492, 314, 325,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 1, 494, 310, 314, 1,
+ 314, 325, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 1, 1, 1, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 1, 530, 1, 531, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 531, 1, 532, 1, 1, 1,
+ 533, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 532, 338, 339, 338, 338,
+ 338, 338, 338, 534, 1, 338, 338, 501,
+ 338, 341, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 1, 503, 342,
+ 338, 1, 338, 341, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 1, 1,
+ 1, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 1, 343, 1, 1, 1, 344,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 343, 527, 484, 527, 527, 527,
+ 527, 527, 345, 1, 527, 527, 1, 527,
+ 529, 527, 527, 527, 527, 527, 527, 527,
+ 527, 527, 527, 527, 1, 1, 310, 527,
+ 1, 527, 325, 527, 527, 527, 527, 527,
+ 527, 527, 527, 527, 527, 527, 527, 527,
+ 527, 527, 527, 527, 527, 527, 527, 527,
+ 527, 527, 527, 527, 527, 1, 1, 1,
+ 527, 527, 527, 527, 527, 527, 527, 527,
+ 527, 527, 527, 527, 527, 527, 527, 527,
+ 527, 527, 527, 527, 527, 527, 527, 527,
+ 527, 527, 527, 527, 527, 527, 527, 527,
+ 527, 1, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 1, 520, 520, 520, 520, 520,
+ 520, 520, 520, 535, 1, 520, 520, 536,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 535, 520, 333, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 523, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 520, 520, 520, 520, 520, 520,
+ 520, 520, 1, 537, 1, 535, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 535, 1, 504, 1,
+ 1, 1, 505, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 504, 483, 484,
+ 483, 483, 483, 483, 483, 507, 1, 483,
+ 483, 1, 483, 529, 483, 483, 483, 483,
+ 483, 483, 483, 483, 483, 483, 483, 1,
+ 1, 310, 483, 1, 483, 325, 483, 483,
+ 483, 483, 483, 483, 483, 483, 483, 483,
+ 483, 483, 483, 483, 483, 483, 483, 483,
+ 483, 483, 483, 483, 483, 483, 483, 483,
+ 1, 1, 1, 483, 483, 483, 483, 483,
+ 483, 483, 483, 483, 483, 483, 483, 483,
+ 483, 483, 483, 483, 483, 483, 483, 483,
+ 483, 483, 483, 483, 483, 483, 483, 483,
+ 483, 483, 483, 483, 1, 538, 1, 1,
+ 1, 539, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 538, 540, 541, 540,
+ 540, 540, 540, 540, 542, 1, 540, 540,
+ 1, 540, 543, 540, 540, 540, 540, 540,
+ 540, 540, 540, 540, 540, 540, 1, 1,
+ 354, 540, 1, 540, 1, 540, 540, 540,
+ 540, 540, 540, 540, 540, 540, 540, 540,
+ 540, 540, 540, 540, 540, 540, 540, 540,
+ 540, 540, 540, 540, 540, 540, 540, 544,
+ 1, 1, 540, 540, 540, 540, 540, 540,
+ 540, 540, 540, 540, 540, 540, 540, 540,
+ 540, 540, 540, 540, 540, 540, 540, 540,
+ 540, 540, 540, 540, 540, 540, 540, 540,
+ 540, 540, 540, 1, 545, 546, 545, 545,
+ 545, 545, 545, 1, 1, 545, 545, 1,
+ 545, 486, 545, 545, 545, 545, 545, 545,
+ 545, 545, 545, 545, 545, 1, 1, 1,
+ 545, 1, 545, 1, 545, 545, 545, 545,
+ 545, 545, 545, 545, 545, 545, 545, 545,
+ 545, 545, 545, 545, 545, 545, 545, 545,
+ 545, 545, 545, 545, 545, 545, 1, 1,
+ 1, 545, 545, 545, 545, 545, 545, 545,
+ 545, 545, 545, 545, 545, 545, 545, 545,
+ 545, 545, 545, 545, 545, 545, 545, 545,
+ 545, 545, 545, 545, 545, 545, 545, 545,
+ 545, 545, 1, 547, 1, 1, 1, 548,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 547, 545, 546, 545, 545, 545,
+ 545, 545, 549, 1, 545, 545, 492, 545,
+ 486, 545, 545, 545, 545, 545, 545, 545,
+ 545, 545, 545, 545, 1, 494, 1, 545,
+ 1, 545, 1, 545, 545, 545, 545, 545,
+ 545, 545, 545, 545, 545, 545, 545, 545,
+ 545, 545, 545, 545, 545, 545, 545, 545,
+ 545, 545, 545, 545, 545, 1, 1, 1,
+ 545, 545, 545, 545, 545, 545, 545, 545,
+ 545, 545, 545, 545, 545, 545, 545, 545,
+ 545, 545, 545, 545, 545, 545, 545, 545,
+ 545, 545, 545, 545, 545, 545, 545, 545,
+ 545, 1, 547, 1, 1, 1, 548, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 547, 1, 1, 1, 1, 1, 1,
+ 1, 549, 1, 1, 1, 492, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 494, 1, 550, 1,
+ 547, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 547,
+ 1, 551, 1, 1, 1, 552, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 551, 1, 1, 1, 1, 1, 1, 1,
+ 553, 1, 1, 1, 501, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 503, 1, 554, 554, 554,
+ 554, 554, 554, 554, 554, 546, 1, 554,
+ 554, 555, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 546, 554, 1, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 556, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 1, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 1, 554,
+ 554, 557, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 545, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 556, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 1, 558, 1, 554,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 554, 1,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 1, 559, 1, 546, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 546, 1, 487, 487, 487, 487,
+ 487, 487, 487, 487, 487, 1, 487, 487,
+ 560, 487, 487, 487, 487, 487, 487, 487,
+ 487, 487, 487, 487, 487, 487, 487, 487,
+ 487, 487, 487, 487, 487, 487, 487, 487,
+ 487, 487, 487, 487, 487, 487, 487, 487,
+ 487, 487, 487, 487, 487, 487, 487, 487,
+ 487, 487, 487, 487, 487, 487, 487, 487,
+ 487, 487, 487, 487, 487, 487, 487, 487,
+ 487, 487, 487, 487, 487, 487, 487, 487,
+ 487, 487, 487, 487, 487, 487, 487, 487,
+ 487, 487, 487, 487, 487, 487, 1, 561,
+ 547, 487, 487, 487, 487, 487, 487, 487,
+ 487, 487, 487, 487, 487, 487, 487, 487,
+ 487, 487, 487, 487, 487, 487, 487, 487,
+ 487, 487, 487, 487, 487, 487, 487, 487,
+ 487, 487, 487, 1, 562, 1, 487, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 487, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 487,
+ 563, 563, 563, 563, 563, 563, 563, 563,
+ 563, 1, 563, 563, 564, 563, 563, 563,
+ 563, 563, 563, 563, 563, 563, 563, 563,
+ 563, 563, 563, 563, 563, 563, 563, 563,
+ 563, 565, 563, 563, 563, 563, 563, 563,
+ 563, 563, 563, 563, 563, 563, 563, 563,
+ 563, 563, 563, 563, 563, 563, 563, 563,
+ 563, 563, 563, 563, 563, 563, 563, 563,
+ 563, 563, 563, 563, 563, 563, 563, 563,
+ 563, 563, 563, 563, 563, 563, 563, 563,
+ 563, 563, 563, 563, 563, 563, 563, 563,
+ 563, 563, 563, 566, 563, 563, 563, 563,
+ 563, 563, 563, 563, 563, 563, 563, 563,
+ 563, 563, 563, 563, 563, 563, 563, 563,
+ 563, 563, 563, 563, 563, 563, 563, 563,
+ 563, 563, 563, 563, 563, 563, 563, 1,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 1, 567, 567, 568, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 569, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 570, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 1,
+ 571, 1, 567, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 567, 1, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 567, 567, 567, 567, 567,
+ 567, 567, 567, 1, 572, 1, 1, 1,
+ 573, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 572, 574, 575, 574, 574,
+ 574, 574, 574, 576, 1, 574, 574, 1,
+ 574, 1, 574, 574, 574, 574, 574, 574,
+ 574, 574, 574, 574, 574, 1, 1, 354,
+ 574, 1, 574, 1, 574, 574, 574, 574,
+ 574, 574, 574, 574, 574, 574, 574, 574,
+ 574, 574, 574, 574, 574, 574, 574, 574,
+ 574, 574, 574, 574, 574, 574, 1, 1,
+ 1, 574, 574, 574, 574, 574, 574, 574,
+ 574, 574, 574, 574, 574, 574, 574, 574,
+ 574, 574, 574, 574, 574, 574, 574, 574,
+ 574, 574, 574, 574, 574, 574, 574, 574,
+ 574, 574, 1, 577, 1, 1, 1, 578,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 577, 438, 306, 438, 438, 438,
+ 438, 438, 579, 1, 438, 438, 308, 438,
+ 580, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 1, 138, 310, 438,
+ 1, 438, 311, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 1, 1, 1,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 1, 581, 1, 1, 1, 582, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 581, 314, 315, 314, 314, 314, 314,
+ 314, 583, 1, 314, 314, 317, 314, 325,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 1, 148, 310, 314, 1,
+ 314, 319, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 1, 1, 1, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 1, 584, 1, 585, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 585, 1, 586, 1, 1, 1,
+ 587, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 586, 338, 339, 338, 338,
+ 338, 338, 338, 588, 1, 338, 338, 589,
+ 338, 341, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 1, 590, 342,
+ 338, 1, 338, 591, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 1, 1,
+ 1, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 1, 592, 592, 592, 592, 592,
+ 592, 592, 592, 593, 1, 592, 592, 594,
+ 592, 592, 592, 592, 592, 592, 592, 592,
+ 592, 592, 592, 592, 592, 592, 592, 592,
+ 592, 592, 593, 592, 329, 592, 592, 592,
+ 592, 592, 592, 592, 592, 592, 592, 592,
+ 592, 592, 592, 592, 592, 592, 592, 592,
+ 592, 592, 592, 592, 592, 592, 592, 592,
+ 592, 592, 592, 592, 592, 592, 592, 592,
+ 592, 592, 592, 592, 592, 592, 592, 592,
+ 592, 592, 592, 592, 592, 592, 592, 592,
+ 592, 592, 592, 592, 592, 592, 595, 592,
+ 592, 592, 592, 592, 592, 592, 592, 592,
+ 592, 592, 592, 592, 592, 592, 592, 592,
+ 592, 592, 592, 592, 592, 592, 592, 592,
+ 592, 592, 592, 592, 592, 592, 592, 592,
+ 592, 592, 1, 596, 596, 596, 596, 596,
+ 596, 596, 596, 596, 1, 596, 596, 597,
+ 596, 596, 596, 596, 596, 596, 596, 596,
+ 596, 596, 596, 596, 596, 596, 596, 596,
+ 596, 596, 596, 596, 598, 596, 596, 596,
+ 596, 596, 596, 596, 596, 596, 596, 596,
+ 596, 596, 596, 596, 596, 596, 596, 596,
+ 596, 596, 596, 596, 596, 596, 596, 596,
+ 596, 596, 596, 596, 596, 596, 596, 596,
+ 596, 596, 596, 596, 596, 596, 596, 596,
+ 596, 596, 596, 596, 596, 596, 596, 596,
+ 596, 596, 596, 596, 596, 596, 599, 596,
+ 596, 596, 596, 596, 596, 596, 596, 596,
+ 596, 596, 596, 596, 596, 596, 596, 596,
+ 596, 596, 596, 596, 596, 596, 596, 596,
+ 596, 596, 596, 596, 596, 596, 596, 596,
+ 596, 596, 1, 600, 1, 596, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 596, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 596, 596,
+ 596, 596, 596, 596, 596, 596, 596, 601,
+ 1, 596, 596, 602, 596, 596, 596, 596,
+ 596, 596, 596, 596, 596, 596, 596, 596,
+ 596, 596, 596, 596, 596, 596, 601, 596,
+ 333, 596, 596, 596, 596, 596, 596, 596,
+ 596, 596, 596, 596, 596, 596, 596, 596,
+ 596, 596, 596, 596, 596, 596, 596, 596,
+ 596, 596, 596, 596, 596, 596, 596, 596,
+ 596, 596, 596, 596, 596, 596, 596, 596,
+ 596, 596, 596, 596, 596, 596, 596, 596,
+ 596, 596, 596, 596, 596, 596, 596, 596,
+ 596, 596, 599, 596, 596, 596, 596, 596,
+ 596, 596, 596, 596, 596, 596, 596, 596,
+ 596, 596, 596, 596, 596, 596, 596, 596,
+ 596, 596, 596, 596, 596, 596, 596, 596,
+ 596, 596, 596, 596, 596, 596, 1, 603,
+ 1, 601, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 601, 1, 604, 1, 1, 1, 605, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 604, 438, 306, 438, 438, 438, 438,
+ 438, 606, 1, 438, 438, 308, 438, 580,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 1, 138, 310, 438, 1,
+ 438, 311, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 1, 1, 1, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 1, 607, 1, 1, 1, 608, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 607, 314, 315, 314, 314, 314, 314, 314,
+ 609, 1, 314, 314, 317, 314, 1, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 1, 148, 349, 314, 1, 314,
+ 610, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 1, 1, 1, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 1,
+ 611, 1, 607, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 607, 1, 612, 1, 1, 1, 613,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 612, 338, 339, 338, 338, 338,
+ 338, 338, 614, 1, 338, 338, 589, 338,
+ 1, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 1, 590, 354, 338,
+ 1, 338, 615, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 1, 1, 1,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 1, 616, 1, 1, 1, 617, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 616, 618, 619, 618, 618, 618, 618,
+ 618, 620, 1, 618, 618, 1, 618, 621,
+ 618, 618, 618, 618, 618, 618, 618, 618,
+ 618, 618, 618, 1, 1, 1, 618, 1,
+ 618, 1, 618, 618, 618, 618, 618, 618,
+ 618, 618, 618, 618, 618, 618, 618, 618,
+ 618, 618, 618, 618, 618, 618, 618, 618,
+ 618, 618, 618, 618, 480, 1, 1, 618,
+ 618, 618, 618, 618, 618, 618, 618, 618,
+ 618, 618, 618, 618, 618, 618, 618, 618,
+ 618, 618, 618, 618, 618, 618, 618, 618,
+ 618, 618, 618, 618, 618, 618, 618, 618,
+ 1, 622, 1, 1, 1, 623, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 622, 624, 546, 624, 624, 624, 624, 624,
+ 625, 1, 624, 624, 1, 624, 486, 624,
+ 624, 624, 624, 624, 624, 624, 624, 624,
+ 624, 624, 1, 1, 1, 624, 1, 624,
+ 1, 624, 624, 624, 624, 624, 624, 624,
+ 624, 624, 624, 624, 624, 624, 624, 624,
+ 624, 624, 624, 624, 624, 624, 624, 624,
+ 624, 624, 624, 487, 1, 1, 624, 624,
+ 624, 624, 624, 624, 624, 624, 624, 624,
+ 624, 624, 624, 624, 624, 624, 624, 624,
+ 624, 624, 624, 624, 624, 624, 624, 624,
+ 624, 624, 624, 624, 624, 624, 624, 1,
+ 626, 1, 622, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 622, 1, 627, 1, 1, 1, 628,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 627, 624, 546, 624, 624, 624,
+ 624, 624, 629, 1, 624, 624, 492, 624,
+ 630, 624, 624, 624, 624, 624, 624, 624,
+ 624, 624, 624, 624, 1, 494, 1, 624,
+ 1, 624, 1, 624, 624, 624, 624, 624,
+ 624, 624, 624, 624, 624, 624, 624, 624,
+ 624, 624, 624, 624, 624, 624, 624, 624,
+ 624, 624, 624, 624, 624, 1, 1, 1,
+ 624, 624, 624, 624, 624, 624, 624, 624,
+ 624, 624, 624, 624, 624, 624, 624, 624,
+ 624, 624, 624, 624, 624, 624, 624, 624,
+ 624, 624, 624, 624, 624, 624, 624, 624,
+ 624, 1, 627, 1, 1, 1, 628, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 627, 1, 1, 1, 1, 1, 1,
+ 1, 629, 1, 1, 1, 492, 1, 631,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 494, 1, 632, 1,
+ 627, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 627,
+ 1, 633, 1, 1, 1, 634, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 633, 1, 1, 1, 1, 1, 1, 1,
+ 635, 1, 1, 1, 501, 1, 636, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 503, 1, 631, 1, 1,
+ 1, 637, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 631, 638, 1, 638,
+ 638, 638, 638, 638, 639, 1, 638, 638,
+ 1, 638, 1, 638, 638, 638, 638, 638,
+ 638, 638, 638, 638, 638, 638, 1, 1,
+ 1, 638, 1, 638, 1, 638, 638, 638,
+ 638, 638, 638, 638, 638, 638, 638, 638,
+ 638, 638, 638, 638, 638, 638, 638, 638,
+ 638, 638, 638, 638, 638, 638, 638, 1,
+ 1, 1, 638, 638, 638, 638, 638, 638,
+ 638, 638, 638, 638, 638, 638, 638, 638,
+ 638, 638, 638, 638, 638, 638, 638, 638,
+ 638, 638, 638, 638, 638, 638, 638, 638,
+ 638, 638, 638, 1, 640, 1, 631, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 631, 1, 627,
+ 1, 1, 1, 628, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 627, 638,
+ 1, 638, 638, 638, 638, 638, 629, 1,
+ 638, 638, 492, 638, 631, 638, 638, 638,
+ 638, 638, 638, 638, 638, 638, 638, 638,
+ 1, 494, 1, 638, 1, 638, 1, 638,
+ 638, 638, 638, 638, 638, 638, 638, 638,
+ 638, 638, 638, 638, 638, 638, 638, 638,
+ 638, 638, 638, 638, 638, 638, 638, 638,
+ 638, 1, 1, 1, 638, 638, 638, 638,
+ 638, 638, 638, 638, 638, 638, 638, 638,
+ 638, 638, 638, 638, 638, 638, 638, 638,
+ 638, 638, 638, 638, 638, 638, 638, 638,
+ 638, 638, 638, 638, 638, 1, 636, 1,
+ 1, 1, 641, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 636, 642, 1,
+ 642, 642, 642, 642, 642, 643, 1, 642,
+ 642, 1, 642, 1, 642, 642, 642, 642,
+ 642, 642, 642, 642, 642, 642, 642, 1,
+ 1, 1, 642, 1, 642, 1, 642, 642,
+ 642, 642, 642, 642, 642, 642, 642, 642,
+ 642, 642, 642, 642, 642, 642, 642, 642,
+ 642, 642, 642, 642, 642, 642, 642, 642,
+ 1, 1, 1, 642, 642, 642, 642, 642,
+ 642, 642, 642, 642, 642, 642, 642, 642,
+ 642, 642, 642, 642, 642, 642, 642, 642,
+ 642, 642, 642, 642, 642, 642, 642, 642,
+ 642, 642, 642, 642, 1, 631, 1, 1,
+ 1, 637, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 631, 624, 546, 624,
+ 624, 624, 624, 624, 639, 1, 624, 624,
+ 1, 624, 486, 624, 624, 624, 624, 624,
+ 624, 624, 624, 624, 624, 624, 1, 1,
+ 1, 624, 1, 624, 1, 624, 624, 624,
+ 624, 624, 624, 624, 624, 624, 624, 624,
+ 624, 624, 624, 624, 624, 624, 624, 624,
+ 624, 624, 624, 624, 624, 624, 624, 1,
+ 1, 1, 624, 624, 624, 624, 624, 624,
+ 624, 624, 624, 624, 624, 624, 624, 624,
+ 624, 624, 624, 624, 624, 624, 624, 624,
+ 624, 624, 624, 624, 624, 624, 624, 624,
+ 624, 624, 624, 1, 644, 1, 1, 1,
+ 645, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 644, 646, 647, 646, 646,
+ 646, 646, 646, 648, 1, 646, 646, 1,
+ 646, 543, 646, 646, 646, 646, 646, 646,
+ 646, 646, 646, 646, 646, 1, 1, 1,
+ 646, 1, 646, 1, 646, 646, 646, 646,
+ 646, 646, 646, 646, 646, 646, 646, 646,
+ 646, 646, 646, 646, 646, 646, 646, 646,
+ 646, 646, 646, 646, 646, 646, 544, 1,
+ 1, 646, 646, 646, 646, 646, 646, 646,
+ 646, 646, 646, 646, 646, 646, 646, 646,
+ 646, 646, 646, 646, 646, 646, 646, 646,
+ 646, 646, 646, 646, 646, 646, 646, 646,
+ 646, 646, 1, 649, 1, 1, 1, 650,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 649, 305, 651, 305, 305, 305,
+ 305, 305, 652, 1, 305, 305, 308, 305,
+ 580, 305, 305, 305, 305, 305, 305, 305,
+ 305, 305, 305, 305, 1, 138, 310, 305,
+ 1, 305, 311, 305, 305, 305, 305, 305,
+ 305, 305, 305, 305, 305, 305, 305, 305,
+ 305, 305, 305, 305, 305, 305, 305, 305,
+ 305, 305, 305, 305, 305, 1, 1, 1,
+ 305, 305, 305, 305, 305, 305, 305, 305,
+ 305, 305, 305, 305, 305, 305, 305, 305,
+ 305, 305, 305, 305, 305, 305, 305, 305,
+ 305, 305, 305, 305, 305, 305, 305, 305,
+ 305, 1, 653, 1, 1, 1, 654, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 653, 457, 458, 457, 457, 457, 457,
+ 457, 655, 1, 457, 457, 317, 457, 1,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 457, 457, 1, 148, 349, 457, 1,
+ 457, 610, 457, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 1, 1, 1, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 457,
+ 1, 656, 1, 653, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 653, 1, 657, 1, 1, 1,
+ 658, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 657, 574, 575, 574, 574,
+ 574, 574, 574, 659, 1, 574, 574, 589,
+ 574, 1, 574, 574, 574, 574, 574, 574,
+ 574, 574, 574, 574, 574, 1, 590, 354,
+ 574, 1, 574, 615, 574, 574, 574, 574,
+ 574, 574, 574, 574, 574, 574, 574, 574,
+ 574, 574, 574, 574, 574, 574, 574, 574,
+ 574, 574, 574, 574, 574, 574, 1, 1,
+ 1, 574, 574, 574, 574, 574, 574, 574,
+ 574, 574, 574, 574, 574, 574, 574, 574,
+ 574, 574, 574, 574, 574, 574, 574, 574,
+ 574, 574, 574, 574, 574, 574, 574, 574,
+ 574, 574, 1, 660, 660, 660, 660, 660,
+ 660, 660, 660, 661, 1, 660, 660, 662,
+ 660, 660, 660, 660, 660, 660, 660, 660,
+ 660, 660, 660, 660, 660, 660, 660, 660,
+ 660, 660, 661, 660, 565, 660, 660, 660,
+ 660, 660, 660, 660, 660, 660, 660, 660,
+ 660, 660, 660, 660, 660, 660, 660, 660,
+ 660, 660, 660, 660, 660, 660, 660, 660,
+ 660, 660, 660, 660, 660, 660, 660, 660,
+ 660, 660, 660, 660, 660, 660, 660, 660,
+ 660, 660, 660, 660, 660, 660, 660, 660,
+ 660, 660, 660, 660, 660, 660, 663, 660,
+ 660, 660, 660, 660, 660, 660, 660, 660,
+ 660, 660, 660, 660, 660, 660, 660, 660,
+ 660, 660, 660, 660, 660, 660, 660, 660,
+ 660, 660, 660, 660, 660, 660, 660, 660,
+ 660, 660, 1, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 1, 664, 664, 665,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 666, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 667, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 1, 668, 1, 664, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 664, 1, 303, 1,
+ 1, 1, 304, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 303, 438, 306,
+ 438, 438, 438, 438, 438, 307, 1, 438,
+ 438, 308, 438, 309, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 1,
+ 138, 310, 438, 1, 438, 311, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 1, 1, 1, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 1, 669, 1, 1,
+ 1, 670, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 669, 338, 339, 338,
+ 338, 338, 338, 338, 671, 1, 338, 338,
+ 589, 338, 453, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 1, 590,
+ 342, 338, 1, 338, 591, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 1,
+ 1, 1, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 1, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 1, 664, 664, 664,
+ 664, 664, 664, 664, 664, 672, 1, 664,
+ 664, 673, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 672, 664, 569, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 667, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 664, 664, 664, 664,
+ 664, 664, 664, 664, 1, 674, 1, 672,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 672, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 431, 431, 431, 431, 431, 431, 431, 431,
+ 431, 675, 1, 431, 431, 676, 431, 431,
+ 431, 431, 431, 431, 431, 431, 431, 431,
+ 431, 431, 431, 431, 431, 431, 431, 431,
+ 675, 431, 677, 431, 431, 431, 431, 431,
+ 431, 431, 431, 431, 431, 431, 431, 431,
+ 431, 431, 431, 431, 431, 431, 431, 431,
+ 431, 431, 431, 431, 431, 431, 431, 431,
+ 431, 431, 431, 431, 431, 431, 431, 431,
+ 431, 431, 431, 431, 431, 431, 431, 431,
+ 431, 431, 431, 431, 431, 431, 431, 431,
+ 431, 431, 431, 431, 434, 431, 431, 431,
+ 431, 431, 431, 431, 431, 431, 431, 431,
+ 431, 431, 431, 431, 431, 431, 431, 431,
+ 431, 431, 431, 431, 431, 431, 431, 431,
+ 431, 431, 431, 431, 431, 431, 431, 431,
+ 1, 678, 1, 675, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 675, 1, 679, 1, 1, 1,
+ 680, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 679, 314, 315, 314, 314,
+ 314, 314, 314, 681, 1, 314, 314, 682,
+ 314, 318, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 1, 683, 310,
+ 314, 1, 314, 684, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 1, 1,
+ 1, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314,
+ 314, 314, 1, 685, 1, 686, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 686, 1, 687, 1,
+ 1, 1, 688, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 687, 338, 339,
+ 338, 338, 338, 338, 338, 689, 1, 338,
+ 338, 690, 338, 453, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 1,
+ 691, 342, 338, 1, 338, 692, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 1, 1, 1, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 338, 338, 338, 338,
+ 338, 338, 338, 338, 1, 693, 1, 1,
+ 1, 694, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 693, 695, 696, 695,
+ 695, 695, 695, 695, 697, 1, 695, 695,
+ 1, 695, 698, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 1, 1,
+ 354, 695, 1, 695, 1, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 1,
+ 1, 1, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 1, 699, 700, 699, 699,
+ 699, 699, 699, 1, 1, 699, 699, 1,
+ 699, 701, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 1, 1, 1,
+ 699, 1, 699, 1, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 1, 1,
+ 1, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 1, 702, 1, 1, 1, 703,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 702, 699, 700, 699, 699, 699,
+ 699, 699, 704, 1, 699, 699, 308, 699,
+ 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 1, 138, 1, 699,
+ 1, 699, 705, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 1, 1, 1,
+ 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 699, 699, 699, 699, 699, 699, 699,
+ 699, 1, 706, 1, 1, 1, 707, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 706, 1, 1, 1, 1, 1, 1,
+ 1, 708, 1, 1, 1, 317, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 148, 1, 1, 1,
+ 1, 610, 1, 709, 1, 706, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 706, 1, 710, 1,
+ 1, 1, 711, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 710, 1, 1,
+ 1, 1, 1, 1, 1, 712, 1, 1,
+ 1, 589, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 590, 1, 1, 1, 1, 615, 1, 713,
+ 713, 713, 713, 713, 713, 713, 713, 700,
+ 1, 713, 713, 714, 713, 713, 713, 713,
+ 713, 713, 713, 713, 713, 713, 713, 713,
+ 713, 713, 713, 713, 713, 713, 700, 713,
+ 1, 713, 713, 713, 713, 713, 713, 713,
+ 713, 713, 713, 713, 713, 713, 713, 713,
+ 713, 713, 713, 713, 713, 713, 713, 713,
+ 713, 713, 713, 713, 713, 713, 713, 713,
+ 713, 713, 713, 713, 713, 713, 713, 713,
+ 713, 713, 713, 713, 713, 713, 713, 713,
+ 713, 713, 713, 713, 713, 713, 713, 713,
+ 713, 713, 715, 713, 713, 713, 713, 713,
+ 713, 713, 713, 713, 713, 713, 713, 713,
+ 713, 713, 713, 713, 713, 713, 713, 713,
+ 713, 713, 713, 713, 713, 713, 713, 713,
+ 713, 713, 713, 713, 713, 713, 1, 713,
+ 713, 713, 713, 713, 713, 713, 713, 713,
+ 1, 713, 713, 716, 713, 713, 713, 713,
+ 713, 713, 713, 713, 713, 713, 713, 713,
+ 713, 713, 713, 713, 713, 713, 713, 713,
+ 699, 713, 713, 713, 713, 713, 713, 713,
+ 713, 713, 713, 713, 713, 713, 713, 713,
+ 713, 713, 713, 713, 713, 713, 713, 713,
+ 713, 713, 713, 713, 713, 713, 713, 713,
+ 713, 713, 713, 713, 713, 713, 713, 713,
+ 713, 713, 713, 713, 713, 713, 713, 713,
+ 713, 713, 713, 713, 713, 713, 713, 713,
+ 713, 713, 715, 713, 713, 713, 713, 713,
+ 713, 713, 713, 713, 713, 713, 713, 713,
+ 713, 713, 713, 713, 713, 713, 713, 713,
+ 713, 713, 713, 713, 713, 713, 713, 713,
+ 713, 713, 713, 713, 713, 713, 1, 717,
+ 1, 713, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 713, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 713, 718, 1, 700, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 700, 1, 343, 1,
+ 1, 1, 344, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 343, 438, 306,
+ 438, 438, 438, 438, 438, 345, 1, 438,
+ 438, 1, 438, 719, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 1,
+ 1, 310, 438, 1, 438, 325, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 1, 1, 1, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 438, 438, 438, 438,
+ 438, 438, 438, 438, 1, 720, 1, 1,
+ 1, 721, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 720, 722, 723, 722,
+ 722, 722, 722, 722, 724, 1, 722, 722,
+ 1, 722, 725, 722, 722, 722, 722, 722,
+ 722, 722, 722, 722, 722, 722, 1, 1,
+ 1, 722, 1, 722, 1, 722, 722, 722,
+ 722, 722, 722, 722, 722, 722, 722, 722,
+ 722, 722, 722, 722, 722, 722, 722, 722,
+ 722, 722, 722, 722, 722, 722, 722, 726,
+ 1, 1, 722, 722, 722, 722, 722, 722,
+ 722, 722, 722, 722, 722, 722, 722, 722,
+ 722, 722, 722, 722, 722, 722, 722, 722,
+ 722, 722, 722, 722, 722, 722, 722, 722,
+ 722, 722, 722, 1, 727, 1, 1, 1,
+ 728, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 727, 729, 730, 729, 729,
+ 729, 729, 729, 731, 1, 729, 729, 1,
+ 729, 732, 729, 729, 729, 729, 729, 729,
+ 729, 729, 729, 729, 729, 1, 1, 1,
+ 729, 1, 729, 1, 729, 729, 729, 729,
+ 729, 729, 729, 729, 729, 729, 729, 729,
+ 729, 729, 729, 729, 729, 729, 729, 729,
+ 729, 729, 729, 729, 729, 729, 733, 1,
+ 1, 729, 729, 729, 729, 729, 729, 729,
+ 729, 729, 729, 729, 729, 729, 729, 729,
+ 729, 729, 729, 729, 729, 729, 729, 729,
+ 729, 729, 729, 729, 729, 729, 729, 729,
+ 729, 729, 1, 734, 1, 727, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 727, 1, 735, 1,
+ 1, 1, 736, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 735, 729, 730,
+ 729, 729, 729, 729, 729, 737, 1, 729,
+ 729, 1, 729, 738, 729, 729, 729, 729,
+ 729, 729, 729, 729, 729, 729, 729, 1,
+ 1, 1, 729, 739, 729, 1, 729, 729,
+ 729, 729, 729, 729, 729, 729, 729, 729,
+ 729, 729, 729, 729, 729, 729, 729, 729,
+ 729, 729, 729, 729, 729, 729, 729, 729,
+ 1, 1, 1, 729, 729, 729, 729, 729,
+ 729, 729, 729, 729, 729, 729, 729, 729,
+ 729, 729, 729, 729, 729, 729, 729, 729,
+ 729, 729, 729, 729, 729, 729, 729, 729,
+ 729, 729, 729, 729, 1, 735, 1, 1,
+ 1, 736, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 735, 1, 1, 1,
+ 1, 1, 1, 1, 737, 1, 1, 1,
+ 1, 1, 740, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 739, 1, 741, 1, 735, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 735, 1, 742,
+ 1, 1, 1, 743, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 742, 1,
+ 1, 1, 1, 1, 1, 1, 744, 1,
+ 1, 1, 1, 1, 745, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 746, 1, 740, 1,
+ 1, 1, 747, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 740, 748, 1,
+ 748, 748, 748, 748, 748, 749, 1, 748,
+ 748, 1, 748, 1, 748, 748, 748, 748,
+ 748, 748, 748, 748, 748, 748, 748, 1,
+ 1, 1, 748, 1, 748, 1, 748, 748,
+ 748, 748, 748, 748, 748, 748, 748, 748,
+ 748, 748, 748, 748, 748, 748, 748, 748,
+ 748, 748, 748, 748, 748, 748, 748, 748,
+ 1, 1, 1, 748, 748, 748, 748, 748,
+ 748, 748, 748, 748, 748, 748, 748, 748,
+ 748, 748, 748, 748, 748, 748, 748, 748,
+ 748, 748, 748, 748, 748, 748, 748, 748,
+ 748, 748, 748, 748, 1, 750, 1, 740,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 740, 1,
+ 735, 1, 1, 1, 736, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 735,
+ 748, 1, 748, 748, 748, 748, 748, 737,
+ 1, 748, 748, 1, 748, 740, 748, 748,
+ 748, 748, 748, 748, 748, 748, 748, 748,
+ 748, 1, 1, 1, 748, 739, 748, 1,
+ 748, 748, 748, 748, 748, 748, 748, 748,
+ 748, 748, 748, 748, 748, 748, 748, 748,
+ 748, 748, 748, 748, 748, 748, 748, 748,
+ 748, 748, 1, 1, 1, 748, 748, 748,
+ 748, 748, 748, 748, 748, 748, 748, 748,
+ 748, 748, 748, 748, 748, 748, 748, 748,
+ 748, 748, 748, 748, 748, 748, 748, 748,
+ 748, 748, 748, 748, 748, 748, 1, 745,
+ 1, 1, 1, 751, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 745, 752,
+ 1, 752, 752, 752, 752, 752, 753, 1,
+ 752, 752, 1, 752, 1, 752, 752, 752,
+ 752, 752, 752, 752, 752, 752, 752, 752,
+ 1, 1, 1, 752, 1, 752, 1, 752,
+ 752, 752, 752, 752, 752, 752, 752, 752,
+ 752, 752, 752, 752, 752, 752, 752, 752,
+ 752, 752, 752, 752, 752, 752, 752, 752,
+ 752, 1, 1, 1, 752, 752, 752, 752,
+ 752, 752, 752, 752, 752, 752, 752, 752,
+ 752, 752, 752, 752, 752, 752, 752, 752,
+ 752, 752, 752, 752, 752, 752, 752, 752,
+ 752, 752, 752, 752, 752, 1, 754, 754,
+ 754, 754, 754, 754, 754, 754, 730, 1,
+ 754, 754, 755, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 730, 754, 1,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 756, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 1, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 1,
+ 754, 754, 757, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 758,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 756, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 1, 759, 1,
+ 754, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 754,
+ 1, 760, 1, 1, 1, 761, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 760, 758, 730, 758, 758, 758, 758, 758,
+ 762, 1, 758, 758, 1, 758, 732, 758,
+ 758, 758, 758, 758, 758, 758, 758, 758,
+ 758, 758, 1, 1, 1, 758, 739, 758,
+ 1, 758, 758, 758, 758, 758, 758, 758,
+ 758, 758, 758, 758, 758, 758, 758, 758,
+ 758, 758, 758, 758, 758, 758, 758, 758,
+ 758, 758, 758, 1, 1, 1, 758, 758,
+ 758, 758, 758, 758, 758, 758, 758, 758,
+ 758, 758, 758, 758, 758, 758, 758, 758,
+ 758, 758, 758, 758, 758, 758, 758, 758,
+ 758, 758, 758, 758, 758, 758, 758, 1,
+ 760, 1, 1, 1, 761, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 760,
+ 1, 1, 1, 1, 1, 1, 1, 762,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 739, 1, 763,
+ 1, 760, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 760, 1, 764, 1, 1, 1, 765, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 764, 1, 1, 1, 1, 1, 1,
+ 1, 766, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 746,
+ 1, 758, 730, 758, 758, 758, 758, 758,
+ 1, 1, 758, 758, 1, 758, 732, 758,
+ 758, 758, 758, 758, 758, 758, 758, 758,
+ 758, 758, 1, 1, 1, 758, 1, 758,
+ 1, 758, 758, 758, 758, 758, 758, 758,
+ 758, 758, 758, 758, 758, 758, 758, 758,
+ 758, 758, 758, 758, 758, 758, 758, 758,
+ 758, 758, 758, 1, 1, 1, 758, 758,
+ 758, 758, 758, 758, 758, 758, 758, 758,
+ 758, 758, 758, 758, 758, 758, 758, 758,
+ 758, 758, 758, 758, 758, 758, 758, 758,
+ 758, 758, 758, 758, 758, 758, 758, 1,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 754,
+ 1, 767, 1, 730, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 730, 1, 740, 1, 1, 1,
+ 747, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 740, 729, 730, 729, 729,
+ 729, 729, 729, 749, 1, 729, 729, 1,
+ 729, 732, 729, 729, 729, 729, 729, 729,
+ 729, 729, 729, 729, 729, 1, 1, 1,
+ 729, 1, 729, 1, 729, 729, 729, 729,
+ 729, 729, 729, 729, 729, 729, 729, 729,
+ 729, 729, 729, 729, 729, 729, 729, 729,
+ 729, 729, 729, 729, 729, 729, 1, 1,
+ 1, 729, 729, 729, 729, 729, 729, 729,
+ 729, 729, 729, 729, 729, 729, 729, 729,
+ 729, 729, 729, 729, 729, 729, 729, 729,
+ 729, 729, 729, 729, 729, 729, 729, 729,
+ 729, 729, 1, 768, 1, 1, 1, 769,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 768, 770, 771, 770, 770, 770,
+ 770, 770, 772, 1, 770, 770, 1, 770,
+ 773, 770, 770, 770, 770, 770, 770, 770,
+ 770, 770, 770, 770, 1, 1, 1, 770,
+ 1, 770, 1, 770, 770, 770, 770, 770,
+ 770, 770, 770, 770, 770, 770, 770, 770,
+ 770, 770, 770, 770, 770, 770, 770, 770,
+ 770, 770, 770, 770, 770, 774, 1, 1,
+ 770, 770, 770, 770, 770, 770, 770, 770,
+ 770, 770, 770, 770, 770, 770, 770, 770,
+ 770, 770, 770, 770, 770, 770, 770, 770,
+ 770, 770, 770, 770, 770, 770, 770, 770,
+ 770, 1, 733, 733, 733, 733, 733, 733,
+ 733, 733, 733, 1, 733, 733, 775, 733,
+ 733, 733, 733, 733, 733, 733, 733, 733,
+ 733, 733, 733, 733, 733, 733, 733, 733,
+ 733, 733, 733, 733, 733, 733, 733, 733,
+ 733, 733, 733, 733, 733, 733, 733, 733,
+ 733, 733, 733, 733, 733, 733, 733, 733,
+ 733, 733, 733, 733, 733, 733, 733, 733,
+ 733, 733, 733, 733, 733, 733, 733, 733,
+ 733, 733, 733, 733, 733, 733, 733, 733,
+ 733, 733, 733, 733, 733, 733, 733, 733,
+ 733, 733, 733, 733, 1, 776, 760, 733,
+ 733, 733, 733, 733, 733, 733, 733, 733,
+ 733, 733, 733, 733, 733, 733, 733, 733,
+ 733, 733, 733, 733, 733, 733, 733, 733,
+ 733, 733, 733, 733, 733, 733, 733, 733,
+ 733, 1, 777, 1, 733, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 733, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 733, 778, 778,
+ 778, 778, 778, 778, 778, 778, 778, 1,
+ 778, 778, 779, 778, 778, 778, 778, 778,
+ 778, 778, 778, 778, 778, 778, 778, 778,
+ 778, 778, 778, 778, 778, 778, 778, 780,
+ 778, 778, 778, 778, 778, 778, 778, 778,
+ 778, 778, 778, 778, 778, 778, 778, 778,
+ 778, 778, 778, 778, 778, 778, 778, 778,
+ 778, 778, 778, 778, 778, 778, 778, 778,
+ 778, 778, 778, 778, 778, 778, 778, 778,
+ 778, 778, 778, 778, 778, 778, 778, 778,
+ 778, 778, 778, 778, 778, 778, 778, 778,
+ 778, 781, 778, 778, 778, 778, 778, 778,
+ 778, 778, 778, 778, 778, 778, 778, 778,
+ 778, 778, 778, 778, 778, 778, 778, 778,
+ 778, 778, 778, 778, 778, 778, 778, 778,
+ 778, 778, 778, 778, 778, 1, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 1,
+ 782, 782, 783, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 784,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 785, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 1, 786, 1,
+ 782, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 782,
+ 1, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ 782, 1, 387, 1, 1, 1, 787, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 387, 788, 789, 788, 788, 788, 788,
+ 788, 790, 1, 788, 788, 1, 788, 1,
+ 788, 788, 788, 788, 788, 788, 788, 788,
+ 788, 788, 788, 1, 1, 1, 788, 1,
+ 788, 1, 788, 788, 788, 788, 788, 788,
+ 788, 788, 788, 788, 788, 788, 788, 788,
+ 788, 788, 788, 788, 788, 788, 788, 788,
+ 788, 788, 788, 788, 1, 1, 1, 788,
+ 788, 788, 788, 788, 788, 788, 788, 788,
+ 788, 788, 788, 788, 788, 788, 788, 788,
+ 788, 788, 788, 788, 788, 788, 788, 788,
+ 788, 788, 788, 788, 788, 788, 788, 788,
+ 1, 791, 791, 791, 791, 791, 791, 791,
+ 791, 372, 1, 791, 791, 792, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 372, 791, 1, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 793, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 1, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 1, 791, 791, 794, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 795, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 793, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 1, 796, 1, 791, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 791, 1, 797, 1, 1, 1,
+ 798, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 797, 795, 372, 795, 795,
+ 795, 795, 795, 799, 1, 795, 795, 1,
+ 795, 795, 795, 795, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 1, 1, 1,
+ 795, 375, 795, 376, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 795, 1, 1,
+ 1, 795, 795, 795, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 795, 795, 795,
+ 795, 795, 1, 800, 1, 1, 1, 801,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 800, 1, 1, 1, 1, 1,
+ 1, 1, 802, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 381, 1, 382, 1, 803, 1, 800, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 800, 1, 804,
+ 1, 1, 1, 805, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 804, 1,
+ 1, 1, 1, 1, 1, 1, 806, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 388, 1, 389, 1,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 791, 791, 791, 791, 791, 791, 791, 791,
+ 1, 807, 1, 372, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 372, 1, 808, 1, 1, 1,
+ 809, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 808, 371, 810, 371, 371,
+ 371, 371, 371, 811, 1, 371, 371, 1,
+ 371, 795, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 1, 1, 1,
+ 371, 375, 371, 376, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 1, 1,
+ 1, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 1, 812, 1, 1, 1, 813,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 812, 391, 392, 391, 391, 391,
+ 391, 391, 814, 1, 391, 391, 1, 391,
+ 1, 391, 391, 391, 391, 391, 391, 391,
+ 391, 391, 391, 391, 1, 1, 1, 391,
+ 381, 391, 382, 391, 391, 391, 391, 391,
+ 391, 391, 391, 391, 391, 391, 391, 391,
+ 391, 391, 391, 391, 391, 391, 391, 391,
+ 391, 391, 391, 391, 391, 1, 1, 1,
+ 391, 391, 391, 391, 391, 391, 391, 391,
+ 391, 391, 391, 391, 391, 391, 391, 391,
+ 391, 391, 391, 391, 391, 391, 391, 391,
+ 391, 391, 391, 391, 391, 391, 391, 391,
+ 391, 1, 815, 1, 812, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 812, 1, 816, 1, 1,
+ 1, 817, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 816, 788, 789, 788,
+ 788, 788, 788, 788, 818, 1, 788, 788,
+ 1, 788, 1, 788, 788, 788, 788, 788,
+ 788, 788, 788, 788, 788, 788, 1, 1,
+ 1, 788, 388, 788, 389, 788, 788, 788,
+ 788, 788, 788, 788, 788, 788, 788, 788,
+ 788, 788, 788, 788, 788, 788, 788, 788,
+ 788, 788, 788, 788, 788, 788, 788, 1,
+ 1, 1, 788, 788, 788, 788, 788, 788,
+ 788, 788, 788, 788, 788, 788, 788, 788,
+ 788, 788, 788, 788, 788, 788, 788, 788,
+ 788, 788, 788, 788, 788, 788, 788, 788,
+ 788, 788, 788, 1, 819, 819, 819, 819,
+ 819, 819, 819, 819, 820, 1, 819, 819,
+ 821, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 820, 819, 780, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 822,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 1, 823, 823, 823, 823,
+ 823, 823, 823, 823, 823, 1, 823, 823,
+ 824, 823, 823, 823, 823, 823, 823, 823,
+ 823, 823, 823, 823, 823, 823, 823, 823,
+ 823, 823, 823, 823, 823, 825, 823, 823,
+ 823, 823, 823, 823, 823, 823, 823, 823,
+ 823, 823, 823, 823, 823, 823, 823, 823,
+ 823, 823, 823, 823, 823, 823, 823, 823,
+ 823, 823, 823, 823, 823, 823, 823, 823,
+ 823, 823, 823, 823, 823, 823, 823, 823,
+ 823, 823, 823, 823, 823, 823, 823, 823,
+ 823, 823, 823, 823, 823, 823, 823, 826,
+ 823, 823, 823, 823, 823, 823, 823, 823,
+ 823, 823, 823, 823, 823, 823, 823, 823,
+ 823, 823, 823, 823, 823, 823, 823, 823,
+ 823, 823, 823, 823, 823, 823, 823, 823,
+ 823, 823, 823, 1, 827, 1, 823, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 823, 1, 369,
+ 1, 1, 1, 370, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 369, 795,
+ 372, 795, 795, 795, 795, 795, 373, 1,
+ 795, 795, 1, 795, 374, 795, 795, 795,
+ 795, 795, 795, 795, 795, 795, 795, 795,
+ 1, 1, 1, 795, 375, 795, 376, 795,
+ 795, 795, 795, 795, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 795, 795, 795,
+ 795, 1, 1, 1, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 823, 823,
+ 823, 823, 823, 823, 823, 823, 823, 828,
+ 1, 823, 823, 829, 823, 823, 823, 823,
+ 823, 823, 823, 823, 823, 823, 823, 823,
+ 823, 823, 823, 823, 823, 823, 828, 823,
+ 784, 823, 823, 823, 823, 823, 823, 823,
+ 823, 823, 823, 823, 823, 823, 823, 823,
+ 823, 823, 823, 823, 823, 823, 823, 823,
+ 823, 823, 823, 823, 823, 823, 823, 823,
+ 823, 823, 823, 823, 823, 823, 823, 823,
+ 823, 823, 823, 823, 823, 823, 823, 823,
+ 823, 823, 823, 823, 823, 823, 823, 823,
+ 823, 823, 826, 823, 823, 823, 823, 823,
+ 823, 823, 823, 823, 823, 823, 823, 823,
+ 823, 823, 823, 823, 823, 823, 823, 823,
+ 823, 823, 823, 823, 823, 823, 823, 823,
+ 823, 823, 823, 823, 823, 823, 1, 830,
+ 1, 828, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 828, 1, 831, 831, 831, 831, 831, 831,
+ 831, 831, 832, 1, 831, 831, 833, 831,
+ 831, 831, 831, 831, 831, 831, 831, 831,
+ 831, 831, 831, 831, 831, 831, 831, 831,
+ 831, 832, 831, 834, 831, 831, 831, 831,
+ 831, 831, 831, 831, 831, 831, 831, 831,
+ 831, 831, 831, 831, 831, 831, 831, 831,
+ 831, 831, 831, 831, 831, 831, 831, 831,
+ 831, 831, 831, 831, 831, 831, 831, 831,
+ 831, 831, 831, 831, 831, 831, 831, 831,
+ 831, 831, 831, 831, 831, 831, 831, 831,
+ 831, 831, 831, 831, 831, 835, 831, 831,
+ 831, 831, 831, 831, 831, 831, 831, 831,
+ 831, 831, 831, 831, 831, 831, 831, 831,
+ 831, 831, 831, 831, 831, 831, 831, 831,
+ 831, 831, 831, 831, 831, 831, 831, 831,
+ 831, 1, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 1, 836, 836, 837, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 838, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 839, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 1, 840, 1, 836, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 836, 1, 841, 1, 1,
+ 1, 842, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 841, 795, 372, 795,
+ 795, 795, 795, 795, 843, 1, 795, 795,
+ 1, 795, 374, 795, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 795, 1, 1,
+ 1, 795, 375, 795, 844, 795, 795, 795,
+ 795, 795, 795, 795, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 795, 795, 1,
+ 1, 1, 795, 795, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 795, 795, 795,
+ 795, 795, 795, 1, 845, 1, 1, 1,
+ 846, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 845, 1, 1, 1, 1,
+ 1, 1, 1, 847, 1, 1, 1, 1,
+ 1, 380, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 381, 1, 848, 1, 849, 1, 845,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 845, 1,
+ 850, 1, 1, 1, 851, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 850,
+ 1, 1, 1, 1, 1, 1, 1, 852,
+ 1, 1, 1, 1, 1, 387, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 388, 1, 853,
+ 1, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 1, 836, 836, 836, 836, 836, 836,
+ 836, 836, 854, 1, 836, 836, 855, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 854, 836, 856, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 839, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 836, 836, 836, 836, 836, 836, 836,
+ 836, 1, 857, 1, 854, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 854, 1, 858, 1, 1,
+ 1, 859, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 858, 1, 1, 1,
+ 1, 1, 1, 1, 860, 1, 1, 1,
+ 1, 1, 380, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 381, 1, 861, 1, 862, 1,
+ 858, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 858,
+ 1, 863, 1, 1, 1, 864, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 863, 1, 1, 1, 1, 1, 1, 1,
+ 865, 1, 1, 1, 1, 1, 387, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 388, 1,
+ 866, 1, 867, 1, 1, 1, 868, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 867, 869, 870, 869, 869, 869, 869,
+ 869, 871, 1, 869, 869, 872, 869, 873,
+ 869, 869, 869, 869, 869, 869, 869, 869,
+ 869, 869, 869, 1, 1, 1, 869, 1,
+ 869, 874, 869, 869, 869, 869, 869, 869,
+ 869, 869, 869, 869, 869, 869, 869, 869,
+ 869, 869, 869, 869, 869, 869, 869, 869,
+ 869, 869, 869, 869, 1, 1, 1, 869,
+ 869, 869, 869, 869, 869, 869, 869, 869,
+ 869, 869, 869, 869, 869, 869, 869, 869,
+ 869, 869, 869, 869, 869, 869, 869, 869,
+ 869, 869, 869, 869, 869, 869, 869, 869,
+ 1, 366, 1, 1, 1, 875, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 366, 1, 1, 1, 1, 1, 1, 1,
+ 876, 1, 1, 1, 366, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 367, 1, 877, 1, 366, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 366, 1, 872, 1, 1,
+ 1, 878, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 872, 1, 1, 1,
+ 1, 1, 1, 1, 879, 1, 1, 1,
+ 872, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 874, 1, 880, 1,
+ 1, 1, 881, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 880, 882, 883,
+ 882, 882, 882, 882, 882, 884, 1, 882,
+ 882, 1, 882, 885, 882, 882, 882, 882,
+ 882, 882, 882, 882, 882, 882, 882, 1,
+ 1, 1, 882, 1, 882, 1, 882, 882,
+ 882, 882, 882, 882, 882, 882, 882, 882,
+ 882, 882, 882, 882, 882, 882, 882, 882,
+ 882, 882, 882, 882, 882, 882, 882, 882,
+ 886, 1, 1, 882, 882, 882, 882, 882,
+ 882, 882, 882, 882, 882, 882, 882, 882,
+ 882, 882, 882, 882, 882, 882, 882, 882,
+ 882, 882, 882, 882, 882, 882, 882, 882,
+ 882, 882, 882, 882, 1, 887, 1, 1,
+ 1, 888, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 887, 889, 890, 889,
+ 889, 889, 889, 889, 891, 1, 889, 889,
+ 1, 889, 892, 889, 889, 889, 889, 889,
+ 889, 889, 889, 889, 889, 889, 1, 1,
+ 1, 889, 1, 889, 1, 889, 889, 889,
+ 889, 889, 889, 889, 889, 889, 889, 889,
+ 889, 889, 889, 889, 889, 889, 889, 889,
+ 889, 889, 889, 889, 889, 889, 889, 893,
+ 1, 1, 889, 889, 889, 889, 889, 889,
+ 889, 889, 889, 889, 889, 889, 889, 889,
+ 889, 889, 889, 889, 889, 889, 889, 889,
+ 889, 889, 889, 889, 889, 889, 889, 889,
+ 889, 889, 889, 1, 894, 1, 887, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 887, 1, 895,
+ 1, 1, 1, 896, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 895, 889,
+ 890, 889, 889, 889, 889, 889, 897, 1,
+ 889, 889, 898, 889, 899, 889, 889, 889,
+ 889, 889, 889, 889, 889, 889, 889, 889,
+ 900, 1, 1, 889, 1, 889, 1, 889,
+ 889, 889, 889, 889, 889, 889, 889, 889,
+ 889, 889, 889, 889, 889, 889, 889, 889,
+ 889, 889, 889, 889, 889, 889, 889, 889,
+ 889, 1, 1, 1, 889, 889, 889, 889,
+ 889, 889, 889, 889, 889, 889, 889, 889,
+ 889, 889, 889, 889, 889, 889, 889, 889,
+ 889, 889, 889, 889, 889, 889, 889, 889,
+ 889, 889, 889, 889, 889, 1, 895, 1,
+ 1, 1, 896, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 895, 1, 1,
+ 1, 1, 1, 1, 1, 897, 1, 1,
+ 1, 898, 1, 901, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 900,
+ 1, 902, 1, 895, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 895, 1, 903, 1, 1, 1,
+ 904, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 903, 1, 1, 1, 1,
+ 1, 1, 1, 905, 1, 1, 1, 906,
+ 1, 907, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 908, 1, 909,
+ 1, 1, 1, 910, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 909, 1,
+ 1, 1, 1, 1, 1, 1, 911, 1,
+ 1, 1, 909, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 912, 1, 1, 1, 1, 1, 367, 1,
+ 913, 1, 909, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 909, 1, 914, 1, 1, 1, 915,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 914, 1, 1, 1, 1, 1,
+ 1, 1, 916, 1, 1, 1, 914, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 917, 1, 1, 1,
+ 1, 1, 874, 1, 918, 1, 1, 1,
+ 919, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 918, 920, 921, 920, 920,
+ 920, 920, 920, 922, 1, 920, 920, 1,
+ 920, 923, 920, 920, 920, 920, 920, 920,
+ 920, 920, 920, 920, 920, 1, 1, 1,
+ 920, 1, 920, 1, 920, 920, 920, 920,
+ 920, 920, 920, 920, 920, 920, 920, 920,
+ 920, 920, 920, 920, 920, 920, 920, 920,
+ 920, 920, 920, 920, 920, 920, 1, 1,
+ 1, 920, 920, 920, 920, 920, 920, 920,
+ 920, 920, 920, 920, 920, 920, 920, 920,
+ 920, 920, 920, 920, 920, 920, 920, 920,
+ 920, 920, 920, 920, 920, 920, 920, 920,
+ 920, 920, 1, 924, 1, 1, 1, 925,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 924, 357, 358, 357, 357, 357,
+ 357, 357, 926, 1, 357, 357, 1, 357,
+ 361, 357, 357, 357, 357, 357, 357, 357,
+ 357, 357, 357, 357, 1, 1, 1, 357,
+ 1, 357, 1, 357, 357, 357, 357, 357,
+ 357, 357, 357, 357, 357, 357, 357, 357,
+ 357, 357, 357, 357, 357, 357, 357, 357,
+ 357, 357, 357, 357, 357, 1, 1, 1,
+ 357, 357, 357, 357, 357, 357, 357, 357,
+ 357, 357, 357, 357, 357, 357, 357, 357,
+ 357, 357, 357, 357, 357, 357, 357, 357,
+ 357, 357, 357, 357, 357, 357, 357, 357,
+ 357, 1, 927, 1, 924, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 924, 1, 928, 1, 1,
+ 1, 929, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 928, 869, 870, 869,
+ 869, 869, 869, 869, 930, 1, 869, 869,
+ 1, 869, 873, 869, 869, 869, 869, 869,
+ 869, 869, 869, 869, 869, 869, 1, 1,
+ 1, 869, 1, 869, 1, 869, 869, 869,
+ 869, 869, 869, 869, 869, 869, 869, 869,
+ 869, 869, 869, 869, 869, 869, 869, 869,
+ 869, 869, 869, 869, 869, 869, 869, 1,
+ 1, 1, 869, 869, 869, 869, 869, 869,
+ 869, 869, 869, 869, 869, 869, 869, 869,
+ 869, 869, 869, 869, 869, 869, 869, 869,
+ 869, 869, 869, 869, 869, 869, 869, 869,
+ 869, 869, 869, 1, 795, 372, 795, 795,
+ 795, 795, 795, 1, 1, 795, 795, 1,
+ 795, 931, 795, 795, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 1, 1, 1,
+ 795, 1, 795, 1, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 795, 1, 1,
+ 1, 795, 795, 795, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 795, 795, 795,
+ 795, 795, 795, 795, 795, 795, 795, 795,
+ 795, 795, 1, 901, 1, 1, 1, 932,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 901, 933, 1, 933, 933, 933,
+ 933, 933, 934, 1, 933, 933, 1, 933,
+ 1, 933, 933, 933, 933, 933, 933, 933,
+ 933, 933, 933, 933, 1, 1, 1, 933,
+ 1, 933, 1, 933, 933, 933, 933, 933,
+ 933, 933, 933, 933, 933, 933, 933, 933,
+ 933, 933, 933, 933, 933, 933, 933, 933,
+ 933, 933, 933, 933, 933, 1, 1, 1,
+ 933, 933, 933, 933, 933, 933, 933, 933,
+ 933, 933, 933, 933, 933, 933, 933, 933,
+ 933, 933, 933, 933, 933, 933, 933, 933,
+ 933, 933, 933, 933, 933, 933, 933, 933,
+ 933, 1, 935, 1, 901, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 901, 1, 895, 1, 1,
+ 1, 896, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 895, 933, 1, 933,
+ 933, 933, 933, 933, 897, 1, 933, 933,
+ 898, 933, 901, 933, 933, 933, 933, 933,
+ 933, 933, 933, 933, 933, 933, 900, 1,
+ 1, 933, 1, 933, 1, 933, 933, 933,
+ 933, 933, 933, 933, 933, 933, 933, 933,
+ 933, 933, 933, 933, 933, 933, 933, 933,
+ 933, 933, 933, 933, 933, 933, 933, 1,
+ 1, 1, 933, 933, 933, 933, 933, 933,
+ 933, 933, 933, 933, 933, 933, 933, 933,
+ 933, 933, 933, 933, 933, 933, 933, 933,
+ 933, 933, 933, 933, 933, 933, 933, 933,
+ 933, 933, 933, 1, 907, 1, 1, 1,
+ 936, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 907, 937, 1, 937, 937,
+ 937, 937, 937, 938, 1, 937, 937, 1,
+ 937, 1, 937, 937, 937, 937, 937, 937,
+ 937, 937, 937, 937, 937, 1, 1, 1,
+ 937, 1, 937, 1, 937, 937, 937, 937,
+ 937, 937, 937, 937, 937, 937, 937, 937,
+ 937, 937, 937, 937, 937, 937, 937, 937,
+ 937, 937, 937, 937, 937, 937, 1, 1,
+ 1, 937, 937, 937, 937, 937, 937, 937,
+ 937, 937, 937, 937, 937, 937, 937, 937,
+ 937, 937, 937, 937, 937, 937, 937, 937,
+ 937, 937, 937, 937, 937, 937, 937, 937,
+ 937, 937, 1, 939, 939, 939, 939, 939,
+ 939, 939, 939, 890, 1, 939, 939, 940,
+ 939, 939, 939, 939, 939, 939, 939, 939,
+ 939, 939, 939, 939, 939, 939, 939, 939,
+ 939, 939, 890, 939, 1, 939, 939, 939,
+ 939, 939, 939, 939, 939, 939, 939, 939,
+ 939, 939, 939, 939, 939, 939, 939, 939,
+ 939, 939, 939, 939, 939, 939, 939, 939,
+ 939, 939, 939, 939, 939, 939, 939, 939,
+ 939, 939, 939, 939, 939, 939, 939, 939,
+ 939, 939, 939, 939, 939, 939, 939, 939,
+ 939, 939, 939, 939, 939, 939, 941, 939,
+ 939, 939, 939, 939, 939, 939, 939, 939,
+ 939, 939, 939, 939, 939, 939, 939, 939,
+ 939, 939, 939, 939, 939, 939, 939, 939,
+ 939, 939, 939, 939, 939, 939, 939, 939,
+ 939, 939, 1, 939, 939, 939, 939, 939,
+ 939, 939, 939, 939, 1, 939, 939, 942,
+ 939, 939, 939, 939, 939, 939, 939, 939,
+ 939, 939, 939, 939, 939, 939, 939, 939,
+ 939, 939, 939, 939, 943, 939, 939, 939,
+ 939, 939, 939, 939, 939, 939, 939, 939,
+ 939, 939, 939, 939, 939, 939, 939, 939,
+ 939, 939, 939, 939, 939, 939, 939, 939,
+ 939, 939, 939, 939, 939, 939, 939, 939,
+ 939, 939, 939, 939, 939, 939, 939, 939,
+ 939, 939, 939, 939, 939, 939, 939, 939,
+ 939, 939, 939, 939, 939, 939, 941, 939,
+ 939, 939, 939, 939, 939, 939, 939, 939,
+ 939, 939, 939, 939, 939, 939, 939, 939,
+ 939, 939, 939, 939, 939, 939, 939, 939,
+ 939, 939, 939, 939, 939, 939, 939, 939,
+ 939, 939, 1, 944, 1, 939, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 939, 1, 945, 1,
+ 1, 1, 946, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 945, 943, 890,
+ 943, 943, 943, 943, 943, 947, 1, 943,
+ 943, 898, 943, 892, 943, 943, 943, 943,
+ 943, 943, 943, 943, 943, 943, 943, 900,
+ 1, 1, 943, 1, 943, 1, 943, 943,
+ 943, 943, 943, 943, 943, 943, 943, 943,
+ 943, 943, 943, 943, 943, 943, 943, 943,
+ 943, 943, 943, 943, 943, 943, 943, 943,
+ 1, 1, 1, 943, 943, 943, 943, 943,
+ 943, 943, 943, 943, 943, 943, 943, 943,
+ 943, 943, 943, 943, 943, 943, 943, 943,
+ 943, 943, 943, 943, 943, 943, 943, 943,
+ 943, 943, 943, 943, 1, 945, 1, 1,
+ 1, 946, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 945, 1, 1, 1,
+ 1, 1, 1, 1, 947, 1, 1, 1,
+ 898, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 900, 1,
+ 948, 1, 945, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 945, 1, 949, 1, 1, 1, 950,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 949, 1, 1, 1, 1, 1,
+ 1, 1, 951, 1, 1, 1, 906, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 908, 1, 943, 890,
+ 943, 943, 943, 943, 943, 1, 1, 943,
+ 943, 1, 943, 892, 943, 943, 943, 943,
+ 943, 943, 943, 943, 943, 943, 943, 1,
+ 1, 1, 943, 1, 943, 1, 943, 943,
+ 943, 943, 943, 943, 943, 943, 943, 943,
+ 943, 943, 943, 943, 943, 943, 943, 943,
+ 943, 943, 943, 943, 943, 943, 943, 943,
+ 1, 1, 1, 943, 943, 943, 943, 943,
+ 943, 943, 943, 943, 943, 943, 943, 943,
+ 943, 943, 943, 943, 943, 943, 943, 943,
+ 943, 943, 943, 943, 943, 943, 943, 943,
+ 943, 943, 943, 943, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 939, 952, 1,
+ 890, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 890,
+ 1, 901, 1, 1, 1, 932, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 901, 889, 890, 889, 889, 889, 889, 889,
+ 934, 1, 889, 889, 1, 889, 892, 889,
+ 889, 889, 889, 889, 889, 889, 889, 889,
+ 889, 889, 1, 1, 1, 889, 1, 889,
+ 1, 889, 889, 889, 889, 889, 889, 889,
+ 889, 889, 889, 889, 889, 889, 889, 889,
+ 889, 889, 889, 889, 889, 889, 889, 889,
+ 889, 889, 889, 1, 1, 1, 889, 889,
+ 889, 889, 889, 889, 889, 889, 889, 889,
+ 889, 889, 889, 889, 889, 889, 889, 889,
+ 889, 889, 889, 889, 889, 889, 889, 889,
+ 889, 889, 889, 889, 889, 889, 889, 1,
+ 953, 1, 1, 1, 954, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 953,
+ 955, 956, 955, 955, 955, 955, 955, 957,
+ 1, 955, 955, 1, 955, 958, 955, 955,
+ 955, 955, 955, 955, 955, 955, 955, 955,
+ 955, 1, 1, 1, 955, 1, 955, 1,
+ 955, 955, 955, 955, 955, 955, 955, 955,
+ 955, 955, 955, 955, 955, 955, 955, 955,
+ 955, 955, 955, 955, 955, 955, 955, 955,
+ 955, 955, 959, 1, 1, 955, 955, 955,
+ 955, 955, 955, 955, 955, 955, 955, 955,
+ 955, 955, 955, 955, 955, 955, 955, 955,
+ 955, 955, 955, 955, 955, 955, 955, 955,
+ 955, 955, 955, 955, 955, 955, 1, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 1, 893, 893, 960, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 1, 961, 945, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 1, 962,
+ 1, 893, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 893, 1, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 893, 893, 893, 893, 893, 893,
+ 893, 893, 1, 963, 1, 1, 1, 964,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 963, 965, 966, 965, 965, 965,
+ 965, 965, 967, 1, 965, 965, 1, 965,
+ 968, 965, 965, 965, 965, 965, 965, 965,
+ 965, 965, 965, 965, 1, 1, 139, 965,
+ 1, 965, 155, 965, 965, 965, 965, 965,
+ 965, 965, 965, 965, 965, 965, 965, 965,
+ 965, 965, 965, 965, 965, 965, 965, 965,
+ 965, 965, 965, 965, 965, 969, 1, 1,
+ 965, 965, 965, 965, 965, 965, 965, 965,
+ 965, 965, 965, 965, 965, 965, 965, 965,
+ 965, 965, 965, 965, 965, 965, 965, 965,
+ 965, 965, 965, 965, 965, 965, 965, 965,
+ 965, 1, 970, 1, 1, 1, 971, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 970, 972, 973, 972, 972, 972, 972,
+ 972, 974, 1, 972, 972, 1, 972, 975,
+ 972, 972, 972, 972, 972, 972, 972, 972,
+ 972, 972, 972, 1, 1, 129, 972, 1,
+ 972, 1, 972, 972, 972, 972, 972, 972,
+ 972, 972, 972, 972, 972, 972, 972, 972,
+ 972, 972, 972, 972, 972, 972, 972, 972,
+ 972, 972, 972, 972, 976, 1, 1, 972,
+ 972, 972, 972, 972, 972, 972, 972, 972,
+ 972, 972, 972, 972, 972, 972, 972, 972,
+ 972, 972, 972, 972, 972, 972, 972, 972,
+ 972, 972, 972, 972, 972, 972, 972, 972,
+ 1, 977, 1, 970, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 970, 1, 978, 1, 1, 1,
+ 979, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 978, 972, 973, 972, 972,
+ 972, 972, 972, 980, 1, 972, 972, 981,
+ 972, 982, 972, 972, 972, 972, 972, 972,
+ 972, 972, 972, 972, 972, 1, 494, 139,
+ 972, 1, 972, 155, 972, 972, 972, 972,
+ 972, 972, 972, 972, 972, 972, 972, 972,
+ 972, 972, 972, 972, 972, 972, 972, 972,
+ 972, 972, 972, 972, 972, 972, 1, 1,
+ 1, 972, 972, 972, 972, 972, 972, 972,
+ 972, 972, 972, 972, 972, 972, 972, 972,
+ 972, 972, 972, 972, 972, 972, 972, 972,
+ 972, 972, 972, 972, 972, 972, 972, 972,
+ 972, 972, 1, 978, 1, 1, 1, 979,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 978, 143, 144, 143, 143, 143,
+ 143, 143, 980, 1, 143, 143, 981, 143,
+ 983, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 1, 494, 139, 143,
+ 1, 143, 155, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 1, 1, 1,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 1, 984, 1, 985, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 985, 1, 986, 1, 1,
+ 1, 987, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 986, 168, 169, 168,
+ 168, 168, 168, 168, 988, 1, 168, 168,
+ 989, 168, 990, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 1, 503,
+ 172, 168, 1, 168, 171, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 1,
+ 1, 1, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 1, 991, 1, 1, 1,
+ 992, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 991, 993, 144, 993, 993,
+ 993, 993, 993, 994, 1, 993, 993, 1,
+ 993, 155, 993, 993, 993, 993, 993, 993,
+ 993, 993, 993, 993, 993, 1, 1, 139,
+ 993, 1, 993, 155, 993, 993, 993, 993,
+ 993, 993, 993, 993, 993, 993, 993, 993,
+ 993, 993, 993, 993, 993, 993, 993, 993,
+ 993, 993, 993, 993, 993, 993, 1, 1,
+ 1, 993, 993, 993, 993, 993, 993, 993,
+ 993, 993, 993, 993, 993, 993, 993, 993,
+ 993, 993, 993, 993, 993, 993, 993, 993,
+ 993, 993, 993, 993, 993, 993, 993, 993,
+ 993, 993, 1, 995, 1, 1, 1, 996,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 995, 993, 144, 993, 993, 993,
+ 993, 993, 997, 1, 993, 993, 1, 993,
+ 1, 993, 993, 993, 993, 993, 993, 993,
+ 993, 993, 993, 993, 1, 1, 129, 993,
+ 1, 993, 1, 993, 993, 993, 993, 993,
+ 993, 993, 993, 993, 993, 993, 993, 993,
+ 993, 993, 993, 993, 993, 993, 993, 993,
+ 993, 993, 993, 993, 993, 1, 1, 1,
+ 993, 993, 993, 993, 993, 993, 993, 993,
+ 993, 993, 993, 993, 993, 993, 993, 993,
+ 993, 993, 993, 993, 993, 993, 993, 993,
+ 993, 993, 993, 993, 993, 993, 993, 993,
+ 993, 1, 998, 1, 995, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 995, 1, 978, 1, 1,
+ 1, 979, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 978, 993, 144, 993,
+ 993, 993, 993, 993, 980, 1, 993, 993,
+ 981, 993, 983, 993, 993, 993, 993, 993,
+ 993, 993, 993, 993, 993, 993, 1, 494,
+ 139, 993, 1, 993, 155, 993, 993, 993,
+ 993, 993, 993, 993, 993, 993, 993, 993,
+ 993, 993, 993, 993, 993, 993, 993, 993,
+ 993, 993, 993, 993, 993, 993, 993, 1,
+ 1, 1, 993, 993, 993, 993, 993, 993,
+ 993, 993, 993, 993, 993, 993, 993, 993,
+ 993, 993, 993, 993, 993, 993, 993, 993,
+ 993, 993, 993, 993, 993, 993, 993, 993,
+ 993, 993, 993, 1, 999, 1, 1, 1,
+ 1000, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 999, 1001, 169, 1001, 1001,
+ 1001, 1001, 1001, 1002, 1, 1001, 1001, 1,
+ 1001, 1, 1001, 1001, 1001, 1001, 1001, 1001,
+ 1001, 1001, 1001, 1001, 1001, 1, 1, 183,
+ 1001, 1, 1001, 1, 1001, 1001, 1001, 1001,
+ 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001,
+ 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001,
+ 1001, 1001, 1001, 1001, 1001, 1001, 1, 1,
+ 1, 1001, 1001, 1001, 1001, 1001, 1001, 1001,
+ 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001,
+ 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001,
+ 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001,
+ 1001, 1001, 1, 1003, 1003, 1003, 1003, 1003,
+ 1003, 1003, 1003, 1004, 1, 1003, 1003, 1005,
+ 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003,
+ 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003,
+ 1003, 1003, 1004, 1003, 159, 1003, 1003, 1003,
+ 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003,
+ 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003,
+ 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003,
+ 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003,
+ 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003,
+ 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003,
+ 1003, 1003, 1003, 1003, 1003, 1003, 1006, 1003,
+ 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003,
+ 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003,
+ 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003,
+ 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003,
+ 1003, 1003, 1, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1, 1007, 1007, 1008,
+ 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1009, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1007, 1007, 1010, 1007,
+ 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1007, 1, 1011, 1, 1007, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1007, 1, 1012, 1,
+ 1, 1, 1013, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1012, 1014, 973,
+ 1014, 1014, 1014, 1014, 1014, 1015, 1, 1014,
+ 1014, 981, 1014, 1016, 1014, 1014, 1014, 1014,
+ 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1,
+ 494, 139, 1014, 1, 1014, 155, 1014, 1014,
+ 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ 1, 1, 1, 1014, 1014, 1014, 1014, 1014,
+ 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ 1014, 1014, 1014, 1014, 1, 1012, 1, 1,
+ 1, 1013, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1012, 143, 144, 143,
+ 143, 143, 143, 143, 1015, 1, 143, 143,
+ 981, 143, 155, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 1, 494,
+ 139, 143, 1, 143, 155, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 1,
+ 1, 1, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 1, 1017, 1, 1018, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1018, 1, 1019,
+ 1, 1, 1, 1020, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1019, 168,
+ 169, 168, 168, 168, 168, 168, 1021, 1,
+ 168, 168, 989, 168, 171, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 1, 503, 172, 168, 1, 168, 171, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 1, 1, 1, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 1, 173, 1,
+ 1, 1, 174, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 173, 1014, 973,
+ 1014, 1014, 1014, 1014, 1014, 175, 1, 1014,
+ 1014, 1, 1014, 1016, 1014, 1014, 1014, 1014,
+ 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1,
+ 1, 139, 1014, 1, 1014, 155, 1014, 1014,
+ 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ 1, 1, 1, 1014, 1014, 1014, 1014, 1014,
+ 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
+ 1014, 1014, 1014, 1014, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1007, 1007, 1022, 1,
+ 1007, 1007, 1023, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1007, 1022, 1007, 163,
+ 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1010, 1007, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1007, 1007, 1007, 1007,
+ 1007, 1007, 1007, 1007, 1007, 1, 1024, 1,
+ 1022, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1022,
+ 1, 991, 1, 1, 1, 992, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 991, 972, 973, 972, 972, 972, 972, 972,
+ 994, 1, 972, 972, 1, 972, 1016, 972,
+ 972, 972, 972, 972, 972, 972, 972, 972,
+ 972, 972, 1, 1, 139, 972, 1, 972,
+ 155, 972, 972, 972, 972, 972, 972, 972,
+ 972, 972, 972, 972, 972, 972, 972, 972,
+ 972, 972, 972, 972, 972, 972, 972, 972,
+ 972, 972, 972, 1, 1, 1, 972, 972,
+ 972, 972, 972, 972, 972, 972, 972, 972,
+ 972, 972, 972, 972, 972, 972, 972, 972,
+ 972, 972, 972, 972, 972, 972, 972, 972,
+ 972, 972, 972, 972, 972, 972, 972, 1,
+ 1025, 1, 1, 1, 1026, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1025,
+ 1027, 1028, 1027, 1027, 1027, 1027, 1027, 1029,
+ 1, 1027, 1027, 1, 1027, 1030, 1027, 1027,
+ 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
+ 1027, 1, 1, 183, 1027, 1, 1027, 1,
+ 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
+ 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
+ 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
+ 1027, 1027, 1031, 1, 1, 1027, 1027, 1027,
+ 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
+ 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
+ 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
+ 1027, 1027, 1027, 1027, 1027, 1027, 1, 1032,
+ 1033, 1032, 1032, 1032, 1032, 1032, 1, 1,
+ 1032, 1032, 1, 1032, 975, 1032, 1032, 1032,
+ 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032,
+ 1, 1, 1, 1032, 1, 1032, 1, 1032,
+ 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032,
+ 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032,
+ 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032,
+ 1032, 1, 1, 1, 1032, 1032, 1032, 1032,
+ 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032,
+ 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032,
+ 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032,
+ 1032, 1032, 1032, 1032, 1032, 1, 1034, 1,
+ 1, 1, 1035, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1034, 1032, 1033,
+ 1032, 1032, 1032, 1032, 1032, 1036, 1, 1032,
+ 1032, 981, 1032, 975, 1032, 1032, 1032, 1032,
+ 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1,
+ 494, 1, 1032, 1, 1032, 1, 1032, 1032,
+ 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032,
+ 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032,
+ 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032,
+ 1, 1, 1, 1032, 1032, 1032, 1032, 1032,
+ 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032,
+ 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032,
+ 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032,
+ 1032, 1032, 1032, 1032, 1, 1034, 1, 1,
+ 1, 1035, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1034, 1, 1, 1,
+ 1, 1, 1, 1, 1036, 1, 1, 1,
+ 981, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 494,
+ 1, 1037, 1, 1034, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1034, 1, 1038, 1, 1, 1,
+ 1039, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1038, 1, 1, 1, 1,
+ 1, 1, 1, 1040, 1, 1, 1, 989,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 503, 1,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041,
+ 1033, 1, 1041, 1041, 1042, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1033,
+ 1041, 1, 1041, 1041, 1041, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1043, 1041, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041,
+ 1041, 1, 1041, 1041, 1044, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041,
+ 1041, 1032, 1041, 1041, 1041, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1043, 1041, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041,
+ 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1,
+ 1045, 1, 1041, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1041, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1041, 1046, 1, 1033, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1033, 1, 976,
+ 976, 976, 976, 976, 976, 976, 976, 976,
+ 1, 976, 976, 1047, 976, 976, 976, 976,
+ 976, 976, 976, 976, 976, 976, 976, 976,
+ 976, 976, 976, 976, 976, 976, 976, 976,
+ 976, 976, 976, 976, 976, 976, 976, 976,
+ 976, 976, 976, 976, 976, 976, 976, 976,
+ 976, 976, 976, 976, 976, 976, 976, 976,
+ 976, 976, 976, 976, 976, 976, 976, 976,
+ 976, 976, 976, 976, 976, 976, 976, 976,
+ 976, 976, 976, 976, 976, 976, 976, 976,
+ 976, 976, 976, 976, 976, 976, 976, 976,
+ 976, 1, 1048, 1034, 976, 976, 976, 976,
+ 976, 976, 976, 976, 976, 976, 976, 976,
+ 976, 976, 976, 976, 976, 976, 976, 976,
+ 976, 976, 976, 976, 976, 976, 976, 976,
+ 976, 976, 976, 976, 976, 976, 1, 1049,
+ 1, 976, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 976, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 976, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1, 1050, 1050, 1051,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1052, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1053, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
+ 1050, 1050, 1, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1, 1054, 1054, 1055,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1056, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1057, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1, 1058, 1, 1054, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1054, 1, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054,
+ 1054, 1054, 1054, 1054, 1054, 1054, 1, 1059,
+ 1, 1, 1, 1060, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1059, 1061,
+ 1062, 1061, 1061, 1061, 1061, 1061, 1063, 1,
+ 1061, 1061, 1, 1061, 1, 1061, 1061, 1061,
+ 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
+ 1, 1, 183, 1061, 1, 1061, 1, 1061,
+ 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
+ 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
+ 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
+ 1061, 1, 1, 1, 1061, 1061, 1061, 1061,
+ 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
+ 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
+ 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
+ 1061, 1061, 1061, 1061, 1061, 1, 1064, 1,
+ 1, 1, 1065, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1064, 262, 134,
+ 262, 262, 262, 262, 262, 1066, 1, 262,
+ 262, 136, 262, 1067, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 1,
+ 138, 139, 262, 1, 262, 140, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 1, 1, 1, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 1, 1068, 1, 1,
+ 1, 1069, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1068, 143, 144, 143,
+ 143, 143, 143, 143, 1070, 1, 143, 143,
+ 146, 143, 155, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 1, 148,
+ 139, 143, 1, 143, 149, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 1,
+ 1, 1, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 1, 1071, 1, 1072, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1072, 1, 1073,
+ 1, 1, 1, 1074, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1073, 168,
+ 169, 168, 168, 168, 168, 168, 1075, 1,
+ 168, 168, 1076, 168, 171, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 1, 590, 172, 168, 1, 168, 1077, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 1, 1, 1, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 1, 1078, 1078,
+ 1078, 1078, 1078, 1078, 1078, 1078, 1079, 1,
+ 1078, 1078, 1080, 1078, 1078, 1078, 1078, 1078,
+ 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078,
+ 1078, 1078, 1078, 1078, 1078, 1079, 1078, 159,
+ 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078,
+ 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078,
+ 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078,
+ 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078,
+ 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078,
+ 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078,
+ 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078,
+ 1078, 1081, 1078, 1078, 1078, 1078, 1078, 1078,
+ 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078,
+ 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078,
+ 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078,
+ 1078, 1078, 1078, 1078, 1078, 1, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1,
+ 1082, 1082, 1083, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1084,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1085, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1, 1086, 1,
+ 1082, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1082,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1087, 1, 1082, 1082, 1088, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1087, 1082, 163, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1085, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1, 1089, 1, 1087, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1087, 1, 1090, 1, 1,
+ 1, 1091, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1090, 262, 134, 262,
+ 262, 262, 262, 262, 1092, 1, 262, 262,
+ 136, 262, 1067, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 1, 138,
+ 139, 262, 1, 262, 140, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 1,
+ 1, 1, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 1, 1093, 1, 1, 1,
+ 1094, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1093, 143, 144, 143, 143,
+ 143, 143, 143, 1095, 1, 143, 143, 146,
+ 143, 1, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 1, 148, 129,
+ 143, 1, 143, 1096, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 1, 1,
+ 1, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 1, 1097, 1, 1093, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1093, 1, 1098, 1,
+ 1, 1, 1099, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1098, 168, 169,
+ 168, 168, 168, 168, 168, 1100, 1, 168,
+ 168, 1076, 168, 1, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 1,
+ 590, 183, 168, 1, 168, 1101, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 1, 1, 1, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 1, 1102, 1, 1,
+ 1, 1103, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1102, 1104, 1105, 1104,
+ 1104, 1104, 1104, 1104, 1106, 1, 1104, 1104,
+ 1, 1104, 1107, 1104, 1104, 1104, 1104, 1104,
+ 1104, 1104, 1104, 1104, 1104, 1104, 1, 1,
+ 1, 1104, 1, 1104, 1, 1104, 1104, 1104,
+ 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104,
+ 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104,
+ 1104, 1104, 1104, 1104, 1104, 1104, 1104, 969,
+ 1, 1, 1104, 1104, 1104, 1104, 1104, 1104,
+ 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104,
+ 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104,
+ 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104,
+ 1104, 1104, 1104, 1, 1108, 1, 1, 1,
+ 1109, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1108, 1110, 1033, 1110, 1110,
+ 1110, 1110, 1110, 1111, 1, 1110, 1110, 1,
+ 1110, 975, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1, 1, 1,
+ 1110, 1, 1110, 1, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 976, 1,
+ 1, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1, 1112, 1, 1108, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1108, 1, 1113, 1,
+ 1, 1, 1114, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1113, 1110, 1033,
+ 1110, 1110, 1110, 1110, 1110, 1115, 1, 1110,
+ 1110, 981, 1110, 1116, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1,
+ 494, 1, 1110, 1, 1110, 1, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1, 1, 1, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1, 1113, 1, 1,
+ 1, 1114, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1113, 1, 1, 1,
+ 1, 1, 1, 1, 1115, 1, 1, 1,
+ 981, 1, 1117, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 494,
+ 1, 1118, 1, 1113, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1113, 1, 1119, 1, 1, 1,
+ 1120, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1119, 1, 1, 1, 1,
+ 1, 1, 1, 1121, 1, 1, 1, 989,
+ 1, 1122, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 503, 1,
+ 1117, 1, 1, 1, 1123, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1117,
+ 1124, 1, 1124, 1124, 1124, 1124, 1124, 1125,
+ 1, 1124, 1124, 1, 1124, 1, 1124, 1124,
+ 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124,
+ 1124, 1, 1, 1, 1124, 1, 1124, 1,
+ 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124,
+ 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124,
+ 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124,
+ 1124, 1124, 1, 1, 1, 1124, 1124, 1124,
+ 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124,
+ 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124,
+ 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124,
+ 1124, 1124, 1124, 1124, 1124, 1124, 1, 1126,
+ 1, 1117, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1117, 1, 1113, 1, 1, 1, 1114, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1113, 1124, 1, 1124, 1124, 1124, 1124,
+ 1124, 1115, 1, 1124, 1124, 981, 1124, 1117,
+ 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124,
+ 1124, 1124, 1124, 1, 494, 1, 1124, 1,
+ 1124, 1, 1124, 1124, 1124, 1124, 1124, 1124,
+ 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124,
+ 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124,
+ 1124, 1124, 1124, 1124, 1, 1, 1, 1124,
+ 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124,
+ 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124,
+ 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124,
+ 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124,
+ 1, 1122, 1, 1, 1, 1127, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1122, 1128, 1, 1128, 1128, 1128, 1128, 1128,
+ 1129, 1, 1128, 1128, 1, 1128, 1, 1128,
+ 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128,
+ 1128, 1128, 1, 1, 1, 1128, 1, 1128,
+ 1, 1128, 1128, 1128, 1128, 1128, 1128, 1128,
+ 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128,
+ 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128,
+ 1128, 1128, 1128, 1, 1, 1, 1128, 1128,
+ 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128,
+ 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128,
+ 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128,
+ 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1,
+ 1117, 1, 1, 1, 1123, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1117,
+ 1110, 1033, 1110, 1110, 1110, 1110, 1110, 1125,
+ 1, 1110, 1110, 1, 1110, 975, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1, 1, 1, 1110, 1, 1110, 1,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1, 1, 1, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1110, 1110, 1110, 1110, 1110, 1, 1130,
+ 1, 1, 1, 1131, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1130, 1132,
+ 1133, 1132, 1132, 1132, 1132, 1132, 1134, 1,
+ 1132, 1132, 1, 1132, 1030, 1132, 1132, 1132,
+ 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132,
+ 1, 1, 1, 1132, 1, 1132, 1, 1132,
+ 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132,
+ 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132,
+ 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132,
+ 1132, 1031, 1, 1, 1132, 1132, 1132, 1132,
+ 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132,
+ 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132,
+ 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132,
+ 1132, 1132, 1132, 1132, 1132, 1, 1135, 1,
+ 1, 1, 1136, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1135, 133, 1137,
+ 133, 133, 133, 133, 133, 1138, 1, 133,
+ 133, 136, 133, 1067, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 1,
+ 138, 139, 133, 1, 133, 140, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133,
+ 1, 1, 1, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 133, 1, 1139, 1, 1,
+ 1, 1140, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1139, 284, 285, 284,
+ 284, 284, 284, 284, 1141, 1, 284, 284,
+ 146, 284, 1, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 284, 284, 1, 148,
+ 129, 284, 1, 284, 1096, 284, 284, 284,
+ 284, 284, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 284, 284, 284, 1,
+ 1, 1, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 284, 284, 284, 284, 284,
+ 284, 284, 284, 1, 1142, 1, 1139, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1139, 1, 1143,
+ 1, 1, 1, 1144, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1143, 1061,
+ 1062, 1061, 1061, 1061, 1061, 1061, 1145, 1,
+ 1061, 1061, 1076, 1061, 1, 1061, 1061, 1061,
+ 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
+ 1, 590, 183, 1061, 1, 1061, 1101, 1061,
+ 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
+ 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
+ 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
+ 1061, 1, 1, 1, 1061, 1061, 1061, 1061,
+ 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
+ 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
+ 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
+ 1061, 1061, 1061, 1061, 1061, 1, 1146, 1146,
+ 1146, 1146, 1146, 1146, 1146, 1146, 1147, 1,
+ 1146, 1146, 1148, 1146, 1146, 1146, 1146, 1146,
+ 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146,
+ 1146, 1146, 1146, 1146, 1146, 1147, 1146, 1052,
+ 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146,
+ 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146,
+ 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146,
+ 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146,
+ 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146,
+ 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146,
+ 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146,
+ 1146, 1149, 1146, 1146, 1146, 1146, 1146, 1146,
+ 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146,
+ 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146,
+ 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146,
+ 1146, 1146, 1146, 1146, 1146, 1, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1,
+ 1150, 1150, 1151, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1152,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1153, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1, 1154, 1,
+ 1150, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1150,
+ 1, 131, 1, 1, 1, 132, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 131, 262, 134, 262, 262, 262, 262, 262,
+ 135, 1, 262, 262, 136, 262, 137, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 1, 138, 139, 262, 1, 262,
+ 140, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 1, 1, 1, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 1,
+ 1155, 1, 1, 1, 1156, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1155,
+ 168, 169, 168, 168, 168, 168, 168, 1157,
+ 1, 168, 168, 1076, 168, 279, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 1, 590, 172, 168, 1, 168, 1077,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 1, 1, 1, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 1, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1158, 1, 1150, 1150, 1159, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1158,
+ 1150, 1056, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1153, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150,
+ 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1,
+ 1160, 1, 1158, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1158, 1, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 1, 255, 255, 255, 255,
+ 255, 255, 255, 255, 1161, 1, 255, 255,
+ 1162, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 1161, 255, 1163, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 258,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 255, 255, 255, 255, 255,
+ 255, 255, 255, 1, 1164, 1, 1161, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1161, 1, 1165,
+ 1, 1, 1, 1166, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1165, 143,
+ 144, 143, 143, 143, 143, 143, 1167, 1,
+ 143, 143, 1168, 143, 147, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 1, 683, 139, 143, 1, 143, 1169, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 1, 1, 1, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 1, 1170, 1,
+ 1171, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1171,
+ 1, 1172, 1, 1, 1, 1173, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1172, 168, 169, 168, 168, 168, 168, 168,
+ 1174, 1, 168, 168, 1175, 168, 279, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 1, 691, 172, 168, 1, 168,
+ 1176, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 1, 1, 1, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 168, 168, 1,
+ 1177, 1, 1, 1, 1178, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1177,
+ 1179, 1180, 1179, 1179, 1179, 1179, 1179, 1181,
+ 1, 1179, 1179, 1182, 1179, 1183, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1, 1184, 183, 1179, 1, 1179, 1,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1, 1, 1, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1, 1185,
+ 1, 1, 1, 1186, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1185, 1187,
+ 1188, 1187, 1187, 1187, 1187, 1187, 1189, 1,
+ 1187, 1187, 245, 1187, 1190, 1187, 1187, 1187,
+ 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187,
+ 1, 120, 1191, 1187, 1, 1187, 1192, 1187,
+ 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187,
+ 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187,
+ 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187,
+ 1187, 1, 1, 1, 1187, 1187, 1187, 1187,
+ 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187,
+ 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187,
+ 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187,
+ 1187, 1187, 1187, 1187, 1187, 1, 1193, 1,
+ 1, 1, 1194, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1193, 1195, 1196,
+ 1195, 1195, 1195, 1195, 1195, 1197, 1, 1195,
+ 1195, 245, 1195, 1198, 1195, 1195, 1195, 1195,
+ 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1,
+ 120, 1199, 1195, 1, 1195, 1, 1195, 1195,
+ 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
+ 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
+ 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
+ 1, 1, 1, 1195, 1195, 1195, 1195, 1195,
+ 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
+ 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
+ 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
+ 1195, 1195, 1195, 1195, 1, 1200, 1, 1193,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1193, 1,
+ 1201, 1, 1, 1, 1202, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1201,
+ 1203, 1204, 1203, 1203, 1203, 1203, 1203, 1205,
+ 1, 1203, 1203, 1206, 1203, 1207, 1203, 1203,
+ 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203,
+ 1203, 1, 1208, 1209, 1203, 1, 1203, 1210,
+ 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203,
+ 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203,
+ 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203,
+ 1203, 1203, 1, 1, 1, 1203, 1203, 1203,
+ 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203,
+ 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203,
+ 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203,
+ 1203, 1203, 1203, 1203, 1203, 1203, 1, 1211,
+ 1, 1, 1, 1212, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1211, 1213,
+ 1214, 1213, 1213, 1213, 1213, 1213, 1215, 1,
+ 1213, 1213, 1216, 1213, 1217, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1, 1218, 1209, 1213, 1, 1213, 1219, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1, 1, 1, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1, 1220, 1,
+ 1221, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1221,
+ 1, 1222, 1, 1, 1, 1223, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1222, 1213, 1214, 1213, 1213, 1213, 1213, 1213,
+ 1224, 1, 1213, 1213, 1, 1213, 1225, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1, 1, 1209, 1213, 1, 1213,
+ 1225, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1, 1, 1, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1,
+ 1226, 1, 1213, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1213, 1, 1227, 1227, 1227, 1227, 1227,
+ 1227, 1227, 1227, 1227, 1, 1227, 1227, 1228,
+ 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227,
+ 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227,
+ 1227, 1227, 1227, 1227, 1229, 1227, 1227, 1227,
+ 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227,
+ 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227,
+ 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227,
+ 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227,
+ 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227,
+ 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227,
+ 1227, 1227, 1227, 1227, 1227, 1227, 1230, 1227,
+ 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227,
+ 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227,
+ 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227,
+ 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227,
+ 1227, 1227, 1, 1231, 1231, 1231, 1231, 1231,
+ 1231, 1231, 1231, 1231, 1, 1231, 1231, 1232,
+ 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231,
+ 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231,
+ 1231, 1231, 1231, 1231, 1233, 1231, 1231, 1231,
+ 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231,
+ 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231,
+ 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231,
+ 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231,
+ 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231,
+ 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231,
+ 1231, 1231, 1231, 1231, 1231, 1231, 1234, 1231,
+ 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231,
+ 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231,
+ 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231,
+ 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231,
+ 1231, 1231, 1, 1235, 1, 1231, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1231, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1231, 1236,
+ 1, 1, 1, 1237, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1236, 1238,
+ 1239, 1238, 1238, 1238, 1238, 1238, 1240, 1,
+ 1238, 1238, 1, 1238, 1241, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1, 1, 1242, 1238, 1, 1238, 1241, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1, 1, 1, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1, 1243, 1,
+ 1, 1, 1244, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1243, 1213, 1214,
+ 1213, 1213, 1213, 1213, 1213, 1245, 1, 1213,
+ 1213, 1, 1213, 1225, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1,
+ 1, 1209, 1213, 1, 1213, 1225, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1, 1, 1, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1, 1246, 1, 1,
+ 1, 1247, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1246, 1213, 1214, 1213,
+ 1213, 1213, 1213, 1213, 1248, 1, 1213, 1213,
+ 1, 1213, 1, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1, 1,
+ 1199, 1213, 1, 1213, 1, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1,
+ 1, 1, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1, 1249, 1, 1246, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1246, 1, 1250,
+ 1, 1, 1, 1251, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1250, 1238,
+ 1239, 1238, 1238, 1238, 1238, 1238, 1252, 1,
+ 1238, 1238, 1, 1238, 1, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1, 1, 1253, 1238, 1, 1238, 1, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1, 1, 1, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1, 1254, 1,
+ 1, 1, 1255, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1254, 1256, 1257,
+ 1256, 1256, 1256, 1256, 1256, 1258, 1, 1256,
+ 1256, 1259, 1256, 1260, 1256, 1256, 1256, 1256,
+ 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1,
+ 1, 1, 1256, 1, 1256, 1261, 1256, 1256,
+ 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256,
+ 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256,
+ 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256,
+ 1, 1, 1, 1256, 1256, 1256, 1256, 1256,
+ 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256,
+ 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256,
+ 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256,
+ 1256, 1256, 1256, 1256, 1, 1262, 1, 1,
+ 1, 1263, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1262, 1256, 1257, 1256,
+ 1256, 1256, 1256, 1256, 1264, 1, 1256, 1256,
+ 1265, 1256, 1260, 1256, 1256, 1256, 1256, 1256,
+ 1256, 1256, 1256, 1256, 1256, 1256, 1, 1,
+ 1, 1256, 1, 1256, 1266, 1256, 1256, 1256,
+ 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256,
+ 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256,
+ 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1,
+ 1, 1, 1256, 1256, 1256, 1256, 1256, 1256,
+ 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256,
+ 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256,
+ 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256,
+ 1256, 1256, 1256, 1, 1267, 1, 1262, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1262, 1, 1268,
+ 1, 1, 1, 1269, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1268, 1270,
+ 1271, 1270, 1270, 1270, 1270, 1270, 1272, 1,
+ 1270, 1270, 1, 1270, 1273, 1270, 1270, 1270,
+ 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270,
+ 1, 1, 1, 1270, 1274, 1270, 1275, 1270,
+ 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270,
+ 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270,
+ 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270,
+ 1270, 1, 1, 1, 1270, 1270, 1270, 1270,
+ 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270,
+ 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270,
+ 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270,
+ 1270, 1270, 1270, 1270, 1270, 1, 1276, 1,
+ 1, 1, 1277, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1276, 1, 1,
+ 1, 1, 1, 1, 1, 1278, 1, 1,
+ 1, 1, 1, 1279, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1280, 1, 1281, 1, 1282,
+ 1, 1276, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1276, 1, 1283, 1, 1, 1, 1284, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1283, 1, 1, 1, 1, 1, 1,
+ 1, 1285, 1, 1, 1, 1, 1, 1286,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1287,
+ 1, 1288, 1, 1279, 1, 1, 1, 1289,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1279, 1290, 1291, 1290, 1290, 1290,
+ 1290, 1290, 1292, 1, 1290, 1290, 1, 1290,
+ 1, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1, 1, 1, 1290,
+ 1, 1290, 1, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1290, 1, 1, 1,
+ 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1, 1293, 1, 1279, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1279, 1, 1294, 1, 1,
+ 1, 1295, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1294, 1290, 1, 1290,
+ 1290, 1290, 1290, 1290, 1296, 1, 1290, 1290,
+ 1, 1290, 1279, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1290, 1290, 1, 1,
+ 1, 1290, 1280, 1290, 1297, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1,
+ 1, 1, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1, 1294, 1, 1, 1,
+ 1295, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1294, 1, 1, 1, 1,
+ 1, 1, 1, 1296, 1, 1, 1, 1,
+ 1, 1279, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1280, 1, 1297, 1, 1298, 1, 1294,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1294, 1,
+ 1299, 1, 1, 1, 1300, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1299,
+ 1, 1, 1, 1, 1, 1, 1, 1301,
+ 1, 1, 1, 1, 1, 1286, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1287, 1, 1302,
+ 1, 1280, 1, 1, 1, 1303, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1280, 1, 1, 1, 1, 1, 1, 1,
+ 1304, 1, 1, 1, 1305, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1306, 1, 1307, 1, 1280,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1280, 1,
+ 1287, 1, 1, 1, 1308, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1287,
+ 1, 1, 1, 1, 1, 1, 1, 1309,
+ 1, 1, 1, 1310, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1311, 1, 1312, 1, 120, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 120, 1, 1313,
+ 1, 1, 1, 1314, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1313, 1315,
+ 1316, 1315, 1315, 1315, 1315, 1315, 1317, 1,
+ 1315, 1315, 1, 1315, 1318, 1315, 1315, 1315,
+ 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315,
+ 1, 1, 1, 1315, 1, 1315, 1, 1315,
+ 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315,
+ 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315,
+ 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315,
+ 1315, 1319, 1, 1, 1315, 1315, 1315, 1315,
+ 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315,
+ 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315,
+ 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315,
+ 1315, 1315, 1315, 1315, 1315, 1, 1320, 1,
+ 1, 1, 1321, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1320, 1322, 1323,
+ 1322, 1322, 1322, 1322, 1322, 1324, 1, 1322,
+ 1322, 1, 1322, 1325, 1322, 1322, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1,
+ 1, 1, 1322, 1, 1322, 1, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
+ 1326, 1, 1, 1322, 1322, 1322, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1, 1327, 1, 1320,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1320, 1,
+ 1328, 1, 1, 1, 1329, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1328,
+ 1322, 1323, 1322, 1322, 1322, 1322, 1322, 1330,
+ 1, 1322, 1322, 1, 1322, 1331, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
+ 1322, 1, 1, 1, 1322, 1332, 1322, 1,
+ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
+ 1322, 1322, 1, 1, 1, 1322, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1322, 1322, 1, 1328,
+ 1, 1, 1, 1329, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1328, 1,
+ 1, 1, 1, 1, 1, 1, 1330, 1,
+ 1, 1, 1, 1, 1333, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1332, 1, 1334, 1,
+ 1328, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1328,
+ 1, 1335, 1, 1, 1, 1336, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1335, 1, 1, 1, 1, 1, 1, 1,
+ 1337, 1, 1, 1, 1, 1, 1338, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1339, 1,
+ 1333, 1, 1, 1, 1340, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1333,
+ 1341, 1, 1341, 1341, 1341, 1341, 1341, 1342,
+ 1, 1341, 1341, 1, 1341, 1, 1341, 1341,
+ 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341,
+ 1341, 1, 1, 1, 1341, 1, 1341, 1,
+ 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341,
+ 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341,
+ 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341,
+ 1341, 1341, 1, 1, 1, 1341, 1341, 1341,
+ 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341,
+ 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341,
+ 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341,
+ 1341, 1341, 1341, 1341, 1341, 1341, 1, 1343,
+ 1, 1333, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1333, 1, 1328, 1, 1, 1, 1329, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1328, 1341, 1, 1341, 1341, 1341, 1341,
+ 1341, 1330, 1, 1341, 1341, 1, 1341, 1333,
+ 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341,
+ 1341, 1341, 1341, 1, 1, 1, 1341, 1332,
+ 1341, 1, 1341, 1341, 1341, 1341, 1341, 1341,
+ 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341,
+ 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341,
+ 1341, 1341, 1341, 1341, 1, 1, 1, 1341,
+ 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341,
+ 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341,
+ 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341,
+ 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341,
+ 1, 1338, 1, 1, 1, 1344, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1338, 1345, 1, 1345, 1345, 1345, 1345, 1345,
+ 1346, 1, 1345, 1345, 1, 1345, 1, 1345,
+ 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345,
+ 1345, 1345, 1, 1, 1, 1345, 1, 1345,
+ 1, 1345, 1345, 1345, 1345, 1345, 1345, 1345,
+ 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345,
+ 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345,
+ 1345, 1345, 1345, 1, 1, 1, 1345, 1345,
+ 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345,
+ 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345,
+ 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345,
+ 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347,
+ 1323, 1, 1347, 1347, 1348, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1323,
+ 1347, 1, 1347, 1347, 1347, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1349, 1347, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347,
+ 1347, 1, 1347, 1347, 1350, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347,
+ 1347, 1351, 1347, 1347, 1347, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1349, 1347, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347,
+ 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1,
+ 1352, 1, 1347, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1347, 1, 1353, 1, 1, 1, 1354,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1353, 1351, 1323, 1351, 1351, 1351,
+ 1351, 1351, 1355, 1, 1351, 1351, 1, 1351,
+ 1325, 1351, 1351, 1351, 1351, 1351, 1351, 1351,
+ 1351, 1351, 1351, 1351, 1, 1, 1, 1351,
+ 1332, 1351, 1, 1351, 1351, 1351, 1351, 1351,
+ 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351,
+ 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351,
+ 1351, 1351, 1351, 1351, 1351, 1, 1, 1,
+ 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351,
+ 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351,
+ 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351,
+ 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351,
+ 1351, 1, 1353, 1, 1, 1, 1354, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1353, 1, 1, 1, 1, 1, 1,
+ 1, 1355, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1332,
+ 1, 1356, 1, 1353, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1353, 1, 1357, 1, 1, 1,
+ 1358, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1357, 1, 1, 1, 1,
+ 1, 1, 1, 1359, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1339, 1, 1351, 1323, 1351, 1351, 1351,
+ 1351, 1351, 1, 1, 1351, 1351, 1, 1351,
+ 1325, 1351, 1351, 1351, 1351, 1351, 1351, 1351,
+ 1351, 1351, 1351, 1351, 1, 1, 1, 1351,
+ 1, 1351, 1, 1351, 1351, 1351, 1351, 1351,
+ 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351,
+ 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351,
+ 1351, 1351, 1351, 1351, 1351, 1, 1, 1,
+ 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351,
+ 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351,
+ 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351,
+ 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351,
+ 1351, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1347, 1360, 1, 1323, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1323, 1, 1333, 1,
+ 1, 1, 1340, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1333, 1322, 1323,
+ 1322, 1322, 1322, 1322, 1322, 1342, 1, 1322,
+ 1322, 1, 1322, 1325, 1322, 1322, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1,
+ 1, 1, 1322, 1, 1322, 1, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
+ 1, 1, 1, 1322, 1322, 1322, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322,
+ 1322, 1322, 1322, 1322, 1, 1361, 1, 1,
+ 1, 1362, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1361, 1363, 1364, 1363,
+ 1363, 1363, 1363, 1363, 1365, 1, 1363, 1363,
+ 1, 1363, 1366, 1363, 1363, 1363, 1363, 1363,
+ 1363, 1363, 1363, 1363, 1363, 1363, 1, 1,
+ 1, 1363, 1, 1363, 1, 1363, 1363, 1363,
+ 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363,
+ 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363,
+ 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1367,
+ 1, 1, 1363, 1363, 1363, 1363, 1363, 1363,
+ 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363,
+ 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363,
+ 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363,
+ 1363, 1363, 1363, 1, 1326, 1326, 1326, 1326,
+ 1326, 1326, 1326, 1326, 1326, 1, 1326, 1326,
+ 1368, 1326, 1326, 1326, 1326, 1326, 1326, 1326,
+ 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326,
+ 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326,
+ 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326,
+ 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326,
+ 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326,
+ 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326,
+ 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326,
+ 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326,
+ 1326, 1326, 1326, 1326, 1326, 1326, 1, 1369,
+ 1353, 1326, 1326, 1326, 1326, 1326, 1326, 1326,
+ 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326,
+ 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326,
+ 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326,
+ 1326, 1326, 1326, 1, 1370, 1, 1326, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1326, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1326,
+ 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371,
+ 1371, 1, 1371, 1371, 1372, 1371, 1371, 1371,
+ 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371,
+ 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371,
+ 1371, 1373, 1371, 1371, 1371, 1371, 1371, 1371,
+ 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371,
+ 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371,
+ 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371,
+ 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371,
+ 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371,
+ 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371,
+ 1371, 1371, 1371, 1374, 1371, 1371, 1371, 1371,
+ 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371,
+ 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371,
+ 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371,
+ 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1,
+ 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
+ 1375, 1, 1375, 1375, 1376, 1375, 1375, 1375,
+ 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
+ 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
+ 1375, 1377, 1375, 1375, 1375, 1375, 1375, 1375,
+ 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
+ 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
+ 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
+ 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
+ 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
+ 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
+ 1375, 1375, 1375, 1378, 1375, 1375, 1375, 1375,
+ 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
+ 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
+ 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375,
+ 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1,
+ 1379, 1, 1375, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1375, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1375, 1286, 1, 1, 1,
+ 1380, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1286, 1381, 1382, 1381, 1381,
+ 1381, 1381, 1381, 1383, 1, 1381, 1381, 1,
+ 1381, 1, 1381, 1381, 1381, 1381, 1381, 1381,
+ 1381, 1381, 1381, 1381, 1381, 1, 1, 1,
+ 1381, 1, 1381, 1, 1381, 1381, 1381, 1381,
+ 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381,
+ 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381,
+ 1381, 1381, 1381, 1381, 1381, 1381, 1, 1,
+ 1, 1381, 1381, 1381, 1381, 1381, 1381, 1381,
+ 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381,
+ 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381,
+ 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381,
+ 1381, 1381, 1, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1271, 1, 1384, 1384, 1385,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1271, 1384, 1, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1386, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1, 1384, 1384, 1387,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1388, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1386, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1, 1389, 1, 1384, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1384, 1, 1390, 1,
+ 1, 1, 1391, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1390, 1388, 1271,
+ 1388, 1388, 1388, 1388, 1388, 1392, 1, 1388,
+ 1388, 1, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1,
+ 1, 1, 1388, 1274, 1388, 1275, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1, 1, 1, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1, 1393, 1, 1,
+ 1, 1394, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1393, 1, 1, 1,
+ 1, 1, 1, 1, 1395, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1280, 1, 1281, 1, 1396, 1,
+ 1393, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1393,
+ 1, 1397, 1, 1, 1, 1398, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1397, 1, 1, 1, 1, 1, 1, 1,
+ 1399, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1287, 1,
+ 1288, 1, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384,
+ 1384, 1384, 1, 1400, 1, 1271, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1271, 1, 1401, 1,
+ 1, 1, 1402, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1401, 1270, 1403,
+ 1270, 1270, 1270, 1270, 1270, 1404, 1, 1270,
+ 1270, 1, 1270, 1388, 1270, 1270, 1270, 1270,
+ 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1,
+ 1, 1, 1270, 1274, 1270, 1275, 1270, 1270,
+ 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270,
+ 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270,
+ 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270,
+ 1, 1, 1, 1270, 1270, 1270, 1270, 1270,
+ 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270,
+ 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270,
+ 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270,
+ 1270, 1270, 1270, 1270, 1, 1405, 1, 1,
+ 1, 1406, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1405, 1290, 1291, 1290,
+ 1290, 1290, 1290, 1290, 1407, 1, 1290, 1290,
+ 1, 1290, 1, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1290, 1290, 1, 1,
+ 1, 1290, 1280, 1290, 1281, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1,
+ 1, 1, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+ 1290, 1290, 1290, 1, 1408, 1, 1405, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1405, 1, 1409,
+ 1, 1, 1, 1410, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1409, 1381,
+ 1382, 1381, 1381, 1381, 1381, 1381, 1411, 1,
+ 1381, 1381, 1, 1381, 1, 1381, 1381, 1381,
+ 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381,
+ 1, 1, 1, 1381, 1287, 1381, 1288, 1381,
+ 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381,
+ 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381,
+ 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381,
+ 1381, 1, 1, 1, 1381, 1381, 1381, 1381,
+ 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381,
+ 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381,
+ 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381,
+ 1381, 1381, 1381, 1381, 1381, 1, 1412, 1412,
+ 1412, 1412, 1412, 1412, 1412, 1412, 1413, 1,
+ 1412, 1412, 1414, 1412, 1412, 1412, 1412, 1412,
+ 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+ 1412, 1412, 1412, 1412, 1412, 1413, 1412, 1373,
+ 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+ 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+ 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+ 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+ 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+ 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+ 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+ 1412, 1415, 1412, 1412, 1412, 1412, 1412, 1412,
+ 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+ 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+ 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+ 1412, 1412, 1412, 1412, 1412, 1, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1,
+ 1416, 1416, 1417, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1418,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1419, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1, 1420, 1,
+ 1416, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1416,
+ 1, 1268, 1, 1, 1, 1269, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1268, 1388, 1271, 1388, 1388, 1388, 1388, 1388,
+ 1272, 1, 1388, 1388, 1, 1388, 1273, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1, 1, 1, 1388, 1274, 1388,
+ 1275, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1, 1, 1, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1421, 1, 1416, 1416, 1422, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1421, 1416, 1377, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1419, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416,
+ 1, 1423, 1, 1421, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1421, 1, 1424, 1424, 1424, 1424,
+ 1424, 1424, 1424, 1424, 1425, 1, 1424, 1424,
+ 1426, 1424, 1424, 1424, 1424, 1424, 1424, 1424,
+ 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424,
+ 1424, 1424, 1424, 1425, 1424, 1427, 1424, 1424,
+ 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424,
+ 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424,
+ 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424,
+ 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424,
+ 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424,
+ 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424,
+ 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1428,
+ 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424,
+ 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424,
+ 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424,
+ 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424,
+ 1424, 1424, 1424, 1, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1429, 1, 1429, 1429,
+ 1430, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1429, 1431, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1432,
+ 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1, 1433, 1, 1429, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1429, 1, 1434,
+ 1, 1, 1, 1435, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1434, 1388,
+ 1271, 1388, 1388, 1388, 1388, 1388, 1436, 1,
+ 1388, 1388, 1, 1388, 1273, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1, 1, 1, 1388, 1274, 1388, 1437, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1, 1, 1, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1, 1438, 1,
+ 1, 1, 1439, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1438, 1, 1,
+ 1, 1, 1, 1, 1, 1440, 1, 1,
+ 1, 1, 1, 1279, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1280, 1, 1441, 1, 1442,
+ 1, 1438, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1438, 1, 1443, 1, 1, 1, 1444, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1443, 1, 1, 1, 1, 1, 1,
+ 1, 1445, 1, 1, 1, 1, 1, 1286,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1287,
+ 1, 1446, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1447, 1, 1429, 1429,
+ 1448, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1447, 1429, 1449, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1432,
+ 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429,
+ 1429, 1429, 1429, 1, 1450, 1, 1447, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1447, 1, 1451,
+ 1, 1, 1, 1452, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1451, 1,
+ 1, 1, 1, 1, 1, 1, 1453, 1,
+ 1, 1, 1, 1, 1279, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1280, 1, 1454, 1,
+ 1455, 1, 1451, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1451, 1, 1456, 1, 1, 1, 1457,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1456, 1, 1, 1, 1, 1,
+ 1, 1, 1458, 1, 1, 1, 1, 1,
+ 1286, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1287, 1, 1459, 1, 1460, 1, 1, 1,
+ 1461, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1460, 1462, 1463, 1462, 1462,
+ 1462, 1462, 1462, 1464, 1, 1462, 1462, 1465,
+ 1462, 1466, 1462, 1462, 1462, 1462, 1462, 1462,
+ 1462, 1462, 1462, 1462, 1462, 1, 1, 1,
+ 1462, 1, 1462, 1467, 1462, 1462, 1462, 1462,
+ 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462,
+ 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462,
+ 1462, 1462, 1462, 1462, 1462, 1462, 1, 1,
+ 1, 1462, 1462, 1462, 1462, 1462, 1462, 1462,
+ 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462,
+ 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462,
+ 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462,
+ 1462, 1462, 1, 1265, 1, 1, 1, 1468,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1265, 1, 1, 1, 1, 1,
+ 1, 1, 1469, 1, 1, 1, 1265, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1266, 1, 1470, 1, 1265, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1265, 1, 1465,
+ 1, 1, 1, 1471, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1465, 1,
+ 1, 1, 1, 1, 1, 1, 1472, 1,
+ 1, 1, 1465, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1467, 1,
+ 1473, 1, 1, 1, 1474, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1473,
+ 1475, 1476, 1475, 1475, 1475, 1475, 1475, 1477,
+ 1, 1475, 1475, 1, 1475, 1478, 1475, 1475,
+ 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475,
+ 1475, 1, 1, 1, 1475, 1, 1475, 1,
+ 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475,
+ 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475,
+ 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475,
+ 1475, 1475, 1479, 1, 1, 1475, 1475, 1475,
+ 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475,
+ 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475,
+ 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475,
+ 1475, 1475, 1475, 1475, 1475, 1475, 1, 1480,
+ 1, 1, 1, 1481, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1480, 1482,
+ 1483, 1482, 1482, 1482, 1482, 1482, 1484, 1,
+ 1482, 1482, 1, 1482, 1485, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
+ 1, 1, 1, 1482, 1, 1482, 1, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
+ 1482, 1486, 1, 1, 1482, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1, 1487, 1,
+ 1480, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1480,
+ 1, 1488, 1, 1, 1, 1489, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1488, 1482, 1483, 1482, 1482, 1482, 1482, 1482,
+ 1490, 1, 1482, 1482, 1491, 1482, 1492, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
+ 1482, 1482, 1493, 1, 1, 1482, 1, 1482,
+ 1, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1, 1, 1, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1,
+ 1488, 1, 1, 1, 1489, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1488,
+ 1, 1, 1, 1, 1, 1, 1, 1490,
+ 1, 1, 1, 1491, 1, 1494, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1493, 1, 1495, 1, 1488, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1488, 1, 1496, 1,
+ 1, 1, 1497, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1496, 1, 1,
+ 1, 1, 1, 1, 1, 1498, 1, 1,
+ 1, 1499, 1, 1500, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1501,
+ 1, 1502, 1, 1, 1, 1503, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1502, 1, 1, 1, 1, 1, 1, 1,
+ 1504, 1, 1, 1, 1502, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1505, 1, 1, 1, 1, 1,
+ 1266, 1, 1506, 1, 1502, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1502, 1, 1507, 1, 1,
+ 1, 1508, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1507, 1, 1, 1,
+ 1, 1, 1, 1, 1509, 1, 1, 1,
+ 1507, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1510, 1,
+ 1, 1, 1, 1, 1467, 1, 1511, 1,
+ 1, 1, 1512, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1511, 1513, 1514,
+ 1513, 1513, 1513, 1513, 1513, 1515, 1, 1513,
+ 1513, 1, 1513, 1516, 1513, 1513, 1513, 1513,
+ 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1,
+ 1, 1, 1513, 1, 1513, 1, 1513, 1513,
+ 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513,
+ 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513,
+ 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513,
+ 1, 1, 1, 1513, 1513, 1513, 1513, 1513,
+ 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513,
+ 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513,
+ 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513,
+ 1513, 1513, 1513, 1513, 1, 1517, 1, 1,
+ 1, 1518, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1517, 1256, 1257, 1256,
+ 1256, 1256, 1256, 1256, 1519, 1, 1256, 1256,
+ 1, 1256, 1260, 1256, 1256, 1256, 1256, 1256,
+ 1256, 1256, 1256, 1256, 1256, 1256, 1, 1,
+ 1, 1256, 1, 1256, 1, 1256, 1256, 1256,
+ 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256,
+ 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256,
+ 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1,
+ 1, 1, 1256, 1256, 1256, 1256, 1256, 1256,
+ 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256,
+ 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256,
+ 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256,
+ 1256, 1256, 1256, 1, 1520, 1, 1517, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1517, 1, 1521,
+ 1, 1, 1, 1522, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1521, 1462,
+ 1463, 1462, 1462, 1462, 1462, 1462, 1523, 1,
+ 1462, 1462, 1, 1462, 1466, 1462, 1462, 1462,
+ 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462,
+ 1, 1, 1, 1462, 1, 1462, 1, 1462,
+ 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462,
+ 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462,
+ 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462,
+ 1462, 1, 1, 1, 1462, 1462, 1462, 1462,
+ 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462,
+ 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462,
+ 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462,
+ 1462, 1462, 1462, 1462, 1462, 1, 1388, 1271,
+ 1388, 1388, 1388, 1388, 1388, 1, 1, 1388,
+ 1388, 1, 1388, 1524, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1,
+ 1, 1, 1388, 1, 1388, 1, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1, 1, 1, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388,
+ 1388, 1388, 1388, 1388, 1, 1494, 1, 1,
+ 1, 1525, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1494, 1526, 1, 1526,
+ 1526, 1526, 1526, 1526, 1527, 1, 1526, 1526,
+ 1, 1526, 1, 1526, 1526, 1526, 1526, 1526,
+ 1526, 1526, 1526, 1526, 1526, 1526, 1, 1,
+ 1, 1526, 1, 1526, 1, 1526, 1526, 1526,
+ 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526,
+ 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526,
+ 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1,
+ 1, 1, 1526, 1526, 1526, 1526, 1526, 1526,
+ 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526,
+ 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526,
+ 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526,
+ 1526, 1526, 1526, 1, 1528, 1, 1494, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1494, 1, 1488,
+ 1, 1, 1, 1489, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1488, 1526,
+ 1, 1526, 1526, 1526, 1526, 1526, 1490, 1,
+ 1526, 1526, 1491, 1526, 1494, 1526, 1526, 1526,
+ 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526,
+ 1493, 1, 1, 1526, 1, 1526, 1, 1526,
+ 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526,
+ 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526,
+ 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526,
+ 1526, 1, 1, 1, 1526, 1526, 1526, 1526,
+ 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526,
+ 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526,
+ 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526,
+ 1526, 1526, 1526, 1526, 1526, 1, 1500, 1,
+ 1, 1, 1529, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1500, 1530, 1,
+ 1530, 1530, 1530, 1530, 1530, 1531, 1, 1530,
+ 1530, 1, 1530, 1, 1530, 1530, 1530, 1530,
+ 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1,
+ 1, 1, 1530, 1, 1530, 1, 1530, 1530,
+ 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530,
+ 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530,
+ 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530,
+ 1, 1, 1, 1530, 1530, 1530, 1530, 1530,
+ 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530,
+ 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530,
+ 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530,
+ 1530, 1530, 1530, 1530, 1, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1483, 1, 1532,
+ 1532, 1533, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1483, 1532, 1, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1534, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1, 1532,
+ 1532, 1535, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1536, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1534, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1, 1537, 1, 1532,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1532, 1,
+ 1538, 1, 1, 1, 1539, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1538,
+ 1536, 1483, 1536, 1536, 1536, 1536, 1536, 1540,
+ 1, 1536, 1536, 1491, 1536, 1485, 1536, 1536,
+ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
+ 1536, 1493, 1, 1, 1536, 1, 1536, 1,
+ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
+ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
+ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
+ 1536, 1536, 1, 1, 1, 1536, 1536, 1536,
+ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
+ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
+ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
+ 1536, 1536, 1536, 1536, 1536, 1536, 1, 1538,
+ 1, 1, 1, 1539, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1538, 1,
+ 1, 1, 1, 1, 1, 1, 1540, 1,
+ 1, 1, 1491, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1493, 1, 1541, 1, 1538, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1538, 1, 1542, 1, 1,
+ 1, 1543, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1542, 1, 1, 1,
+ 1, 1, 1, 1, 1544, 1, 1, 1,
+ 1499, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1501, 1,
+ 1536, 1483, 1536, 1536, 1536, 1536, 1536, 1,
+ 1, 1536, 1536, 1, 1536, 1485, 1536, 1536,
+ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
+ 1536, 1, 1, 1, 1536, 1, 1536, 1,
+ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
+ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
+ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
+ 1536, 1536, 1, 1, 1, 1536, 1536, 1536,
+ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
+ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
+ 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536,
+ 1536, 1536, 1536, 1536, 1536, 1536, 1, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532,
+ 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1,
+ 1545, 1, 1483, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1483, 1, 1494, 1, 1, 1, 1525,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1494, 1482, 1483, 1482, 1482, 1482,
+ 1482, 1482, 1527, 1, 1482, 1482, 1, 1482,
+ 1485, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1, 1, 1, 1482,
+ 1, 1482, 1, 1482, 1482, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1, 1, 1,
+ 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
+ 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
+ 1482, 1, 1546, 1, 1, 1, 1547, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1546, 1548, 1549, 1548, 1548, 1548, 1548,
+ 1548, 1550, 1, 1548, 1548, 1, 1548, 1551,
+ 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
+ 1548, 1548, 1548, 1, 1, 1, 1548, 1,
+ 1548, 1, 1548, 1548, 1548, 1548, 1548, 1548,
+ 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
+ 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
+ 1548, 1548, 1548, 1548, 1552, 1, 1, 1548,
+ 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
+ 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
+ 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
+ 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
+ 1, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1, 1486, 1486, 1553, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1, 1554, 1538, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1, 1555, 1, 1486, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1486, 1, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486,
+ 1486, 1486, 1486, 1486, 1, 1556, 1, 1,
+ 1, 1557, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1556, 1238, 1239, 1238,
+ 1238, 1238, 1238, 1238, 1558, 1, 1238, 1238,
+ 1559, 1238, 1560, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1, 1561,
+ 1242, 1238, 1, 1238, 1562, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1,
+ 1, 1, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1, 1563, 1, 1, 1,
+ 1564, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1563, 1565, 1566, 1565, 1565,
+ 1565, 1565, 1565, 1567, 1, 1565, 1565, 1,
+ 1565, 1225, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1, 1, 1209,
+ 1565, 1, 1565, 1225, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1, 1,
+ 1, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1, 1568, 1, 1, 1, 1569,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1568, 1565, 1566, 1565, 1565, 1565,
+ 1565, 1565, 1570, 1, 1565, 1565, 1, 1565,
+ 1, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1, 1, 1199, 1565,
+ 1, 1565, 1, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1, 1, 1,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1, 1571, 1, 1568, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1568, 1, 1572, 1, 1,
+ 1, 1573, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1572, 1565, 1214, 1565,
+ 1565, 1565, 1565, 1565, 1574, 1, 1565, 1565,
+ 1305, 1565, 1217, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1, 1306,
+ 1209, 1565, 1, 1565, 1575, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1,
+ 1, 1, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1, 1572, 1, 1, 1,
+ 1573, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1572, 1213, 1214, 1213, 1213,
+ 1213, 1213, 1213, 1574, 1, 1213, 1213, 1305,
+ 1213, 1217, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1, 1306, 1209,
+ 1213, 1, 1213, 1575, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1, 1,
+ 1, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1, 1576, 1, 1577, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1577, 1, 1578, 1,
+ 1, 1, 1579, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1578, 1238, 1239,
+ 1238, 1238, 1238, 1238, 1238, 1580, 1, 1238,
+ 1238, 1310, 1238, 1560, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1,
+ 1311, 1242, 1238, 1, 1238, 1581, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1, 1, 1, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1, 1582, 1, 1,
+ 1, 1583, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1582, 1584, 1585, 1584,
+ 1584, 1584, 1584, 1584, 1586, 1, 1584, 1584,
+ 1, 1584, 1587, 1584, 1584, 1584, 1584, 1584,
+ 1584, 1584, 1584, 1584, 1584, 1584, 1, 1,
+ 1209, 1584, 1, 1584, 1225, 1584, 1584, 1584,
+ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584,
+ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584,
+ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1588,
+ 1, 1, 1584, 1584, 1584, 1584, 1584, 1584,
+ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584,
+ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584,
+ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584,
+ 1584, 1584, 1584, 1, 1589, 1, 1, 1,
+ 1590, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1589, 1591, 1592, 1591, 1591,
+ 1591, 1591, 1591, 1593, 1, 1591, 1591, 1,
+ 1591, 1594, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1591, 1, 1, 1199,
+ 1591, 1, 1591, 1, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1591, 1591, 1595, 1,
+ 1, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1, 1596, 1, 1589, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1589, 1, 1597, 1,
+ 1, 1, 1598, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1597, 1591, 1592,
+ 1591, 1591, 1591, 1591, 1591, 1599, 1, 1591,
+ 1591, 1600, 1591, 1601, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1,
+ 1602, 1209, 1591, 1, 1591, 1225, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1, 1, 1, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1, 1597, 1, 1,
+ 1, 1598, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1597, 1213, 1214, 1213,
+ 1213, 1213, 1213, 1213, 1599, 1, 1213, 1213,
+ 1600, 1213, 1603, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1, 1602,
+ 1209, 1213, 1, 1213, 1225, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1,
+ 1, 1, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1, 1604, 1, 1605, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1605, 1, 1606,
+ 1, 1, 1, 1607, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1606, 1238,
+ 1239, 1238, 1238, 1238, 1238, 1238, 1608, 1,
+ 1238, 1238, 1609, 1238, 1610, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1, 1611, 1242, 1238, 1, 1238, 1241, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1, 1, 1, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1, 1612, 1,
+ 1, 1, 1613, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1612, 1614, 1214,
+ 1614, 1614, 1614, 1614, 1614, 1615, 1, 1614,
+ 1614, 1, 1614, 1225, 1614, 1614, 1614, 1614,
+ 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1,
+ 1, 1209, 1614, 1, 1614, 1225, 1614, 1614,
+ 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614,
+ 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614,
+ 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614,
+ 1, 1, 1, 1614, 1614, 1614, 1614, 1614,
+ 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614,
+ 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614,
+ 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614,
+ 1614, 1614, 1614, 1614, 1, 1616, 1, 1,
+ 1, 1617, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1616, 1614, 1214, 1614,
+ 1614, 1614, 1614, 1614, 1618, 1, 1614, 1614,
+ 1, 1614, 1, 1614, 1614, 1614, 1614, 1614,
+ 1614, 1614, 1614, 1614, 1614, 1614, 1, 1,
+ 1199, 1614, 1, 1614, 1, 1614, 1614, 1614,
+ 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614,
+ 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614,
+ 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1,
+ 1, 1, 1614, 1614, 1614, 1614, 1614, 1614,
+ 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614,
+ 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614,
+ 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614,
+ 1614, 1614, 1614, 1, 1619, 1, 1616, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1616, 1, 1597,
+ 1, 1, 1, 1598, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1597, 1614,
+ 1214, 1614, 1614, 1614, 1614, 1614, 1599, 1,
+ 1614, 1614, 1600, 1614, 1603, 1614, 1614, 1614,
+ 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614,
+ 1, 1602, 1209, 1614, 1, 1614, 1225, 1614,
+ 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614,
+ 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614,
+ 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614,
+ 1614, 1, 1, 1, 1614, 1614, 1614, 1614,
+ 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614,
+ 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614,
+ 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614,
+ 1614, 1614, 1614, 1614, 1614, 1, 1620, 1,
+ 1, 1, 1621, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1620, 1622, 1239,
+ 1622, 1622, 1622, 1622, 1622, 1623, 1, 1622,
+ 1622, 1, 1622, 1, 1622, 1622, 1622, 1622,
+ 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1,
+ 1, 1253, 1622, 1, 1622, 1, 1622, 1622,
+ 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
+ 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
+ 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
+ 1, 1, 1, 1622, 1622, 1622, 1622, 1622,
+ 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
+ 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
+ 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
+ 1622, 1622, 1622, 1622, 1, 1624, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1624, 1625, 1, 1624,
+ 1624, 1626, 1624, 1624, 1624, 1624, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1625, 1624, 1229, 1624,
+ 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624,
+ 1627, 1624, 1624, 1624, 1624, 1624, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624,
+ 1624, 1624, 1624, 1624, 1, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1, 1628,
+ 1628, 1629, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1630, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1631, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1, 1632, 1, 1628,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1628, 1,
+ 1633, 1, 1, 1, 1634, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1633,
+ 1635, 1592, 1635, 1635, 1635, 1635, 1635, 1636,
+ 1, 1635, 1635, 1600, 1635, 1637, 1635, 1635,
+ 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635,
+ 1635, 1, 1602, 1209, 1635, 1, 1635, 1225,
+ 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635,
+ 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635,
+ 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635,
+ 1635, 1635, 1, 1, 1, 1635, 1635, 1635,
+ 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635,
+ 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635,
+ 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635,
+ 1635, 1635, 1635, 1635, 1635, 1635, 1, 1633,
+ 1, 1, 1, 1634, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1633, 1213,
+ 1214, 1213, 1213, 1213, 1213, 1213, 1636, 1,
+ 1213, 1213, 1600, 1213, 1225, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1, 1602, 1209, 1213, 1, 1213, 1225, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1, 1, 1, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1, 1638, 1,
+ 1639, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1639,
+ 1, 1640, 1, 1, 1, 1641, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1640, 1238, 1239, 1238, 1238, 1238, 1238, 1238,
+ 1642, 1, 1238, 1238, 1609, 1238, 1241, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1, 1611, 1242, 1238, 1, 1238,
+ 1241, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1, 1, 1, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1,
+ 1243, 1, 1, 1, 1244, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1243,
+ 1635, 1592, 1635, 1635, 1635, 1635, 1635, 1245,
+ 1, 1635, 1635, 1, 1635, 1637, 1635, 1635,
+ 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635,
+ 1635, 1, 1, 1209, 1635, 1, 1635, 1225,
+ 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635,
+ 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635,
+ 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635,
+ 1635, 1635, 1, 1, 1, 1635, 1635, 1635,
+ 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635,
+ 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635,
+ 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635,
+ 1635, 1635, 1635, 1635, 1635, 1635, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1643, 1, 1628, 1628, 1644, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1643,
+ 1628, 1233, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1631, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628,
+ 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1,
+ 1645, 1, 1643, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1643, 1, 1612, 1, 1, 1, 1613,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1612, 1591, 1592, 1591, 1591, 1591,
+ 1591, 1591, 1615, 1, 1591, 1591, 1, 1591,
+ 1637, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1, 1, 1209, 1591,
+ 1, 1591, 1225, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1591, 1, 1, 1,
+ 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591,
+ 1591, 1, 1646, 1, 1, 1, 1647, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1646, 1648, 1649, 1648, 1648, 1648, 1648,
+ 1648, 1650, 1, 1648, 1648, 1, 1648, 1651,
+ 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648,
+ 1648, 1648, 1648, 1, 1, 1253, 1648, 1,
+ 1648, 1, 1648, 1648, 1648, 1648, 1648, 1648,
+ 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648,
+ 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648,
+ 1648, 1648, 1648, 1648, 1652, 1, 1, 1648,
+ 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648,
+ 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648,
+ 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648,
+ 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648,
+ 1, 1653, 1654, 1653, 1653, 1653, 1653, 1653,
+ 1, 1, 1653, 1653, 1, 1653, 1594, 1653,
+ 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653,
+ 1653, 1653, 1, 1, 1, 1653, 1, 1653,
+ 1, 1653, 1653, 1653, 1653, 1653, 1653, 1653,
+ 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653,
+ 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653,
+ 1653, 1653, 1653, 1, 1, 1, 1653, 1653,
+ 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653,
+ 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653,
+ 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653,
+ 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1,
+ 1655, 1, 1, 1, 1656, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1655,
+ 1653, 1654, 1653, 1653, 1653, 1653, 1653, 1657,
+ 1, 1653, 1653, 1600, 1653, 1594, 1653, 1653,
+ 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653,
+ 1653, 1, 1602, 1, 1653, 1, 1653, 1,
+ 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653,
+ 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653,
+ 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653,
+ 1653, 1653, 1, 1, 1, 1653, 1653, 1653,
+ 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653,
+ 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653,
+ 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653,
+ 1653, 1653, 1653, 1653, 1653, 1653, 1, 1655,
+ 1, 1, 1, 1656, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1655, 1,
+ 1, 1, 1, 1, 1, 1, 1657, 1,
+ 1, 1, 1600, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1602, 1, 1658, 1, 1655, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1655, 1, 1659, 1,
+ 1, 1, 1660, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1659, 1, 1,
+ 1, 1, 1, 1, 1, 1661, 1, 1,
+ 1, 1609, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1611, 1, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1654, 1, 1662, 1662, 1663, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1654, 1662, 1, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1664, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1, 1662, 1662, 1665, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1653, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1664, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1, 1666, 1, 1662, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1662, 1, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662,
+ 1662, 1662, 1662, 1662, 1662, 1, 1667, 1,
+ 1654, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1654,
+ 1, 1595, 1595, 1595, 1595, 1595, 1595, 1595,
+ 1595, 1595, 1, 1595, 1595, 1668, 1595, 1595,
+ 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595,
+ 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595,
+ 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595,
+ 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595,
+ 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595,
+ 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595,
+ 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595,
+ 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595,
+ 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595,
+ 1595, 1595, 1595, 1, 1669, 1655, 1595, 1595,
+ 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595,
+ 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595,
+ 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595,
+ 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595,
+ 1, 1670, 1, 1595, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1595, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1595, 1671, 1671, 1671,
+ 1671, 1671, 1671, 1671, 1671, 1671, 1, 1671,
+ 1671, 1672, 1671, 1671, 1671, 1671, 1671, 1671,
+ 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
+ 1671, 1671, 1671, 1671, 1671, 1671, 1673, 1671,
+ 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
+ 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
+ 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
+ 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
+ 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
+ 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
+ 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
+ 1674, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
+ 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
+ 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
+ 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671,
+ 1671, 1671, 1671, 1671, 1, 1675, 1675, 1675,
+ 1675, 1675, 1675, 1675, 1675, 1675, 1, 1675,
+ 1675, 1676, 1675, 1675, 1675, 1675, 1675, 1675,
+ 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
+ 1675, 1675, 1675, 1675, 1675, 1675, 1677, 1675,
+ 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
+ 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
+ 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
+ 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
+ 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
+ 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
+ 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
+ 1678, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
+ 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
+ 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
+ 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
+ 1675, 1675, 1675, 1675, 1, 1679, 1, 1675,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1675, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1675, 1680, 1, 1, 1, 1681, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1680, 1682, 1683, 1682, 1682, 1682, 1682, 1682,
+ 1684, 1, 1682, 1682, 1, 1682, 1, 1682,
+ 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
+ 1682, 1682, 1, 1, 1253, 1682, 1, 1682,
+ 1, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
+ 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
+ 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
+ 1682, 1682, 1682, 1, 1, 1, 1682, 1682,
+ 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
+ 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
+ 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
+ 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1,
+ 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685,
+ 1686, 1, 1685, 1685, 1687, 1685, 1685, 1685,
+ 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685,
+ 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1686,
+ 1685, 1229, 1685, 1685, 1685, 1685, 1685, 1685,
+ 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685,
+ 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685,
+ 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685,
+ 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685,
+ 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685,
+ 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685,
+ 1685, 1685, 1685, 1688, 1685, 1685, 1685, 1685,
+ 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685,
+ 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685,
+ 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685,
+ 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1,
+ 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1689, 1, 1689, 1689, 1690, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1689, 1691, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1692, 1689, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1,
+ 1693, 1, 1689, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1689, 1, 1694, 1, 1, 1, 1695,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1694, 1696, 1204, 1696, 1696, 1696,
+ 1696, 1696, 1697, 1, 1696, 1696, 1206, 1696,
+ 1698, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1, 1208, 1209, 1696,
+ 1, 1696, 1210, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1, 1, 1,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1, 1699, 1, 1, 1, 1700, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1699, 1213, 1214, 1213, 1213, 1213, 1213,
+ 1213, 1701, 1, 1213, 1213, 1216, 1213, 1225,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1, 1218, 1209, 1213, 1,
+ 1213, 1219, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1, 1, 1, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1, 1702, 1, 1703, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1703, 1, 1704, 1, 1, 1,
+ 1705, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1704, 1238, 1239, 1238, 1238,
+ 1238, 1238, 1238, 1706, 1, 1238, 1238, 1559,
+ 1238, 1241, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1, 1561, 1242,
+ 1238, 1, 1238, 1562, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1, 1,
+ 1, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1, 1707, 1, 1, 1, 1708,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1707, 1696, 1204, 1696, 1696, 1696,
+ 1696, 1696, 1709, 1, 1696, 1696, 1206, 1696,
+ 1698, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1, 1208, 1209, 1696,
+ 1, 1696, 1210, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1, 1, 1,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1, 1710, 1, 1, 1, 1711, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1710, 1213, 1214, 1213, 1213, 1213, 1213,
+ 1213, 1712, 1, 1213, 1213, 1216, 1213, 1,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1, 1218, 1199, 1213, 1,
+ 1213, 1713, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1, 1, 1, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1, 1714, 1, 1710, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1710, 1, 1715, 1, 1, 1,
+ 1716, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1715, 1238, 1239, 1238, 1238,
+ 1238, 1238, 1238, 1717, 1, 1238, 1238, 1559,
+ 1238, 1, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1, 1561, 1253,
+ 1238, 1, 1238, 1718, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1, 1,
+ 1, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1, 1719, 1, 1, 1, 1720,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1719, 1721, 1722, 1721, 1721, 1721,
+ 1721, 1721, 1723, 1, 1721, 1721, 1, 1721,
+ 1724, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1, 1, 1, 1721,
+ 1, 1721, 1, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1588, 1, 1,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
+ 1721, 1, 1725, 1, 1, 1, 1726, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1725, 1727, 1654, 1727, 1727, 1727, 1727,
+ 1727, 1728, 1, 1727, 1727, 1, 1727, 1594,
+ 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+ 1727, 1727, 1727, 1, 1, 1, 1727, 1,
+ 1727, 1, 1727, 1727, 1727, 1727, 1727, 1727,
+ 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+ 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+ 1727, 1727, 1727, 1727, 1595, 1, 1, 1727,
+ 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+ 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+ 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+ 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+ 1, 1729, 1, 1725, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1725, 1, 1730, 1, 1, 1,
+ 1731, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1730, 1727, 1654, 1727, 1727,
+ 1727, 1727, 1727, 1732, 1, 1727, 1727, 1600,
+ 1727, 1733, 1727, 1727, 1727, 1727, 1727, 1727,
+ 1727, 1727, 1727, 1727, 1727, 1, 1602, 1,
+ 1727, 1, 1727, 1, 1727, 1727, 1727, 1727,
+ 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+ 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+ 1727, 1727, 1727, 1727, 1727, 1727, 1, 1,
+ 1, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+ 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+ 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+ 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+ 1727, 1727, 1, 1730, 1, 1, 1, 1731,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1730, 1, 1, 1, 1, 1,
+ 1, 1, 1732, 1, 1, 1, 1600, 1,
+ 1734, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1602, 1, 1735,
+ 1, 1730, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1730, 1, 1736, 1, 1, 1, 1737, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1736, 1, 1, 1, 1, 1, 1,
+ 1, 1738, 1, 1, 1, 1609, 1, 1739,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1611, 1, 1734, 1,
+ 1, 1, 1740, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1734, 1741, 1,
+ 1741, 1741, 1741, 1741, 1741, 1742, 1, 1741,
+ 1741, 1, 1741, 1, 1741, 1741, 1741, 1741,
+ 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1,
+ 1, 1, 1741, 1, 1741, 1, 1741, 1741,
+ 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741,
+ 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741,
+ 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741,
+ 1, 1, 1, 1741, 1741, 1741, 1741, 1741,
+ 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741,
+ 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741,
+ 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741,
+ 1741, 1741, 1741, 1741, 1, 1743, 1, 1734,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1734, 1,
+ 1730, 1, 1, 1, 1731, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1730,
+ 1741, 1, 1741, 1741, 1741, 1741, 1741, 1732,
+ 1, 1741, 1741, 1600, 1741, 1734, 1741, 1741,
+ 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741,
+ 1741, 1, 1602, 1, 1741, 1, 1741, 1,
+ 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741,
+ 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741,
+ 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741,
+ 1741, 1741, 1, 1, 1, 1741, 1741, 1741,
+ 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741,
+ 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741,
+ 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741,
+ 1741, 1741, 1741, 1741, 1741, 1741, 1, 1739,
+ 1, 1, 1, 1744, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1739, 1745,
+ 1, 1745, 1745, 1745, 1745, 1745, 1746, 1,
+ 1745, 1745, 1, 1745, 1, 1745, 1745, 1745,
+ 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745,
+ 1, 1, 1, 1745, 1, 1745, 1, 1745,
+ 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745,
+ 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745,
+ 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745,
+ 1745, 1, 1, 1, 1745, 1745, 1745, 1745,
+ 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745,
+ 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745,
+ 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745,
+ 1745, 1745, 1745, 1745, 1745, 1, 1734, 1,
+ 1, 1, 1740, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1734, 1727, 1654,
+ 1727, 1727, 1727, 1727, 1727, 1742, 1, 1727,
+ 1727, 1, 1727, 1594, 1727, 1727, 1727, 1727,
+ 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1,
+ 1, 1, 1727, 1, 1727, 1, 1727, 1727,
+ 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+ 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+ 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+ 1, 1, 1, 1727, 1727, 1727, 1727, 1727,
+ 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+ 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+ 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727,
+ 1727, 1727, 1727, 1727, 1, 1747, 1, 1,
+ 1, 1748, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1747, 1749, 1750, 1749,
+ 1749, 1749, 1749, 1749, 1751, 1, 1749, 1749,
+ 1, 1749, 1651, 1749, 1749, 1749, 1749, 1749,
+ 1749, 1749, 1749, 1749, 1749, 1749, 1, 1,
+ 1, 1749, 1, 1749, 1, 1749, 1749, 1749,
+ 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749,
+ 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749,
+ 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1652,
+ 1, 1, 1749, 1749, 1749, 1749, 1749, 1749,
+ 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749,
+ 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749,
+ 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749,
+ 1749, 1749, 1749, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1689, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1689, 1689, 1752, 1, 1689,
+ 1689, 1753, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1689, 1752, 1689, 1233, 1689,
+ 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1692, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
+ 1689, 1689, 1689, 1689, 1, 1754, 1, 1752,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1752, 1,
+ 1755, 1, 1, 1, 1756, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1755,
+ 1203, 1757, 1203, 1203, 1203, 1203, 1203, 1758,
+ 1, 1203, 1203, 1206, 1203, 1698, 1203, 1203,
+ 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203,
+ 1203, 1, 1208, 1209, 1203, 1, 1203, 1210,
+ 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203,
+ 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203,
+ 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203,
+ 1203, 1203, 1, 1, 1, 1203, 1203, 1203,
+ 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203,
+ 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203,
+ 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203,
+ 1203, 1203, 1203, 1203, 1203, 1203, 1, 1759,
+ 1, 1, 1, 1760, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1759, 1565,
+ 1566, 1565, 1565, 1565, 1565, 1565, 1761, 1,
+ 1565, 1565, 1216, 1565, 1, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1, 1218, 1199, 1565, 1, 1565, 1713, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1, 1, 1, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
+ 1565, 1565, 1565, 1565, 1565, 1, 1762, 1,
+ 1759, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1759,
+ 1, 1763, 1, 1, 1, 1764, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1763, 1682, 1683, 1682, 1682, 1682, 1682, 1682,
+ 1765, 1, 1682, 1682, 1559, 1682, 1, 1682,
+ 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
+ 1682, 1682, 1, 1561, 1253, 1682, 1, 1682,
+ 1718, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
+ 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
+ 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
+ 1682, 1682, 1682, 1, 1, 1, 1682, 1682,
+ 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
+ 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
+ 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
+ 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1,
+ 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766,
+ 1767, 1, 1766, 1766, 1768, 1766, 1766, 1766,
+ 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766,
+ 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1767,
+ 1766, 1673, 1766, 1766, 1766, 1766, 1766, 1766,
+ 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766,
+ 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766,
+ 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766,
+ 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766,
+ 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766,
+ 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766,
+ 1766, 1766, 1766, 1769, 1766, 1766, 1766, 1766,
+ 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766,
+ 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766,
+ 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766,
+ 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1, 1770, 1770, 1771, 1770, 1770, 1770,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1772, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1770, 1770, 1773, 1770, 1770, 1770, 1770,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1,
+ 1774, 1, 1770, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1770, 1, 1201, 1, 1, 1, 1202,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1201, 1696, 1204, 1696, 1696, 1696,
+ 1696, 1696, 1205, 1, 1696, 1696, 1206, 1696,
+ 1207, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1, 1208, 1209, 1696,
+ 1, 1696, 1210, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1, 1, 1,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1770, 1770, 1775, 1, 1770, 1770, 1776,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1770, 1775, 1770, 1677, 1770, 1770, 1770,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1773, 1770,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770,
+ 1770, 1770, 1, 1777, 1, 1775, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1775, 1, 1778, 1778,
+ 1778, 1778, 1778, 1778, 1778, 1778, 1779, 1,
+ 1778, 1778, 1780, 1778, 1778, 1778, 1778, 1778,
+ 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778,
+ 1778, 1778, 1778, 1778, 1778, 1779, 1778, 1781,
+ 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778,
+ 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778,
+ 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778,
+ 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778,
+ 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778,
+ 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778,
+ 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778,
+ 1778, 1782, 1778, 1778, 1778, 1778, 1778, 1778,
+ 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778,
+ 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778,
+ 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778,
+ 1778, 1778, 1778, 1778, 1778, 1, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1,
+ 1783, 1783, 1784, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1785,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1786, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1, 1787, 1,
+ 1783, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1783,
+ 1, 1788, 1, 1, 1, 1789, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1788, 1696, 1204, 1696, 1696, 1696, 1696, 1696,
+ 1790, 1, 1696, 1696, 1791, 1696, 1207, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1, 1792, 1209, 1696, 1, 1696,
+ 1793, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1, 1, 1, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1,
+ 1794, 1, 1, 1, 1795, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1794,
+ 1213, 1214, 1213, 1213, 1213, 1213, 1213, 1796,
+ 1, 1213, 1213, 1797, 1213, 1217, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1, 1798, 1209, 1213, 1, 1213, 1799,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1, 1, 1, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1, 1800,
+ 1, 1801, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1801, 1, 1802, 1, 1, 1, 1803, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1802, 1238, 1239, 1238, 1238, 1238, 1238,
+ 1238, 1804, 1, 1238, 1238, 1805, 1238, 1560,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1, 1806, 1242, 1238, 1,
+ 1238, 1807, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1, 1, 1, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1783, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1783, 1808, 1, 1783, 1783, 1809, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1808, 1783, 1810, 1783, 1783, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1786, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783,
+ 1783, 1, 1811, 1, 1808, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1808, 1, 1812, 1, 1,
+ 1, 1813, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1812, 1213, 1214, 1213,
+ 1213, 1213, 1213, 1213, 1814, 1, 1213, 1213,
+ 1815, 1213, 1217, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1, 1816,
+ 1209, 1213, 1, 1213, 1817, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1,
+ 1, 1, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+ 1213, 1213, 1213, 1, 1818, 1, 1819, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1819, 1, 1820,
+ 1, 1, 1, 1821, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1820, 1238,
+ 1239, 1238, 1238, 1238, 1238, 1238, 1822, 1,
+ 1238, 1238, 1823, 1238, 1560, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1, 1824, 1242, 1238, 1, 1238, 1825, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1, 1, 1, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238,
+ 1238, 1238, 1238, 1238, 1238, 1, 1826, 1,
+ 1, 1, 1827, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1826, 1828, 1829,
+ 1828, 1828, 1828, 1828, 1828, 1830, 1, 1828,
+ 1828, 1182, 1828, 1831, 1828, 1828, 1828, 1828,
+ 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1,
+ 1184, 1253, 1828, 1, 1828, 1, 1828, 1828,
+ 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828,
+ 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828,
+ 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828,
+ 1, 1, 1, 1828, 1828, 1828, 1828, 1828,
+ 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828,
+ 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828,
+ 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828,
+ 1828, 1828, 1828, 1828, 1, 1832, 1833, 1832,
+ 1832, 1832, 1832, 1832, 1, 1, 1832, 1832,
+ 1, 1832, 1834, 1832, 1832, 1832, 1832, 1832,
+ 1832, 1832, 1832, 1832, 1832, 1832, 1, 1,
+ 1, 1832, 1, 1832, 1, 1832, 1832, 1832,
+ 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832,
+ 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832,
+ 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1,
+ 1, 1, 1832, 1832, 1832, 1832, 1832, 1832,
+ 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832,
+ 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832,
+ 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832,
+ 1832, 1832, 1832, 1, 1835, 1, 1, 1,
+ 1836, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1835, 1832, 1833, 1832, 1832,
+ 1832, 1832, 1832, 1837, 1, 1832, 1832, 1206,
+ 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832,
+ 1832, 1832, 1832, 1832, 1832, 1, 1208, 1,
+ 1832, 1, 1832, 1838, 1832, 1832, 1832, 1832,
+ 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832,
+ 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832,
+ 1832, 1832, 1832, 1832, 1832, 1832, 1, 1,
+ 1, 1832, 1832, 1832, 1832, 1832, 1832, 1832,
+ 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832,
+ 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832,
+ 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832,
+ 1832, 1832, 1, 1839, 1, 1, 1, 1840,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1839, 1, 1, 1, 1, 1,
+ 1, 1, 1841, 1, 1, 1, 1216, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1218, 1, 1,
+ 1, 1, 1713, 1, 1842, 1, 1839, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1839, 1, 1843,
+ 1, 1, 1, 1844, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1843, 1,
+ 1, 1, 1, 1, 1, 1, 1845, 1,
+ 1, 1, 1559, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1561, 1, 1, 1, 1, 1718, 1,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1833, 1, 1846, 1846, 1847, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1833,
+ 1846, 1, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1848, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1, 1846, 1846, 1849, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1832, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1848, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846,
+ 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1,
+ 1850, 1, 1846, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1846, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1846, 1851, 1, 1833, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1833, 1, 1243,
+ 1, 1, 1, 1244, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1243, 1696,
+ 1204, 1696, 1696, 1696, 1696, 1696, 1245, 1,
+ 1696, 1696, 1, 1696, 1852, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1, 1, 1209, 1696, 1, 1696, 1225, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1, 1, 1, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696,
+ 1696, 1696, 1696, 1696, 1696, 1, 1853, 1854,
+ 1853, 1853, 1853, 1853, 1853, 1, 1, 1853,
+ 1853, 1, 1853, 1855, 1853, 1853, 1853, 1853,
+ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1,
+ 1, 1, 1853, 1, 1853, 1, 1853, 1853,
+ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853,
+ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853,
+ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853,
+ 1, 1, 1, 1853, 1853, 1853, 1853, 1853,
+ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853,
+ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853,
+ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853,
+ 1853, 1853, 1853, 1853, 1, 1856, 1, 1,
+ 1, 1857, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1856, 1853, 1854, 1853,
+ 1853, 1853, 1853, 1853, 1858, 1, 1853, 1853,
+ 136, 1853, 1853, 1853, 1853, 1853, 1853, 1853,
+ 1853, 1853, 1853, 1853, 1853, 1853, 1, 138,
+ 1, 1853, 1, 1853, 1859, 1853, 1853, 1853,
+ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853,
+ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853,
+ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1,
+ 1, 1, 1853, 1853, 1853, 1853, 1853, 1853,
+ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853,
+ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853,
+ 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853,
+ 1853, 1853, 1853, 1, 1860, 1, 1, 1,
+ 1861, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1860, 1, 1, 1, 1,
+ 1, 1, 1, 1862, 1, 1, 1, 146,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 148, 1,
+ 1, 1, 1, 1096, 1, 1863, 1, 1860,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1860, 1,
+ 1864, 1, 1, 1, 1865, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1864,
+ 1, 1, 1, 1, 1, 1, 1, 1866,
+ 1, 1, 1, 1076, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 590, 1, 1, 1, 1, 1101,
+ 1, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1854, 1, 1867, 1867, 1868, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1854, 1867, 1, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1869, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1, 1867, 1867, 1870, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1853, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1869, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1, 1871, 1, 1867, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1867, 1, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867,
+ 1867, 1867, 1867, 1867, 1, 1872, 1, 1854,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1854, 1,
+ 173, 1, 1, 1, 174, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 173,
+ 262, 134, 262, 262, 262, 262, 262, 175,
+ 1, 262, 262, 1, 262, 1873, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 1, 1, 139, 262, 1, 262, 155,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 1, 1, 1, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 262, 262, 262, 262, 1, 1874,
+ 1, 1, 1, 1875, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1874, 1876,
+ 1877, 1876, 1876, 1876, 1876, 1876, 1878, 1,
+ 1876, 1876, 1, 1876, 1879, 1876, 1876, 1876,
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+ 1, 1, 1, 1876, 1, 1876, 1, 1876,
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+ 1876, 1880, 1, 1, 1876, 1876, 1876, 1876,
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+ 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876,
+ 1876, 1876, 1876, 1876, 1876, 1, 1881, 1,
+ 1, 1, 1882, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1881, 1883, 1884,
+ 1883, 1883, 1883, 1883, 1883, 1885, 1, 1883,
+ 1883, 1, 1883, 1886, 1883, 1883, 1883, 1883,
+ 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1,
+ 1, 1, 1883, 1, 1883, 1, 1883, 1883,
+ 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883,
+ 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883,
+ 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883,
+ 1887, 1, 1, 1883, 1883, 1883, 1883, 1883,
+ 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883,
+ 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883,
+ 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883,
+ 1883, 1883, 1883, 1883, 1, 1888, 1, 1881,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1881, 1,
+ 1889, 1, 1, 1, 1890, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1889,
+ 1883, 1884, 1883, 1883, 1883, 1883, 1883, 1891,
+ 1, 1883, 1883, 1, 1883, 1892, 1883, 1883,
+ 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883,
+ 1883, 1, 1, 1, 1883, 1893, 1883, 1,
+ 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883,
+ 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883,
+ 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883,
+ 1883, 1883, 1, 1, 1, 1883, 1883, 1883,
+ 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883,
+ 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883,
+ 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883,
+ 1883, 1883, 1883, 1883, 1883, 1883, 1, 1889,
+ 1, 1, 1, 1890, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1889, 1,
+ 1, 1, 1, 1, 1, 1, 1891, 1,
+ 1, 1, 1, 1, 1894, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1893, 1, 1895, 1,
+ 1889, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1889,
+ 1, 1896, 1, 1, 1, 1897, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1896, 1, 1, 1, 1, 1, 1, 1,
+ 1898, 1, 1, 1, 1, 1, 1899, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1900, 1,
+ 1894, 1, 1, 1, 1901, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1894,
+ 1902, 1, 1902, 1902, 1902, 1902, 1902, 1903,
+ 1, 1902, 1902, 1, 1902, 1, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1, 1, 1, 1902, 1, 1902, 1,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1, 1, 1, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1, 1904,
+ 1, 1894, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1894, 1, 1889, 1, 1, 1, 1890, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1889, 1902, 1, 1902, 1902, 1902, 1902,
+ 1902, 1891, 1, 1902, 1902, 1, 1902, 1894,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1, 1, 1, 1902, 1893,
+ 1902, 1, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1, 1, 1, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902,
+ 1, 1899, 1, 1, 1, 1905, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1899, 1906, 1, 1906, 1906, 1906, 1906, 1906,
+ 1907, 1, 1906, 1906, 1, 1906, 1, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1, 1, 1, 1906, 1, 1906,
+ 1, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1, 1, 1, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906,
+ 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1884, 1, 1908, 1908, 1909, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1884,
+ 1908, 1, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1910, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1, 1908, 1908, 1911, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1912, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1910, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908,
+ 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1,
+ 1913, 1, 1908, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1908, 1, 1914, 1, 1, 1, 1915,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1914, 1912, 1884, 1912, 1912, 1912,
+ 1912, 1912, 1916, 1, 1912, 1912, 1, 1912,
+ 1886, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1, 1, 1, 1912,
+ 1893, 1912, 1, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 1, 1, 1,
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1, 1914, 1, 1, 1, 1915, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1914, 1, 1, 1, 1, 1, 1,
+ 1, 1916, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1893,
+ 1, 1917, 1, 1914, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1914, 1, 1918, 1, 1, 1,
+ 1919, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1918, 1, 1, 1, 1,
+ 1, 1, 1, 1920, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1900, 1, 1912, 1884, 1912, 1912, 1912,
+ 1912, 1912, 1, 1, 1912, 1912, 1, 1912,
+ 1886, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1, 1, 1, 1912,
+ 1, 1912, 1, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 1, 1, 1,
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912,
+ 1912, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1908, 1921, 1, 1884, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1884, 1, 1894, 1,
+ 1, 1, 1901, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1894, 1883, 1884,
+ 1883, 1883, 1883, 1883, 1883, 1903, 1, 1883,
+ 1883, 1, 1883, 1886, 1883, 1883, 1883, 1883,
+ 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1,
+ 1, 1, 1883, 1, 1883, 1, 1883, 1883,
+ 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883,
+ 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883,
+ 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883,
+ 1, 1, 1, 1883, 1883, 1883, 1883, 1883,
+ 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883,
+ 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883,
+ 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883,
+ 1883, 1883, 1883, 1883, 1, 1922, 1, 1,
+ 1, 1923, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1922, 1924, 1925, 1924,
+ 1924, 1924, 1924, 1924, 1926, 1, 1924, 1924,
+ 1, 1924, 1927, 1924, 1924, 1924, 1924, 1924,
+ 1924, 1924, 1924, 1924, 1924, 1924, 1, 1,
+ 1, 1924, 1, 1924, 1, 1924, 1924, 1924,
+ 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924,
+ 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924,
+ 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1928,
+ 1, 1, 1924, 1924, 1924, 1924, 1924, 1924,
+ 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924,
+ 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924,
+ 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924,
+ 1924, 1924, 1924, 1, 1887, 1887, 1887, 1887,
+ 1887, 1887, 1887, 1887, 1887, 1, 1887, 1887,
+ 1929, 1887, 1887, 1887, 1887, 1887, 1887, 1887,
+ 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887,
+ 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887,
+ 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887,
+ 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887,
+ 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887,
+ 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887,
+ 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887,
+ 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887,
+ 1887, 1887, 1887, 1887, 1887, 1887, 1, 1930,
+ 1914, 1887, 1887, 1887, 1887, 1887, 1887, 1887,
+ 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887,
+ 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887,
+ 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887,
+ 1887, 1887, 1887, 1, 1931, 1, 1887, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1887, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1887,
+ 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932,
+ 1932, 1, 1932, 1932, 1933, 1932, 1932, 1932,
+ 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932,
+ 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932,
+ 1932, 1934, 1932, 1932, 1932, 1932, 1932, 1932,
+ 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932,
+ 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932,
+ 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932,
+ 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932,
+ 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932,
+ 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932,
+ 1932, 1932, 1932, 1935, 1932, 1932, 1932, 1932,
+ 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932,
+ 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932,
+ 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932,
+ 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1,
+ 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936,
+ 1936, 1, 1936, 1936, 1937, 1936, 1936, 1936,
+ 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936,
+ 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936,
+ 1936, 1938, 1936, 1936, 1936, 1936, 1936, 1936,
+ 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936,
+ 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936,
+ 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936,
+ 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936,
+ 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936,
+ 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936,
+ 1936, 1936, 1936, 1939, 1936, 1936, 1936, 1936,
+ 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936,
+ 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936,
+ 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936,
+ 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1,
+ 1940, 1, 1936, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1936, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1936, 216, 1, 1, 1,
+ 1941, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 216, 1942, 1943, 1942, 1942,
+ 1942, 1942, 1942, 1944, 1, 1942, 1942, 1,
+ 1942, 1, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1, 1, 1,
+ 1942, 1, 1942, 1, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1, 1,
+ 1, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1945, 201, 1, 1945, 1945, 1946,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 201, 1945, 1, 1945, 1945, 1945,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1947, 1945,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1945, 1945, 1, 1945, 1945, 1948,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1945, 1945, 1949, 1945, 1945, 1945,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1947, 1945,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945,
+ 1945, 1945, 1, 1950, 1, 1945, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1945, 1, 1951, 1,
+ 1, 1, 1952, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1951, 1949, 201,
+ 1949, 1949, 1949, 1949, 1949, 1953, 1, 1949,
+ 1949, 1, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1,
+ 1, 1, 1949, 204, 1949, 205, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1, 1, 1, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1, 1954, 1, 1,
+ 1, 1955, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1954, 1, 1, 1,
+ 1, 1, 1, 1, 1956, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 210, 1, 211, 1, 1957, 1,
+ 1954, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1954,
+ 1, 1958, 1, 1, 1, 1959, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1958, 1, 1, 1, 1, 1, 1, 1,
+ 1960, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 217, 1,
+ 218, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1945, 1961, 1, 201, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 201, 1, 1962, 1,
+ 1, 1, 1963, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1962, 200, 1964,
+ 200, 200, 200, 200, 200, 1965, 1, 200,
+ 200, 1, 200, 1949, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 1,
+ 1, 1, 200, 204, 200, 205, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 1, 1, 1, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 1, 1966, 1, 1,
+ 1, 1967, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1966, 220, 221, 220,
+ 220, 220, 220, 220, 1968, 1, 220, 220,
+ 1, 220, 1, 220, 220, 220, 220, 220,
+ 220, 220, 220, 220, 220, 220, 1, 1,
+ 1, 220, 210, 220, 211, 220, 220, 220,
+ 220, 220, 220, 220, 220, 220, 220, 220,
+ 220, 220, 220, 220, 220, 220, 220, 220,
+ 220, 220, 220, 220, 220, 220, 220, 1,
+ 1, 1, 220, 220, 220, 220, 220, 220,
+ 220, 220, 220, 220, 220, 220, 220, 220,
+ 220, 220, 220, 220, 220, 220, 220, 220,
+ 220, 220, 220, 220, 220, 220, 220, 220,
+ 220, 220, 220, 1, 1969, 1, 1966, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1966, 1, 1970,
+ 1, 1, 1, 1971, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1970, 1942,
+ 1943, 1942, 1942, 1942, 1942, 1942, 1972, 1,
+ 1942, 1942, 1, 1942, 1, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1, 1, 1, 1942, 217, 1942, 218, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1, 1, 1, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942,
+ 1942, 1942, 1942, 1942, 1942, 1, 1973, 1973,
+ 1973, 1973, 1973, 1973, 1973, 1973, 1974, 1,
+ 1973, 1973, 1975, 1973, 1973, 1973, 1973, 1973,
+ 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973,
+ 1973, 1973, 1973, 1973, 1973, 1974, 1973, 1934,
+ 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973,
+ 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973,
+ 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973,
+ 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973,
+ 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973,
+ 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973,
+ 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973,
+ 1973, 1976, 1973, 1973, 1973, 1973, 1973, 1973,
+ 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973,
+ 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973,
+ 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973,
+ 1973, 1973, 1973, 1973, 1973, 1, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1,
+ 1977, 1977, 1978, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1979,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1980, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1, 1981, 1,
+ 1977, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1977,
+ 1, 198, 1, 1, 1, 199, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 198, 1949, 201, 1949, 1949, 1949, 1949, 1949,
+ 202, 1, 1949, 1949, 1, 1949, 203, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1, 1, 1, 1949, 204, 1949,
+ 205, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1, 1, 1, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1982, 1, 1977, 1977, 1983, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1982, 1977, 1938, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1980, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977,
+ 1, 1984, 1, 1982, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1982, 1, 1985, 1985, 1985, 1985,
+ 1985, 1985, 1985, 1985, 1986, 1, 1985, 1985,
+ 1987, 1985, 1985, 1985, 1985, 1985, 1985, 1985,
+ 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985,
+ 1985, 1985, 1985, 1986, 1985, 1988, 1985, 1985,
+ 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985,
+ 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985,
+ 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985,
+ 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985,
+ 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985,
+ 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985,
+ 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1989,
+ 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985,
+ 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985,
+ 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985,
+ 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985,
+ 1985, 1985, 1985, 1, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1, 1990, 1990,
+ 1991, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1992, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1993,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1, 1994, 1, 1990, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1990, 1, 1995,
+ 1, 1, 1, 1996, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1995, 1949,
+ 201, 1949, 1949, 1949, 1949, 1949, 1997, 1,
+ 1949, 1949, 1, 1949, 203, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1, 1, 1, 1949, 204, 1949, 1998, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1, 1, 1, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1, 1999, 1,
+ 1, 1, 2000, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1999, 1, 1,
+ 1, 1, 1, 1, 1, 2001, 1, 1,
+ 1, 1, 1, 209, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 210, 1, 2002, 1, 2003,
+ 1, 1999, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1999, 1, 2004, 1, 1, 1, 2005, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2004, 1, 1, 1, 1, 1, 1,
+ 1, 2006, 1, 1, 1, 1, 1, 216,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 217,
+ 1, 2007, 1, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 2008, 1, 1990, 1990,
+ 2009, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 2008, 1990, 2010, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1993,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1990,
+ 1990, 1990, 1990, 1, 2011, 1, 2008, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2008, 1, 2012,
+ 1, 1, 1, 2013, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2012, 1,
+ 1, 1, 1, 1, 1, 1, 2014, 1,
+ 1, 1, 1, 1, 209, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 210, 1, 2015, 1,
+ 2016, 1, 2012, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2012, 1, 2017, 1, 1, 1, 2018,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2017, 1, 1, 1, 1, 1,
+ 1, 1, 2019, 1, 1, 1, 1, 1,
+ 216, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 217, 1, 2020, 1, 2021, 1, 1, 1,
+ 2022, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2021, 2023, 2024, 2023, 2023,
+ 2023, 2023, 2023, 2025, 1, 2023, 2023, 2026,
+ 2023, 2027, 2023, 2023, 2023, 2023, 2023, 2023,
+ 2023, 2023, 2023, 2023, 2023, 1, 1, 1,
+ 2023, 1, 2023, 2028, 2023, 2023, 2023, 2023,
+ 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023,
+ 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023,
+ 2023, 2023, 2023, 2023, 2023, 2023, 1, 1,
+ 1, 2023, 2023, 2023, 2023, 2023, 2023, 2023,
+ 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023,
+ 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023,
+ 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023,
+ 2023, 2023, 1, 195, 1, 1, 1, 2029,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 195, 1, 1, 1, 1, 1,
+ 1, 1, 2030, 1, 1, 1, 195, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 196, 1, 2031, 1, 195, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 195, 1, 2026,
+ 1, 1, 1, 2032, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2026, 1,
+ 1, 1, 1, 1, 1, 1, 2033, 1,
+ 1, 1, 2026, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2028, 1,
+ 2034, 1, 1, 1, 2035, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2034,
+ 2036, 2037, 2036, 2036, 2036, 2036, 2036, 2038,
+ 1, 2036, 2036, 1, 2036, 2039, 2036, 2036,
+ 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036,
+ 2036, 1, 1, 1, 2036, 1, 2036, 1,
+ 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036,
+ 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036,
+ 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036,
+ 2036, 2036, 2040, 1, 1, 2036, 2036, 2036,
+ 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036,
+ 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036,
+ 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036,
+ 2036, 2036, 2036, 2036, 2036, 2036, 1, 2041,
+ 1, 1, 1, 2042, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2041, 2043,
+ 2044, 2043, 2043, 2043, 2043, 2043, 2045, 1,
+ 2043, 2043, 1, 2043, 2046, 2043, 2043, 2043,
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 1, 1, 1, 2043, 1, 2043, 1, 2043,
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 2043, 2047, 1, 1, 2043, 2043, 2043, 2043,
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 2043, 2043, 2043, 2043, 2043, 1, 2048, 1,
+ 2041, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2041,
+ 1, 2049, 1, 1, 1, 2050, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2049, 2043, 2044, 2043, 2043, 2043, 2043, 2043,
+ 2051, 1, 2043, 2043, 2052, 2043, 2053, 2043,
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 2043, 2043, 2054, 1, 1, 2043, 1, 2043,
+ 1, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 2043, 2043, 2043, 1, 1, 1, 2043, 2043,
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 1,
+ 2049, 1, 1, 1, 2050, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2049,
+ 1, 1, 1, 1, 1, 1, 1, 2051,
+ 1, 1, 1, 2052, 1, 2055, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2054, 1, 2056, 1, 2049, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2049, 1, 2057, 1,
+ 1, 1, 2058, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2057, 1, 1,
+ 1, 1, 1, 1, 1, 2059, 1, 1,
+ 1, 2060, 1, 2061, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2062,
+ 1, 2063, 1, 1, 1, 2064, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2063, 1, 1, 1, 1, 1, 1, 1,
+ 2065, 1, 1, 1, 2063, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2066, 1, 1, 1, 1, 1,
+ 196, 1, 2067, 1, 2063, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2063, 1, 2068, 1, 1,
+ 1, 2069, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2068, 1, 1, 1,
+ 1, 1, 1, 1, 2070, 1, 1, 1,
+ 2068, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2071, 1,
+ 1, 1, 1, 1, 2028, 1, 2072, 1,
+ 1, 1, 2073, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2072, 2074, 2075,
+ 2074, 2074, 2074, 2074, 2074, 2076, 1, 2074,
+ 2074, 1, 2074, 2077, 2074, 2074, 2074, 2074,
+ 2074, 2074, 2074, 2074, 2074, 2074, 2074, 1,
+ 1, 1, 2074, 1, 2074, 1, 2074, 2074,
+ 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074,
+ 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074,
+ 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074,
+ 1, 1, 1, 2074, 2074, 2074, 2074, 2074,
+ 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074,
+ 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074,
+ 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074,
+ 2074, 2074, 2074, 2074, 1, 2078, 1, 1,
+ 1, 2079, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2078, 186, 187, 186,
+ 186, 186, 186, 186, 2080, 1, 186, 186,
+ 1, 186, 190, 186, 186, 186, 186, 186,
+ 186, 186, 186, 186, 186, 186, 1, 1,
+ 1, 186, 1, 186, 1, 186, 186, 186,
+ 186, 186, 186, 186, 186, 186, 186, 186,
+ 186, 186, 186, 186, 186, 186, 186, 186,
+ 186, 186, 186, 186, 186, 186, 186, 1,
+ 1, 1, 186, 186, 186, 186, 186, 186,
+ 186, 186, 186, 186, 186, 186, 186, 186,
+ 186, 186, 186, 186, 186, 186, 186, 186,
+ 186, 186, 186, 186, 186, 186, 186, 186,
+ 186, 186, 186, 1, 2081, 1, 2078, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2078, 1, 2082,
+ 1, 1, 1, 2083, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2082, 2023,
+ 2024, 2023, 2023, 2023, 2023, 2023, 2084, 1,
+ 2023, 2023, 1, 2023, 2027, 2023, 2023, 2023,
+ 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023,
+ 1, 1, 1, 2023, 1, 2023, 1, 2023,
+ 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023,
+ 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023,
+ 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023,
+ 2023, 1, 1, 1, 2023, 2023, 2023, 2023,
+ 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023,
+ 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023,
+ 2023, 2023, 2023, 2023, 2023, 2023, 2023, 2023,
+ 2023, 2023, 2023, 2023, 2023, 1, 1949, 201,
+ 1949, 1949, 1949, 1949, 1949, 1, 1, 1949,
+ 1949, 1, 1949, 2085, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1,
+ 1, 1, 1949, 1, 1949, 1, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1, 1, 1, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949,
+ 1949, 1949, 1949, 1949, 1, 2055, 1, 1,
+ 1, 2086, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2055, 2087, 1, 2087,
+ 2087, 2087, 2087, 2087, 2088, 1, 2087, 2087,
+ 1, 2087, 1, 2087, 2087, 2087, 2087, 2087,
+ 2087, 2087, 2087, 2087, 2087, 2087, 1, 1,
+ 1, 2087, 1, 2087, 1, 2087, 2087, 2087,
+ 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087,
+ 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087,
+ 2087, 2087, 2087, 2087, 2087, 2087, 2087, 1,
+ 1, 1, 2087, 2087, 2087, 2087, 2087, 2087,
+ 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087,
+ 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087,
+ 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087,
+ 2087, 2087, 2087, 1, 2089, 1, 2055, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2055, 1, 2049,
+ 1, 1, 1, 2050, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2049, 2087,
+ 1, 2087, 2087, 2087, 2087, 2087, 2051, 1,
+ 2087, 2087, 2052, 2087, 2055, 2087, 2087, 2087,
+ 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087,
+ 2054, 1, 1, 2087, 1, 2087, 1, 2087,
+ 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087,
+ 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087,
+ 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087,
+ 2087, 1, 1, 1, 2087, 2087, 2087, 2087,
+ 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087,
+ 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087,
+ 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087,
+ 2087, 2087, 2087, 2087, 2087, 1, 2061, 1,
+ 1, 1, 2090, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2061, 2091, 1,
+ 2091, 2091, 2091, 2091, 2091, 2092, 1, 2091,
+ 2091, 1, 2091, 1, 2091, 2091, 2091, 2091,
+ 2091, 2091, 2091, 2091, 2091, 2091, 2091, 1,
+ 1, 1, 2091, 1, 2091, 1, 2091, 2091,
+ 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
+ 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
+ 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
+ 1, 1, 1, 2091, 2091, 2091, 2091, 2091,
+ 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
+ 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
+ 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
+ 2091, 2091, 2091, 2091, 1, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2044, 1, 2093,
+ 2093, 2094, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2044, 2093, 1, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2095, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 1, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2093, 1, 2093,
+ 2093, 2096, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2093, 2097, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2095, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 2093, 2093, 2093, 2093,
+ 2093, 2093, 2093, 2093, 1, 2098, 1, 2093,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2093, 1,
+ 2099, 1, 1, 1, 2100, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2099,
+ 2097, 2044, 2097, 2097, 2097, 2097, 2097, 2101,
+ 1, 2097, 2097, 2052, 2097, 2046, 2097, 2097,
+ 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097,
+ 2097, 2054, 1, 1, 2097, 1, 2097, 1,
+ 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097,
+ 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097,
+ 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097,
+ 2097, 2097, 1, 1, 1, 2097, 2097, 2097,
+ 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097,
+ 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097,
+ 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097,
+ 2097, 2097, 2097, 2097, 2097, 2097, 1, 2099,
+ 1, 1, 1, 2100, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2099, 1,
+ 1, 1, 1, 1, 1, 1, 2101, 1,
+ 1, 1, 2052, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2054, 1, 2102, 1, 2099, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2099, 1, 2103, 1, 1,
+ 1, 2104, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2103, 1, 1, 1,
+ 1, 1, 1, 1, 2105, 1, 1, 1,
+ 2060, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2062, 1,
+ 2097, 2044, 2097, 2097, 2097, 2097, 2097, 1,
+ 1, 2097, 2097, 1, 2097, 2046, 2097, 2097,
+ 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097,
+ 2097, 1, 1, 1, 2097, 1, 2097, 1,
+ 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097,
+ 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097,
+ 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097,
+ 2097, 2097, 1, 1, 1, 2097, 2097, 2097,
+ 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097,
+ 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097,
+ 2097, 2097, 2097, 2097, 2097, 2097, 2097, 2097,
+ 2097, 2097, 2097, 2097, 2097, 2097, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2093,
+ 2106, 1, 2044, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2044, 1, 2055, 1, 1, 1, 2086,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2055, 2043, 2044, 2043, 2043, 2043,
+ 2043, 2043, 2088, 1, 2043, 2043, 1, 2043,
+ 2046, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 2043, 2043, 2043, 2043, 1, 1, 1, 2043,
+ 1, 2043, 1, 2043, 2043, 2043, 2043, 2043,
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 2043, 2043, 2043, 2043, 2043, 1, 1, 1,
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043,
+ 2043, 1, 2107, 1, 1, 1, 2108, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2107, 2109, 2110, 2109, 2109, 2109, 2109,
+ 2109, 2111, 1, 2109, 2109, 1, 2109, 2112,
+ 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109,
+ 2109, 2109, 2109, 1, 1, 1, 2109, 1,
+ 2109, 1, 2109, 2109, 2109, 2109, 2109, 2109,
+ 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109,
+ 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109,
+ 2109, 2109, 2109, 2109, 2113, 1, 1, 2109,
+ 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109,
+ 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109,
+ 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109,
+ 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109,
+ 1, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 1, 2047, 2047, 2114, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 1, 2115, 2099, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 1, 2116, 1, 2047, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2047, 1, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047,
+ 2047, 2047, 2047, 2047, 1, 2117, 1, 1,
+ 1, 2118, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2117, 1179, 1180, 1179,
+ 1179, 1179, 1179, 1179, 2119, 1, 1179, 1179,
+ 2120, 1179, 1183, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1, 1184,
+ 183, 1179, 1, 1179, 1, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1,
+ 1, 1, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+ 1179, 1179, 1179, 1, 2121, 1, 1, 1,
+ 2122, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2121, 1187, 1188, 1187, 1187,
+ 1187, 1187, 1187, 2123, 1, 1187, 1187, 118,
+ 1187, 1190, 1187, 1187, 1187, 1187, 1187, 1187,
+ 1187, 1187, 1187, 1187, 1187, 1, 120, 1191,
+ 1187, 1, 1187, 1192, 1187, 1187, 1187, 1187,
+ 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187,
+ 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187,
+ 1187, 1187, 1187, 1187, 1187, 1187, 1, 1,
+ 1, 1187, 1187, 1187, 1187, 1187, 1187, 1187,
+ 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187,
+ 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187,
+ 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187,
+ 1187, 1187, 1, 2124, 1, 1, 1, 2125,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2124, 1195, 1196, 1195, 1195, 1195,
+ 1195, 1195, 2126, 1, 1195, 1195, 118, 1195,
+ 1198, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
+ 1195, 1195, 1195, 1195, 1, 120, 1199, 1195,
+ 1, 1195, 1, 1195, 1195, 1195, 1195, 1195,
+ 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
+ 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
+ 1195, 1195, 1195, 1195, 1195, 1, 1, 1,
+ 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
+ 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
+ 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
+ 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
+ 1195, 1, 2127, 1, 2124, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2124, 1, 2128, 1, 1,
+ 1, 2129, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2128, 1828, 1829, 1828,
+ 1828, 1828, 1828, 1828, 2130, 1, 1828, 1828,
+ 2120, 1828, 1831, 1828, 1828, 1828, 1828, 1828,
+ 1828, 1828, 1828, 1828, 1828, 1828, 1, 1184,
+ 1253, 1828, 1, 1828, 1, 1828, 1828, 1828,
+ 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828,
+ 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828,
+ 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1,
+ 1, 1, 1828, 1828, 1828, 1828, 1828, 1828,
+ 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828,
+ 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828,
+ 1828, 1828, 1828, 1828, 1828, 1828, 1828, 1828,
+ 1828, 1828, 1828, 1, 2131, 1, 1, 1,
+ 2132, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2131, 2133, 2134, 2133, 2133,
+ 2133, 2133, 2133, 2135, 1, 2133, 2133, 1,
+ 2133, 2136, 2133, 2133, 2133, 2133, 2133, 2133,
+ 2133, 2133, 2133, 2133, 2133, 18, 1, 19,
+ 2133, 1, 2133, 17, 2133, 2133, 2133, 2133,
+ 2133, 2133, 2133, 2133, 2133, 2133, 2133, 2133,
+ 2133, 2133, 2133, 2133, 2133, 2133, 2133, 2133,
+ 2133, 2133, 2133, 2133, 2133, 2133, 2137, 1,
+ 1, 2133, 2133, 2133, 2133, 2133, 2133, 2133,
+ 2133, 2133, 2133, 2133, 2133, 2133, 2133, 2133,
+ 2133, 2133, 2133, 2133, 2133, 2133, 2133, 2133,
+ 2133, 2133, 2133, 2133, 2133, 2133, 2133, 2133,
+ 2133, 2133, 1, 2138, 1, 1, 1, 2139,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2138, 2140, 2141, 2140, 2140, 2140,
+ 2140, 2140, 2142, 1, 2140, 2140, 1, 2140,
+ 2143, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 1, 1, 8, 2140,
+ 1, 2140, 1, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2144, 1, 1,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 1, 2145, 1, 2138, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2138, 1, 2146, 1, 2147,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2147, 1,
+ 2148, 1, 1, 1, 2149, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2148,
+ 2150, 15, 2150, 2150, 2150, 2150, 2150, 2151,
+ 1, 2150, 2150, 1, 2150, 17, 2150, 2150,
+ 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
+ 2150, 18, 1, 19, 2150, 1, 2150, 17,
+ 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
+ 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
+ 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
+ 2150, 2150, 1, 1, 1, 2150, 2150, 2150,
+ 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
+ 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
+ 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
+ 2150, 2150, 2150, 2150, 2150, 2150, 1, 2152,
+ 1, 1, 1, 2153, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2152, 2150,
+ 15, 2150, 2150, 2150, 2150, 2150, 2154, 1,
+ 2150, 2150, 1, 2150, 1, 2150, 2150, 2150,
+ 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
+ 1, 1, 8, 2150, 1, 2150, 1, 2150,
+ 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
+ 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
+ 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
+ 2150, 1, 1, 1, 2150, 2150, 2150, 2150,
+ 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
+ 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
+ 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
+ 2150, 2150, 2150, 2150, 2150, 1, 2155, 1,
+ 2152, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2152,
+ 1, 2156, 1, 1, 1, 2157, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2156, 2158, 33, 2158, 2158, 2158, 2158, 2158,
+ 2159, 1, 2158, 2158, 1, 2158, 1, 2158,
+ 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158,
+ 2158, 2158, 1, 1, 48, 2158, 1, 2158,
+ 1, 2158, 2158, 2158, 2158, 2158, 2158, 2158,
+ 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158,
+ 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158,
+ 2158, 2158, 2158, 1, 1, 1, 2158, 2158,
+ 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158,
+ 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158,
+ 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158,
+ 2158, 2158, 2158, 2158, 2158, 2158, 2158, 1,
+ 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160,
+ 2161, 1, 2160, 2160, 2162, 2160, 2160, 2160,
+ 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160,
+ 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2161,
+ 2160, 23, 2160, 2160, 2160, 2160, 2160, 2160,
+ 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160,
+ 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160,
+ 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160,
+ 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160,
+ 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160,
+ 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160,
+ 2160, 2160, 2160, 2163, 2160, 2160, 2160, 2160,
+ 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160,
+ 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160,
+ 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160,
+ 2160, 2160, 2160, 2160, 2160, 2160, 2160, 1,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 1, 2164, 2164, 2165, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2166, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2167, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 1,
+ 2168, 1, 2164, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2164, 1, 2169, 1, 2170, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2170, 1, 38, 1,
+ 1, 1, 39, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 38, 2171, 2141,
+ 2171, 2171, 2171, 2171, 2171, 40, 1, 2171,
+ 2171, 1, 2171, 2172, 2171, 2171, 2171, 2171,
+ 2171, 2171, 2171, 2171, 2171, 2171, 2171, 18,
+ 1, 19, 2171, 1, 2171, 17, 2171, 2171,
+ 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
+ 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
+ 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
+ 1, 1, 1, 2171, 2171, 2171, 2171, 2171,
+ 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
+ 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
+ 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
+ 2171, 2171, 2171, 2171, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2173, 1,
+ 2164, 2164, 2174, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2173, 2164, 27,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2167, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
+ 2164, 2164, 2164, 2164, 2164, 1, 2175, 1,
+ 2173, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2173,
+ 1, 2148, 1, 1, 1, 2149, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2148, 2140, 2141, 2140, 2140, 2140, 2140, 2140,
+ 2151, 1, 2140, 2140, 1, 2140, 2172, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 18, 1, 19, 2140, 1, 2140,
+ 17, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 1, 1, 1, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 1,
+ 2176, 1, 1, 1, 2177, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2176,
+ 2178, 2179, 2178, 2178, 2178, 2178, 2178, 2180,
+ 1, 2178, 2178, 1, 2178, 2181, 2178, 2178,
+ 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178,
+ 2178, 1, 1, 48, 2178, 1, 2178, 1,
+ 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178,
+ 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178,
+ 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178,
+ 2178, 2178, 2182, 1, 1, 2178, 2178, 2178,
+ 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178,
+ 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178,
+ 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178,
+ 2178, 2178, 2178, 2178, 2178, 2178, 1, 2183,
+ 2184, 2183, 2183, 2183, 2183, 2183, 1, 1,
+ 2183, 2183, 1, 2183, 2143, 2183, 2183, 2183,
+ 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183,
+ 1, 1, 1, 2183, 1, 2183, 1, 2183,
+ 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183,
+ 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183,
+ 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183,
+ 2183, 1, 1, 1, 2183, 2183, 2183, 2183,
+ 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183,
+ 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183,
+ 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183,
+ 2183, 2183, 2183, 2183, 2183, 1, 2185, 1,
+ 2186, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2186,
+ 1, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2184, 1, 2187, 2187, 2188, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 2184, 2187, 1, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2189, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 1, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2187, 1, 2187, 2187, 2190, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2187, 2183, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2189, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
+ 1, 2191, 1, 2187, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2187, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2187, 2192, 1, 2184,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2184, 1,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 1, 2144, 2144, 2193, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 1, 2194, 2186, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 1,
+ 2195, 1, 2144, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2144, 1, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144,
+ 2144, 2144, 2144, 1, 2196, 2196, 2196, 2196,
+ 2196, 2196, 2196, 2196, 2196, 1, 2196, 2196,
+ 2197, 2196, 2196, 2196, 2196, 2196, 2196, 2196,
+ 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196,
+ 2196, 2196, 2196, 2196, 2196, 2198, 2196, 2196,
+ 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196,
+ 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196,
+ 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196,
+ 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196,
+ 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196,
+ 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196,
+ 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2199,
+ 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196,
+ 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196,
+ 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196,
+ 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196,
+ 2196, 2196, 2196, 1, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 1, 2200, 2200,
+ 2201, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2202, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2203,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 1, 2204, 1, 2200, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2200, 1, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200,
+ 2200, 2200, 2200, 2200, 2200, 2200, 2200, 1,
+ 2205, 1, 1, 1, 2206, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2205,
+ 2207, 2208, 2207, 2207, 2207, 2207, 2207, 2209,
+ 1, 2207, 2207, 1, 2207, 1, 2207, 2207,
+ 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207,
+ 2207, 1, 1, 48, 2207, 1, 2207, 1,
+ 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207,
+ 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207,
+ 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207,
+ 2207, 2207, 1, 1, 1, 2207, 2207, 2207,
+ 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207,
+ 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207,
+ 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207,
+ 2207, 2207, 2207, 2207, 2207, 2207, 1, 2210,
+ 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2211,
+ 1, 2210, 2210, 2212, 2210, 2210, 2210, 2210,
+ 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210,
+ 2210, 2210, 2210, 2210, 2210, 2210, 2211, 2210,
+ 23, 2210, 2210, 2210, 2210, 2210, 2210, 2210,
+ 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210,
+ 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210,
+ 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210,
+ 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210,
+ 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210,
+ 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210,
+ 2210, 2210, 2213, 2210, 2210, 2210, 2210, 2210,
+ 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210,
+ 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210,
+ 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210,
+ 2210, 2210, 2210, 2210, 2210, 2210, 1, 2214,
+ 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
+ 1, 2214, 2214, 2215, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
+ 2216, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2217, 2214, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2214, 2214, 2214, 2214, 1, 2218,
+ 1, 2214, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2214, 1, 2219, 1, 2220, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2220, 1, 2221, 1, 2222,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2222, 1,
+ 2223, 1, 1, 1, 2224, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2223,
+ 2225, 2226, 2225, 2225, 2225, 2225, 2225, 2227,
+ 1, 2225, 2225, 1, 2225, 2228, 2225, 2225,
+ 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225,
+ 2225, 1, 1, 1, 2225, 1, 2225, 1,
+ 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225,
+ 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225,
+ 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225,
+ 2225, 2225, 2137, 1, 1, 2225, 2225, 2225,
+ 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225,
+ 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225,
+ 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225,
+ 2225, 2225, 2225, 2225, 2225, 2225, 1, 2229,
+ 1, 1, 1, 2230, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2229, 2231,
+ 2184, 2231, 2231, 2231, 2231, 2231, 2232, 1,
+ 2231, 2231, 1, 2231, 2143, 2231, 2231, 2231,
+ 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
+ 1, 1, 1, 2231, 1, 2231, 1, 2231,
+ 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
+ 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
+ 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
+ 2231, 2144, 1, 1, 2231, 2231, 2231, 2231,
+ 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
+ 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
+ 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
+ 2231, 2231, 2231, 2231, 2231, 1, 2233, 1,
+ 2229, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2229,
+ 1, 2234, 1, 2235, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2235, 1, 2236, 1, 1, 1,
+ 2237, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2236, 2238, 1, 2238, 2238,
+ 2238, 2238, 2238, 2239, 1, 2238, 2238, 1,
+ 2238, 1, 2238, 2238, 2238, 2238, 2238, 2238,
+ 2238, 2238, 2238, 2238, 2238, 1, 1, 1,
+ 2238, 1, 2238, 1, 2238, 2238, 2238, 2238,
+ 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
+ 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
+ 2238, 2238, 2238, 2238, 2238, 2238, 1, 1,
+ 1, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
+ 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
+ 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
+ 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
+ 2238, 2238, 1, 2240, 1, 2236, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2236, 1, 2241, 1,
+ 1, 1, 2242, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2241, 2243, 1,
+ 2243, 2243, 2243, 2243, 2243, 2244, 1, 2243,
+ 2243, 1, 2243, 1, 2243, 2243, 2243, 2243,
+ 2243, 2243, 2243, 2243, 2243, 2243, 2243, 1,
+ 1, 1, 2243, 1, 2243, 1, 2243, 2243,
+ 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243,
+ 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243,
+ 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243,
+ 1, 1, 1, 2243, 2243, 2243, 2243, 2243,
+ 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243,
+ 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243,
+ 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243,
+ 2243, 2243, 2243, 2243, 1, 2236, 1, 1,
+ 1, 2237, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2236, 2231, 2184, 2231,
+ 2231, 2231, 2231, 2231, 2239, 1, 2231, 2231,
+ 1, 2231, 2143, 2231, 2231, 2231, 2231, 2231,
+ 2231, 2231, 2231, 2231, 2231, 2231, 1, 1,
+ 1, 2231, 1, 2231, 1, 2231, 2231, 2231,
+ 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
+ 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
+ 2231, 2231, 2231, 2231, 2231, 2231, 2231, 1,
+ 1, 1, 2231, 2231, 2231, 2231, 2231, 2231,
+ 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
+ 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
+ 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
+ 2231, 2231, 2231, 1, 2245, 1, 1, 1,
+ 2246, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2245, 2247, 2248, 2247, 2247,
+ 2247, 2247, 2247, 2249, 1, 2247, 2247, 1,
+ 2247, 2181, 2247, 2247, 2247, 2247, 2247, 2247,
+ 2247, 2247, 2247, 2247, 2247, 1, 1, 1,
+ 2247, 1, 2247, 1, 2247, 2247, 2247, 2247,
+ 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247,
+ 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247,
+ 2247, 2247, 2247, 2247, 2247, 2247, 2182, 1,
+ 1, 2247, 2247, 2247, 2247, 2247, 2247, 2247,
+ 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247,
+ 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247,
+ 2247, 2247, 2247, 2247, 2247, 2247, 2247, 2247,
+ 2247, 2247, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2214, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2214, 2214, 2250, 1, 2214, 2214,
+ 2251, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2214, 2250, 2214, 27, 2214, 2214,
+ 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2217,
+ 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
+ 2214, 2214, 2214, 1, 2252, 1, 2250, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2250, 1, 2253,
+ 1, 2254, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2254, 1, 2255, 2255, 2255, 2255, 2255, 2255,
+ 2255, 2255, 2256, 1, 2255, 2255, 2257, 2255,
+ 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255,
+ 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255,
+ 2255, 2256, 2255, 2198, 2255, 2255, 2255, 2255,
+ 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255,
+ 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255,
+ 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255,
+ 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255,
+ 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255,
+ 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255,
+ 2255, 2255, 2255, 2255, 2255, 2258, 2255, 2255,
+ 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255,
+ 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255,
+ 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255,
+ 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2255,
+ 2255, 1, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 1, 2259, 2259, 2260, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2261, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2262, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 1, 2263, 1, 2259, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2259, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2264, 1,
+ 2259, 2259, 2265, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2264, 2259, 2202,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2262, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259,
+ 2259, 2259, 2259, 2259, 2259, 1, 2266, 1,
+ 2264, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2264,
+ 1, 2267, 2267, 2267, 2267, 2267, 2267, 2267,
+ 2267, 2268, 1, 2267, 2267, 2269, 2267, 2267,
+ 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267,
+ 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267,
+ 2268, 2267, 2270, 2267, 2267, 2267, 2267, 2267,
+ 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267,
+ 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267,
+ 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267,
+ 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267,
+ 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267,
+ 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267,
+ 2267, 2267, 2267, 2267, 2271, 2267, 2267, 2267,
+ 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267,
+ 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267,
+ 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267,
+ 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267,
+ 1, 2272, 2272, 2272, 2272, 2272, 2272, 2272,
+ 2272, 2272, 1, 2272, 2272, 2273, 2272, 2272,
+ 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272,
+ 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272,
+ 2272, 2272, 2274, 2272, 2272, 2272, 2272, 2272,
+ 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272,
+ 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272,
+ 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272,
+ 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272,
+ 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272,
+ 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272,
+ 2272, 2272, 2272, 2272, 2275, 2272, 2272, 2272,
+ 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272,
+ 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272,
+ 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272,
+ 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272,
+ 1, 2276, 1, 2272, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2272, 1, 2277, 1, 2278, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2278, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2272,
+ 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272,
+ 2279, 1, 2272, 2272, 2280, 2272, 2272, 2272,
+ 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272,
+ 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2279,
+ 2272, 2281, 2272, 2272, 2272, 2272, 2272, 2272,
+ 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272,
+ 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272,
+ 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272,
+ 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272,
+ 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272,
+ 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272,
+ 2272, 2272, 2272, 2275, 2272, 2272, 2272, 2272,
+ 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272,
+ 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272,
+ 2272, 2272, 2272, 2272, 2272, 2272, 2272, 2272,
+ 2272, 2272, 2272, 2272, 2272, 2272, 2272, 1,
+ 2282, 1, 2279, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2279, 1, 2283, 1, 2284, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2284, 1, 2285, 1,
+ 1, 1, 2286, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2285, 2287, 2288,
+ 2287, 2287, 2287, 2287, 2287, 2289, 1, 2287,
+ 2287, 1, 2287, 2290, 2287, 2287, 2287, 2287,
+ 2287, 2287, 2287, 2287, 2287, 2287, 2287, 1,
+ 1, 48, 2287, 1, 2287, 1, 2287, 2287,
+ 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287,
+ 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287,
+ 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287,
+ 1, 1, 1, 2287, 2287, 2287, 2287, 2287,
+ 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287,
+ 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287,
+ 2287, 2287, 2287, 2287, 2287, 2287, 2287, 2287,
+ 2287, 2287, 2287, 2287, 1, 2291, 1, 1,
+ 1, 2292, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2291, 2293, 2294, 2293,
+ 2293, 2293, 2293, 2293, 2295, 1, 2293, 2293,
+ 1, 2293, 2296, 2293, 2293, 2293, 2293, 2293,
+ 2293, 2293, 2293, 2293, 2293, 2293, 1, 1,
+ 8, 2293, 1, 2293, 1, 2293, 2293, 2293,
+ 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2293,
+ 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2293,
+ 2293, 2293, 2293, 2293, 2293, 2293, 2293, 1,
+ 1, 1, 2293, 2293, 2293, 2293, 2293, 2293,
+ 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2293,
+ 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2293,
+ 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2293,
+ 2293, 2293, 2293, 1, 2297, 1, 2291, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2291, 1, 2298,
+ 2299, 2298, 2298, 2298, 2298, 2298, 1, 1,
+ 2298, 2298, 1, 2298, 2300, 2298, 2298, 2298,
+ 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298,
+ 1, 1, 1, 2298, 1, 2298, 1, 2298,
+ 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298,
+ 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298,
+ 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298,
+ 2298, 1, 1, 1, 2298, 2298, 2298, 2298,
+ 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298,
+ 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298,
+ 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298,
+ 2298, 2298, 2298, 2298, 2298, 1, 2301, 1,
+ 2302, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2302,
+ 1, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2299, 1, 2303, 2303, 2304, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2299, 2303, 1, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2305, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 1, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 1, 2303, 2303, 2306, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2298, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2305, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303,
+ 1, 2307, 1, 2303, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2303, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2303, 2308, 1, 2299,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2299, 1,
+ 38, 1, 1, 1, 39, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 38,
+ 2309, 2310, 2309, 2309, 2309, 2309, 2309, 40,
+ 1, 2309, 2309, 1, 2309, 2311, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 18, 1, 19, 2309, 1, 2309, 17,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 1, 1, 1, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 1, 2312,
+ 1, 1, 1, 2313, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2312, 2314,
+ 2315, 2314, 2314, 2314, 2314, 2314, 2316, 1,
+ 2314, 2314, 1, 2314, 2317, 2314, 2314, 2314,
+ 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314,
+ 1, 1, 1, 2314, 1, 2314, 1, 2314,
+ 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314,
+ 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314,
+ 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314,
+ 2314, 2318, 1, 1, 2314, 2314, 2314, 2314,
+ 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314,
+ 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314,
+ 2314, 2314, 2314, 2314, 2314, 2314, 2314, 2314,
+ 2314, 2314, 2314, 2314, 2314, 1, 2319, 1,
+ 1, 1, 2320, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2319, 2321, 2322,
+ 2321, 2321, 2321, 2321, 2321, 2323, 1, 2321,
+ 2321, 1, 2321, 2324, 2321, 2321, 2321, 2321,
+ 2321, 2321, 2321, 2321, 2321, 2321, 2321, 1,
+ 1, 1, 2321, 1, 2321, 1, 2321, 2321,
+ 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321,
+ 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321,
+ 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321,
+ 2325, 1, 1, 2321, 2321, 2321, 2321, 2321,
+ 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321,
+ 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321,
+ 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321,
+ 2321, 2321, 2321, 2321, 1, 2326, 1, 2319,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2319, 1,
+ 2327, 1, 1, 1, 2328, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2327,
+ 2321, 2322, 2321, 2321, 2321, 2321, 2321, 2329,
+ 1, 2321, 2321, 1, 2321, 2330, 2321, 2321,
+ 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321,
+ 2321, 1, 1, 1, 2321, 2331, 2321, 1,
+ 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321,
+ 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321,
+ 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321,
+ 2321, 2321, 1, 1, 1, 2321, 2321, 2321,
+ 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321,
+ 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321,
+ 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321,
+ 2321, 2321, 2321, 2321, 2321, 2321, 1, 2327,
+ 1, 1, 1, 2328, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2327, 1,
+ 1, 1, 1, 1, 1, 1, 2329, 1,
+ 1, 1, 1, 1, 2332, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2331, 1, 2333, 1,
+ 2327, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2327,
+ 1, 2334, 1, 1, 1, 2335, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2334, 1, 1, 1, 1, 1, 1, 1,
+ 2336, 1, 1, 1, 1, 1, 2337, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2338, 1,
+ 2332, 1, 1, 1, 2339, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2332,
+ 2340, 1, 2340, 2340, 2340, 2340, 2340, 2341,
+ 1, 2340, 2340, 1, 2340, 1, 2340, 2340,
+ 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340,
+ 2340, 1, 1, 1, 2340, 1, 2340, 1,
+ 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340,
+ 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340,
+ 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340,
+ 2340, 2340, 1, 1, 1, 2340, 2340, 2340,
+ 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340,
+ 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340,
+ 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340,
+ 2340, 2340, 2340, 2340, 2340, 2340, 1, 2342,
+ 1, 2332, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2332, 1, 2327, 1, 1, 1, 2328, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2327, 2340, 1, 2340, 2340, 2340, 2340,
+ 2340, 2329, 1, 2340, 2340, 1, 2340, 2332,
+ 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340,
+ 2340, 2340, 2340, 1, 1, 1, 2340, 2331,
+ 2340, 1, 2340, 2340, 2340, 2340, 2340, 2340,
+ 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340,
+ 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340,
+ 2340, 2340, 2340, 2340, 1, 1, 1, 2340,
+ 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340,
+ 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340,
+ 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340,
+ 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340,
+ 1, 2337, 1, 1, 1, 2343, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2337, 2344, 1, 2344, 2344, 2344, 2344, 2344,
+ 2345, 1, 2344, 2344, 1, 2344, 1, 2344,
+ 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344,
+ 2344, 2344, 1, 1, 1, 2344, 1, 2344,
+ 1, 2344, 2344, 2344, 2344, 2344, 2344, 2344,
+ 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344,
+ 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344,
+ 2344, 2344, 2344, 1, 1, 1, 2344, 2344,
+ 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344,
+ 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344,
+ 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344,
+ 2344, 2344, 2344, 2344, 2344, 2344, 2344, 1,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2322, 1, 2346, 2346, 2347, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2322,
+ 2346, 1, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2348, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 1,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 1, 2346, 2346, 2349, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2350, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2348, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 1,
+ 2351, 1, 2346, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2346, 1, 2352, 1, 1, 1, 2353,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2352, 2350, 2322, 2350, 2350, 2350,
+ 2350, 2350, 2354, 1, 2350, 2350, 1, 2350,
+ 2324, 2350, 2350, 2350, 2350, 2350, 2350, 2350,
+ 2350, 2350, 2350, 2350, 1, 1, 1, 2350,
+ 2331, 2350, 1, 2350, 2350, 2350, 2350, 2350,
+ 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350,
+ 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350,
+ 2350, 2350, 2350, 2350, 2350, 1, 1, 1,
+ 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350,
+ 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350,
+ 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350,
+ 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350,
+ 2350, 1, 2352, 1, 1, 1, 2353, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2352, 1, 1, 1, 1, 1, 1,
+ 1, 2354, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2331,
+ 1, 2355, 1, 2352, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2352, 1, 2356, 1, 1, 1,
+ 2357, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2356, 1, 1, 1, 1,
+ 1, 1, 1, 2358, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2338, 1, 2350, 2322, 2350, 2350, 2350,
+ 2350, 2350, 1, 1, 2350, 2350, 1, 2350,
+ 2324, 2350, 2350, 2350, 2350, 2350, 2350, 2350,
+ 2350, 2350, 2350, 2350, 1, 1, 1, 2350,
+ 1, 2350, 1, 2350, 2350, 2350, 2350, 2350,
+ 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350,
+ 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350,
+ 2350, 2350, 2350, 2350, 2350, 1, 1, 1,
+ 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350,
+ 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350,
+ 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350,
+ 2350, 2350, 2350, 2350, 2350, 2350, 2350, 2350,
+ 2350, 1, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 2346, 2346, 2346, 2346, 2346, 2346,
+ 2346, 2346, 1, 2359, 1, 2322, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2322, 1, 2332, 1,
+ 1, 1, 2339, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2332, 2321, 2322,
+ 2321, 2321, 2321, 2321, 2321, 2341, 1, 2321,
+ 2321, 1, 2321, 2324, 2321, 2321, 2321, 2321,
+ 2321, 2321, 2321, 2321, 2321, 2321, 2321, 1,
+ 1, 1, 2321, 1, 2321, 1, 2321, 2321,
+ 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321,
+ 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321,
+ 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321,
+ 1, 1, 1, 2321, 2321, 2321, 2321, 2321,
+ 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321,
+ 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321,
+ 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321,
+ 2321, 2321, 2321, 2321, 1, 2360, 1, 1,
+ 1, 2361, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2360, 2362, 2363, 2362,
+ 2362, 2362, 2362, 2362, 2364, 1, 2362, 2362,
+ 1, 2362, 2365, 2362, 2362, 2362, 2362, 2362,
+ 2362, 2362, 2362, 2362, 2362, 2362, 1, 1,
+ 1, 2362, 1, 2362, 1, 2362, 2362, 2362,
+ 2362, 2362, 2362, 2362, 2362, 2362, 2362, 2362,
+ 2362, 2362, 2362, 2362, 2362, 2362, 2362, 2362,
+ 2362, 2362, 2362, 2362, 2362, 2362, 2362, 2366,
+ 1, 1, 2362, 2362, 2362, 2362, 2362, 2362,
+ 2362, 2362, 2362, 2362, 2362, 2362, 2362, 2362,
+ 2362, 2362, 2362, 2362, 2362, 2362, 2362, 2362,
+ 2362, 2362, 2362, 2362, 2362, 2362, 2362, 2362,
+ 2362, 2362, 2362, 1, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 1, 2325, 2325,
+ 2367, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 1, 2368,
+ 2352, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325,
+ 2325, 2325, 2325, 1, 2369, 1, 2325, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2325, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2325,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2370, 1, 2370, 2370, 2371, 2370, 2370, 2370,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2370, 2372, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2370, 2370, 2370, 2373, 2370, 2370, 2370, 2370,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 2370,
+ 2370, 2370, 2370, 2370, 2370, 2370, 2370, 1,
+ 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374,
+ 2374, 1, 2374, 2374, 2375, 2374, 2374, 2374,
+ 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374,
+ 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374,
+ 2374, 2376, 2374, 2374, 2374, 2374, 2374, 2374,
+ 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374,
+ 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374,
+ 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374,
+ 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374,
+ 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374,
+ 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374,
+ 2374, 2374, 2374, 2377, 2374, 2374, 2374, 2374,
+ 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374,
+ 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374,
+ 2374, 2374, 2374, 2374, 2374, 2374, 2374, 2374,
+ 2374, 2374, 2374, 2374, 2374, 2374, 2374, 1,
+ 2378, 1, 2374, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2374, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2374, 81, 1, 1, 1,
+ 2379, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 81, 2380, 2381, 2380, 2380,
+ 2380, 2380, 2380, 2382, 1, 2380, 2380, 1,
+ 2380, 1, 2380, 2380, 2380, 2380, 2380, 2380,
+ 2380, 2380, 2380, 2380, 2380, 1, 1, 1,
+ 2380, 1, 2380, 1, 2380, 2380, 2380, 2380,
+ 2380, 2380, 2380, 2380, 2380, 2380, 2380, 2380,
+ 2380, 2380, 2380, 2380, 2380, 2380, 2380, 2380,
+ 2380, 2380, 2380, 2380, 2380, 2380, 1, 1,
+ 1, 2380, 2380, 2380, 2380, 2380, 2380, 2380,
+ 2380, 2380, 2380, 2380, 2380, 2380, 2380, 2380,
+ 2380, 2380, 2380, 2380, 2380, 2380, 2380, 2380,
+ 2380, 2380, 2380, 2380, 2380, 2380, 2380, 2380,
+ 2380, 2380, 1, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 2383, 66, 1, 2383, 2383, 2384,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 66, 2383, 1, 2383, 2383, 2383,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2385, 2383,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 1, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 2383, 2383, 1, 2383, 2383, 2386,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 2383, 2383, 2387, 2383, 2383, 2383,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2385, 2383,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 2383, 2383, 2383, 2383, 2383, 2383,
+ 2383, 2383, 1, 2388, 1, 2383, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2383, 1, 2389, 1,
+ 1, 1, 2390, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2389, 2387, 66,
+ 2387, 2387, 2387, 2387, 2387, 2391, 1, 2387,
+ 2387, 1, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 1,
+ 1, 1, 2387, 69, 2387, 70, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 1, 1, 1, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 1, 2392, 1, 1,
+ 1, 2393, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2392, 1, 1, 1,
+ 1, 1, 1, 1, 2394, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 75, 1, 76, 1, 2395, 1,
+ 2392, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2392,
+ 1, 2396, 1, 1, 1, 2397, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2396, 1, 1, 1, 1, 1, 1, 1,
+ 2398, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 82, 1,
+ 83, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2383, 2399, 1, 66, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 66, 1, 2400, 1,
+ 1, 1, 2401, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2400, 65, 2402,
+ 65, 65, 65, 65, 65, 2403, 1, 65,
+ 65, 1, 65, 2387, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 1,
+ 1, 1, 65, 69, 65, 70, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 1, 1, 1, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 1, 2404, 1, 1,
+ 1, 2405, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2404, 85, 86, 85,
+ 85, 85, 85, 85, 2406, 1, 85, 85,
+ 1, 85, 1, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 1, 1,
+ 1, 85, 75, 85, 76, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 1,
+ 1, 1, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 85, 85, 85, 85, 85,
+ 85, 85, 85, 1, 2407, 1, 2404, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2404, 1, 2408,
+ 1, 1, 1, 2409, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2408, 2380,
+ 2381, 2380, 2380, 2380, 2380, 2380, 2410, 1,
+ 2380, 2380, 1, 2380, 1, 2380, 2380, 2380,
+ 2380, 2380, 2380, 2380, 2380, 2380, 2380, 2380,
+ 1, 1, 1, 2380, 82, 2380, 83, 2380,
+ 2380, 2380, 2380, 2380, 2380, 2380, 2380, 2380,
+ 2380, 2380, 2380, 2380, 2380, 2380, 2380, 2380,
+ 2380, 2380, 2380, 2380, 2380, 2380, 2380, 2380,
+ 2380, 1, 1, 1, 2380, 2380, 2380, 2380,
+ 2380, 2380, 2380, 2380, 2380, 2380, 2380, 2380,
+ 2380, 2380, 2380, 2380, 2380, 2380, 2380, 2380,
+ 2380, 2380, 2380, 2380, 2380, 2380, 2380, 2380,
+ 2380, 2380, 2380, 2380, 2380, 1, 2411, 2411,
+ 2411, 2411, 2411, 2411, 2411, 2411, 2412, 1,
+ 2411, 2411, 2413, 2411, 2411, 2411, 2411, 2411,
+ 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411,
+ 2411, 2411, 2411, 2411, 2411, 2412, 2411, 2372,
+ 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411,
+ 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411,
+ 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411,
+ 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411,
+ 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411,
+ 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411,
+ 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411,
+ 2411, 2414, 2411, 2411, 2411, 2411, 2411, 2411,
+ 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411,
+ 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411,
+ 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411,
+ 2411, 2411, 2411, 2411, 2411, 1, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 1,
+ 2415, 2415, 2416, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2417,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2418, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 1, 2419, 1,
+ 2415, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2415,
+ 1, 63, 1, 1, 1, 64, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 63, 2387, 66, 2387, 2387, 2387, 2387, 2387,
+ 67, 1, 2387, 2387, 1, 2387, 68, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 1, 1, 1, 2387, 69, 2387,
+ 70, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 1, 1, 1, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 1,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 1, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2420, 1, 2415, 2415, 2421, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2420, 2415, 2376, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2418, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 2415, 2415, 2415, 2415, 2415, 2415, 2415, 2415,
+ 1, 2422, 1, 2420, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2420, 1, 2423, 2423, 2423, 2423,
+ 2423, 2423, 2423, 2423, 2424, 1, 2423, 2423,
+ 2425, 2423, 2423, 2423, 2423, 2423, 2423, 2423,
+ 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423,
+ 2423, 2423, 2423, 2424, 2423, 2426, 2423, 2423,
+ 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423,
+ 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423,
+ 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423,
+ 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423,
+ 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423,
+ 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423,
+ 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2427,
+ 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423,
+ 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423,
+ 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423,
+ 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423,
+ 2423, 2423, 2423, 1, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 1, 2428, 2428,
+ 2429, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2430, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2431,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 1, 2432, 1, 2428, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2428, 1, 2433,
+ 1, 1, 1, 2434, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2433, 2387,
+ 66, 2387, 2387, 2387, 2387, 2387, 2435, 1,
+ 2387, 2387, 1, 2387, 68, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 1, 1, 1, 2387, 69, 2387, 2436, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 1, 1, 1, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 1, 2437, 1,
+ 1, 1, 2438, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2437, 1, 1,
+ 1, 1, 1, 1, 1, 2439, 1, 1,
+ 1, 1, 1, 74, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 75, 1, 2440, 1, 2441,
+ 1, 2437, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2437, 1, 2442, 1, 1, 1, 2443, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2442, 1, 1, 1, 1, 1, 1,
+ 1, 2444, 1, 1, 1, 1, 1, 81,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 82,
+ 1, 2445, 1, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 1, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2446, 1, 2428, 2428,
+ 2447, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2446, 2428, 2448, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2431,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428,
+ 2428, 2428, 2428, 1, 2449, 1, 2446, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2446, 1, 2450,
+ 1, 1, 1, 2451, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2450, 1,
+ 1, 1, 1, 1, 1, 1, 2452, 1,
+ 1, 1, 1, 1, 74, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 75, 1, 2453, 1,
+ 2454, 1, 2450, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2450, 1, 2455, 1, 1, 1, 2456,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2455, 1, 1, 1, 1, 1,
+ 1, 1, 2457, 1, 1, 1, 1, 1,
+ 81, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 82, 1, 2458, 1, 2459, 1, 1, 1,
+ 2460, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2459, 2461, 2462, 2461, 2461,
+ 2461, 2461, 2461, 2463, 1, 2461, 2461, 2464,
+ 2461, 2465, 2461, 2461, 2461, 2461, 2461, 2461,
+ 2461, 2461, 2461, 2461, 2461, 1, 1, 1,
+ 2461, 1, 2461, 2466, 2461, 2461, 2461, 2461,
+ 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461,
+ 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461,
+ 2461, 2461, 2461, 2461, 2461, 2461, 1, 1,
+ 1, 2461, 2461, 2461, 2461, 2461, 2461, 2461,
+ 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461,
+ 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461,
+ 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461,
+ 2461, 2461, 1, 60, 1, 1, 1, 2467,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 60, 1, 1, 1, 1, 1,
+ 1, 1, 2468, 1, 1, 1, 60, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 61, 1, 2469, 1, 60, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 60, 1, 2464,
+ 1, 1, 1, 2470, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2464, 1,
+ 1, 1, 1, 1, 1, 1, 2471, 1,
+ 1, 1, 2464, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2466, 1,
+ 2472, 1, 1, 1, 2473, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2472,
+ 2474, 2475, 2474, 2474, 2474, 2474, 2474, 2476,
+ 1, 2474, 2474, 1, 2474, 2477, 2474, 2474,
+ 2474, 2474, 2474, 2474, 2474, 2474, 2474, 2474,
+ 2474, 1, 1, 1, 2474, 1, 2474, 1,
+ 2474, 2474, 2474, 2474, 2474, 2474, 2474, 2474,
+ 2474, 2474, 2474, 2474, 2474, 2474, 2474, 2474,
+ 2474, 2474, 2474, 2474, 2474, 2474, 2474, 2474,
+ 2474, 2474, 2478, 1, 1, 2474, 2474, 2474,
+ 2474, 2474, 2474, 2474, 2474, 2474, 2474, 2474,
+ 2474, 2474, 2474, 2474, 2474, 2474, 2474, 2474,
+ 2474, 2474, 2474, 2474, 2474, 2474, 2474, 2474,
+ 2474, 2474, 2474, 2474, 2474, 2474, 1, 2479,
+ 1, 1, 1, 2480, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2479, 2481,
+ 2482, 2481, 2481, 2481, 2481, 2481, 2483, 1,
+ 2481, 2481, 1, 2481, 2484, 2481, 2481, 2481,
+ 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481,
+ 1, 1, 1, 2481, 1, 2481, 1, 2481,
+ 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481,
+ 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481,
+ 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481,
+ 2481, 2485, 1, 1, 2481, 2481, 2481, 2481,
+ 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481,
+ 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481,
+ 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481,
+ 2481, 2481, 2481, 2481, 2481, 1, 2486, 1,
+ 2479, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2479,
+ 1, 2487, 1, 1, 1, 2488, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2487, 2481, 2482, 2481, 2481, 2481, 2481, 2481,
+ 2489, 1, 2481, 2481, 2490, 2481, 2491, 2481,
+ 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481,
+ 2481, 2481, 2492, 1, 1, 2481, 1, 2481,
+ 1, 2481, 2481, 2481, 2481, 2481, 2481, 2481,
+ 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481,
+ 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481,
+ 2481, 2481, 2481, 1, 1, 1, 2481, 2481,
+ 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481,
+ 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481,
+ 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481,
+ 2481, 2481, 2481, 2481, 2481, 2481, 2481, 1,
+ 2487, 1, 1, 1, 2488, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2487,
+ 1, 1, 1, 1, 1, 1, 1, 2489,
+ 1, 1, 1, 2490, 1, 2493, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2492, 1, 2494, 1, 2487, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2487, 1, 2495, 1,
+ 1, 1, 2496, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2495, 1, 1,
+ 1, 1, 1, 1, 1, 2497, 1, 1,
+ 1, 2498, 1, 2499, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2500,
+ 1, 2501, 1, 1, 1, 2502, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2501, 1, 1, 1, 1, 1, 1, 1,
+ 2503, 1, 1, 1, 2501, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2504, 1, 1, 1, 1, 1,
+ 61, 1, 2505, 1, 2501, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2501, 1, 2506, 1, 1,
+ 1, 2507, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2506, 1, 1, 1,
+ 1, 1, 1, 1, 2508, 1, 1, 1,
+ 2506, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2509, 1,
+ 1, 1, 1, 1, 2466, 1, 2510, 1,
+ 1, 1, 2511, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2510, 2512, 2513,
+ 2512, 2512, 2512, 2512, 2512, 2514, 1, 2512,
+ 2512, 1, 2512, 2515, 2512, 2512, 2512, 2512,
+ 2512, 2512, 2512, 2512, 2512, 2512, 2512, 1,
+ 1, 1, 2512, 1, 2512, 1, 2512, 2512,
+ 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512,
+ 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512,
+ 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512,
+ 1, 1, 1, 2512, 2512, 2512, 2512, 2512,
+ 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512,
+ 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512,
+ 2512, 2512, 2512, 2512, 2512, 2512, 2512, 2512,
+ 2512, 2512, 2512, 2512, 1, 2516, 1, 1,
+ 1, 2517, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2516, 51, 52, 51,
+ 51, 51, 51, 51, 2518, 1, 51, 51,
+ 1, 51, 55, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 1, 1,
+ 1, 51, 1, 51, 1, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 1,
+ 1, 1, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 1, 2519, 1, 2516, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2516, 1, 2520,
+ 1, 1, 1, 2521, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2520, 2461,
+ 2462, 2461, 2461, 2461, 2461, 2461, 2522, 1,
+ 2461, 2461, 1, 2461, 2465, 2461, 2461, 2461,
+ 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461,
+ 1, 1, 1, 2461, 1, 2461, 1, 2461,
+ 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461,
+ 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461,
+ 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461,
+ 2461, 1, 1, 1, 2461, 2461, 2461, 2461,
+ 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461,
+ 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461,
+ 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461,
+ 2461, 2461, 2461, 2461, 2461, 1, 2387, 66,
+ 2387, 2387, 2387, 2387, 2387, 1, 1, 2387,
+ 2387, 1, 2387, 2523, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 1,
+ 1, 1, 2387, 1, 2387, 1, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 1, 1, 1, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 2387, 2387, 2387, 2387,
+ 2387, 2387, 2387, 2387, 1, 2493, 1, 1,
+ 1, 2524, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2493, 2525, 1, 2525,
+ 2525, 2525, 2525, 2525, 2526, 1, 2525, 2525,
+ 1, 2525, 1, 2525, 2525, 2525, 2525, 2525,
+ 2525, 2525, 2525, 2525, 2525, 2525, 1, 1,
+ 1, 2525, 1, 2525, 1, 2525, 2525, 2525,
+ 2525, 2525, 2525, 2525, 2525, 2525, 2525, 2525,
+ 2525, 2525, 2525, 2525, 2525, 2525, 2525, 2525,
+ 2525, 2525, 2525, 2525, 2525, 2525, 2525, 1,
+ 1, 1, 2525, 2525, 2525, 2525, 2525, 2525,
+ 2525, 2525, 2525, 2525, 2525, 2525, 2525, 2525,
+ 2525, 2525, 2525, 2525, 2525, 2525, 2525, 2525,
+ 2525, 2525, 2525, 2525, 2525, 2525, 2525, 2525,
+ 2525, 2525, 2525, 1, 2527, 1, 2493, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2493, 1, 2487,
+ 1, 1, 1, 2488, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2487, 2525,
+ 1, 2525, 2525, 2525, 2525, 2525, 2489, 1,
+ 2525, 2525, 2490, 2525, 2493, 2525, 2525, 2525,
+ 2525, 2525, 2525, 2525, 2525, 2525, 2525, 2525,
+ 2492, 1, 1, 2525, 1, 2525, 1, 2525,
+ 2525, 2525, 2525, 2525, 2525, 2525, 2525, 2525,
+ 2525, 2525, 2525, 2525, 2525, 2525, 2525, 2525,
+ 2525, 2525, 2525, 2525, 2525, 2525, 2525, 2525,
+ 2525, 1, 1, 1, 2525, 2525, 2525, 2525,
+ 2525, 2525, 2525, 2525, 2525, 2525, 2525, 2525,
+ 2525, 2525, 2525, 2525, 2525, 2525, 2525, 2525,
+ 2525, 2525, 2525, 2525, 2525, 2525, 2525, 2525,
+ 2525, 2525, 2525, 2525, 2525, 1, 2499, 1,
+ 1, 1, 2528, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2499, 2529, 1,
+ 2529, 2529, 2529, 2529, 2529, 2530, 1, 2529,
+ 2529, 1, 2529, 1, 2529, 2529, 2529, 2529,
+ 2529, 2529, 2529, 2529, 2529, 2529, 2529, 1,
+ 1, 1, 2529, 1, 2529, 1, 2529, 2529,
+ 2529, 2529, 2529, 2529, 2529, 2529, 2529, 2529,
+ 2529, 2529, 2529, 2529, 2529, 2529, 2529, 2529,
+ 2529, 2529, 2529, 2529, 2529, 2529, 2529, 2529,
+ 1, 1, 1, 2529, 2529, 2529, 2529, 2529,
+ 2529, 2529, 2529, 2529, 2529, 2529, 2529, 2529,
+ 2529, 2529, 2529, 2529, 2529, 2529, 2529, 2529,
+ 2529, 2529, 2529, 2529, 2529, 2529, 2529, 2529,
+ 2529, 2529, 2529, 2529, 1, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2482, 1, 2531,
+ 2531, 2532, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2482, 2531, 1, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2533, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 1, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 1, 2531,
+ 2531, 2534, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2535, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2533, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 1, 2536, 1, 2531,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2531, 1,
+ 2537, 1, 1, 1, 2538, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2537,
+ 2535, 2482, 2535, 2535, 2535, 2535, 2535, 2539,
+ 1, 2535, 2535, 2490, 2535, 2484, 2535, 2535,
+ 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535,
+ 2535, 2492, 1, 1, 2535, 1, 2535, 1,
+ 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535,
+ 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535,
+ 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535,
+ 2535, 2535, 1, 1, 1, 2535, 2535, 2535,
+ 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535,
+ 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535,
+ 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535,
+ 2535, 2535, 2535, 2535, 2535, 2535, 1, 2537,
+ 1, 1, 1, 2538, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2537, 1,
+ 1, 1, 1, 1, 1, 1, 2539, 1,
+ 1, 1, 2490, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2492, 1, 2540, 1, 2537, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2537, 1, 2541, 1, 1,
+ 1, 2542, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2541, 1, 1, 1,
+ 1, 1, 1, 1, 2543, 1, 1, 1,
+ 2498, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2500, 1,
+ 2535, 2482, 2535, 2535, 2535, 2535, 2535, 1,
+ 1, 2535, 2535, 1, 2535, 2484, 2535, 2535,
+ 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535,
+ 2535, 1, 1, 1, 2535, 1, 2535, 1,
+ 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535,
+ 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535,
+ 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535,
+ 2535, 2535, 1, 1, 1, 2535, 2535, 2535,
+ 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535,
+ 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535,
+ 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535,
+ 2535, 2535, 2535, 2535, 2535, 2535, 1, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531,
+ 2531, 2531, 2531, 2531, 2531, 2531, 2531, 1,
+ 2544, 1, 2482, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2482, 1, 2493, 1, 1, 1, 2524,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2493, 2481, 2482, 2481, 2481, 2481,
+ 2481, 2481, 2526, 1, 2481, 2481, 1, 2481,
+ 2484, 2481, 2481, 2481, 2481, 2481, 2481, 2481,
+ 2481, 2481, 2481, 2481, 1, 1, 1, 2481,
+ 1, 2481, 1, 2481, 2481, 2481, 2481, 2481,
+ 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481,
+ 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481,
+ 2481, 2481, 2481, 2481, 2481, 1, 1, 1,
+ 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481,
+ 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481,
+ 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481,
+ 2481, 2481, 2481, 2481, 2481, 2481, 2481, 2481,
+ 2481, 1, 2545, 1, 1, 1, 2546, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2545, 2547, 2548, 2547, 2547, 2547, 2547,
+ 2547, 2549, 1, 2547, 2547, 1, 2547, 2550,
+ 2547, 2547, 2547, 2547, 2547, 2547, 2547, 2547,
+ 2547, 2547, 2547, 1, 1, 1, 2547, 1,
+ 2547, 1, 2547, 2547, 2547, 2547, 2547, 2547,
+ 2547, 2547, 2547, 2547, 2547, 2547, 2547, 2547,
+ 2547, 2547, 2547, 2547, 2547, 2547, 2547, 2547,
+ 2547, 2547, 2547, 2547, 2551, 1, 1, 2547,
+ 2547, 2547, 2547, 2547, 2547, 2547, 2547, 2547,
+ 2547, 2547, 2547, 2547, 2547, 2547, 2547, 2547,
+ 2547, 2547, 2547, 2547, 2547, 2547, 2547, 2547,
+ 2547, 2547, 2547, 2547, 2547, 2547, 2547, 2547,
+ 1, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 1, 2485, 2485, 2552, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 1, 2553, 2537, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 1, 2554, 1, 2485, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2485, 1, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 2485, 2485, 2485, 2485,
+ 2485, 2485, 2485, 2485, 1, 2555, 1, 1,
+ 1, 2556, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2555, 2557, 2558, 2557,
+ 2557, 2557, 2557, 2557, 2559, 1, 2557, 2557,
+ 1, 2557, 17, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 18, 1,
+ 19, 2557, 1, 2557, 17, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 2557, 1,
+ 1, 1, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 1, 2560, 1, 1, 1,
+ 2561, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2560, 2557, 2558, 2557, 2557,
+ 2557, 2557, 2557, 2562, 1, 2557, 2557, 1,
+ 2557, 1, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 1, 1, 8,
+ 2557, 1, 2557, 1, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 1, 1,
+ 1, 2557, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 1, 2563, 1, 2560, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2560, 1, 2564, 1,
+ 2565, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2565,
+ 1, 2566, 1, 1, 1, 2567, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2566, 2133, 2134, 2133, 2133, 2133, 2133, 2133,
+ 2568, 1, 2133, 2133, 1, 2133, 2136, 2133,
+ 2133, 2133, 2133, 2133, 2133, 2133, 2133, 2133,
+ 2133, 2133, 18, 1, 19, 2133, 1, 2133,
+ 17, 2133, 2133, 2133, 2133, 2133, 2133, 2133,
+ 2133, 2133, 2133, 2133, 2133, 2133, 2133, 2133,
+ 2133, 2133, 2133, 2133, 2133, 2133, 2133, 2133,
+ 2133, 2133, 2133, 2137, 1, 1, 2133, 2133,
+ 2133, 2133, 2133, 2133, 2133, 2133, 2133, 2133,
+ 2133, 2133, 2133, 2133, 2133, 2133, 2133, 2133,
+ 2133, 2133, 2133, 2133, 2133, 2133, 2133, 2133,
+ 2133, 2133, 2133, 2133, 2133, 2133, 2133, 1,
+ 2569, 1, 1, 1, 2570, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2569,
+ 2140, 2141, 2140, 2140, 2140, 2140, 2140, 2571,
+ 1, 2140, 2140, 1, 2140, 2572, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 1, 1, 8, 2140, 1, 2140, 1,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2144, 1, 1, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 1, 2573,
+ 1, 2569, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2569, 1, 2574, 1, 1, 1, 2575, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2574, 2178, 2179, 2178, 2178, 2178, 2178,
+ 2178, 2576, 1, 2178, 2178, 1, 2178, 2577,
+ 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178,
+ 2178, 2178, 2178, 1, 1, 48, 2178, 1,
+ 2178, 1, 2178, 2178, 2178, 2178, 2178, 2178,
+ 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178,
+ 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178,
+ 2178, 2178, 2178, 2178, 2182, 1, 1, 2178,
+ 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178,
+ 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178,
+ 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178,
+ 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178,
+ 1, 2578, 2579, 2578, 2578, 2578, 2578, 2578,
+ 1, 1, 2578, 2578, 1, 2578, 2572, 2578,
+ 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578,
+ 2578, 2578, 1, 1, 1, 2578, 1, 2578,
+ 1, 2578, 2578, 2578, 2578, 2578, 2578, 2578,
+ 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578,
+ 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578,
+ 2578, 2578, 2578, 1, 1, 1, 2578, 2578,
+ 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578,
+ 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578,
+ 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578,
+ 2578, 2578, 2578, 2578, 2578, 2578, 2578, 1,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2579, 1, 2580, 2580, 2581, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2579,
+ 2580, 1, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2582, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 1,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 1, 2580, 2580, 2583, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2578, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2582, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 1,
+ 2584, 1, 2580, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2580, 1, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
+ 2580, 2580, 2580, 1, 2585, 1, 2579, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2579, 1, 2586,
+ 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
+ 1, 2586, 2586, 2587, 2586, 2586, 2586, 2586,
+ 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
+ 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
+ 2588, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
+ 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
+ 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
+ 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
+ 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
+ 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
+ 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
+ 2586, 2586, 2589, 2586, 2586, 2586, 2586, 2586,
+ 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
+ 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
+ 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
+ 2586, 2586, 2586, 2586, 2586, 2586, 1, 2590,
+ 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590,
+ 1, 2590, 2590, 2591, 2590, 2590, 2590, 2590,
+ 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590,
+ 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590,
+ 2592, 2590, 2590, 2590, 2590, 2590, 2590, 2590,
+ 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590,
+ 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590,
+ 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590,
+ 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590,
+ 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590,
+ 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590,
+ 2590, 2590, 2593, 2590, 2590, 2590, 2590, 2590,
+ 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590,
+ 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590,
+ 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590,
+ 2590, 2590, 2590, 2590, 2590, 2590, 1, 2594,
+ 1, 2590, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2590, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2590, 2595, 1, 1, 1, 2596,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2595, 2597, 2598, 2597, 2597, 2597,
+ 2597, 2597, 2599, 1, 2597, 2597, 1, 2597,
+ 1, 2597, 2597, 2597, 2597, 2597, 2597, 2597,
+ 2597, 2597, 2597, 2597, 1, 1, 48, 2597,
+ 1, 2597, 1, 2597, 2597, 2597, 2597, 2597,
+ 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597,
+ 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597,
+ 2597, 2597, 2597, 2597, 2597, 1, 1, 1,
+ 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597,
+ 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597,
+ 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597,
+ 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597,
+ 2597, 1, 2600, 2600, 2600, 2600, 2600, 2600,
+ 2600, 2600, 2601, 1, 2600, 2600, 2602, 2600,
+ 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600,
+ 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600,
+ 2600, 2601, 2600, 23, 2600, 2600, 2600, 2600,
+ 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600,
+ 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600,
+ 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600,
+ 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600,
+ 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600,
+ 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600,
+ 2600, 2600, 2600, 2600, 2600, 2603, 2600, 2600,
+ 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600,
+ 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600,
+ 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600,
+ 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600,
+ 2600, 1, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 1, 2604, 2604, 2605, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2606, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2607, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 1, 2608, 1, 2604, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2604, 1, 2609, 1, 2610,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2610, 1,
+ 2611, 1, 2612, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2612, 1, 2613, 1, 1, 1, 2614,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2613, 2615, 2616, 2615, 2615, 2615,
+ 2615, 2615, 2617, 1, 2615, 2615, 1, 2615,
+ 2618, 2615, 2615, 2615, 2615, 2615, 2615, 2615,
+ 2615, 2615, 2615, 2615, 1, 1, 1, 2615,
+ 1, 2615, 1, 2615, 2615, 2615, 2615, 2615,
+ 2615, 2615, 2615, 2615, 2615, 2615, 2615, 2615,
+ 2615, 2615, 2615, 2615, 2615, 2615, 2615, 2615,
+ 2615, 2615, 2615, 2615, 2615, 2137, 1, 1,
+ 2615, 2615, 2615, 2615, 2615, 2615, 2615, 2615,
+ 2615, 2615, 2615, 2615, 2615, 2615, 2615, 2615,
+ 2615, 2615, 2615, 2615, 2615, 2615, 2615, 2615,
+ 2615, 2615, 2615, 2615, 2615, 2615, 2615, 2615,
+ 2615, 1, 2619, 1, 1, 1, 2620, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2619, 2621, 2579, 2621, 2621, 2621, 2621,
+ 2621, 2622, 1, 2621, 2621, 1, 2621, 2572,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 1, 1, 1, 2621, 1,
+ 2621, 1, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2144, 1, 1, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 1, 2623, 1, 2619, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2619, 1, 2236, 1, 1, 1,
+ 2237, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2236, 2621, 2579, 2621, 2621,
+ 2621, 2621, 2621, 2239, 1, 2621, 2621, 1,
+ 2621, 2572, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 1, 1, 1,
+ 2621, 1, 2621, 1, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 1, 1,
+ 1, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 1, 2624, 1, 1, 1, 2625,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2624, 2626, 2627, 2626, 2626, 2626,
+ 2626, 2626, 2628, 1, 2626, 2626, 1, 2626,
+ 2577, 2626, 2626, 2626, 2626, 2626, 2626, 2626,
+ 2626, 2626, 2626, 2626, 1, 1, 1, 2626,
+ 1, 2626, 1, 2626, 2626, 2626, 2626, 2626,
+ 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626,
+ 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626,
+ 2626, 2626, 2626, 2626, 2626, 2182, 1, 1,
+ 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626,
+ 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626,
+ 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626,
+ 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626,
+ 2626, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2629, 1, 2604, 2604, 2630,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2629, 2604, 27, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2607, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
+ 2604, 2604, 1, 2631, 1, 2629, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2629, 1, 2632, 1,
+ 2633, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2633,
+ 1, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
+ 2634, 2635, 1, 2634, 2634, 2636, 2634, 2634,
+ 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
+ 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
+ 2635, 2634, 2588, 2634, 2634, 2634, 2634, 2634,
+ 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
+ 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
+ 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
+ 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
+ 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
+ 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
+ 2634, 2634, 2634, 2634, 2637, 2634, 2634, 2634,
+ 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
+ 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
+ 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
+ 2634, 2634, 2634, 2634, 2634, 2634, 2634, 2634,
+ 1, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 1, 2638, 2638, 2639, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2640, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2641, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 1, 2642, 1, 2638, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2638, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2638, 2643, 1, 2638,
+ 2638, 2644, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2643, 2638, 2592, 2638,
+ 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2641, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
+ 2638, 2638, 2638, 2638, 1, 2645, 1, 2643,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2643, 1,
+ 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
+ 2647, 1, 2646, 2646, 2648, 2646, 2646, 2646,
+ 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
+ 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2647,
+ 2646, 2649, 2646, 2646, 2646, 2646, 2646, 2646,
+ 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
+ 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
+ 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
+ 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
+ 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
+ 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
+ 2646, 2646, 2646, 2650, 2646, 2646, 2646, 2646,
+ 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
+ 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
+ 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
+ 2646, 2646, 2646, 2646, 2646, 2646, 2646, 1,
+ 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
+ 2651, 1, 2651, 2651, 2652, 2651, 2651, 2651,
+ 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
+ 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
+ 2651, 2653, 2651, 2651, 2651, 2651, 2651, 2651,
+ 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
+ 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
+ 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
+ 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
+ 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
+ 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
+ 2651, 2651, 2651, 2654, 2651, 2651, 2651, 2651,
+ 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
+ 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
+ 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
+ 2651, 2651, 2651, 2651, 2651, 2651, 2651, 1,
+ 2655, 1, 2651, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2651, 1, 2656, 1, 2657, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2657, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2651, 2651,
+ 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2658,
+ 1, 2651, 2651, 2659, 2651, 2651, 2651, 2651,
+ 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
+ 2651, 2651, 2651, 2651, 2651, 2651, 2658, 2651,
+ 2660, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
+ 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
+ 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
+ 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
+ 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
+ 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
+ 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
+ 2651, 2651, 2654, 2651, 2651, 2651, 2651, 2651,
+ 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
+ 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
+ 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
+ 2651, 2651, 2651, 2651, 2651, 2651, 1, 2661,
+ 1, 2658, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2658, 1, 2662, 1, 2663, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2663, 1, 2664, 1, 1,
+ 1, 2665, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2664, 2666, 2667, 2666,
+ 2666, 2666, 2666, 2666, 2668, 1, 2666, 2666,
+ 1, 2666, 2669, 2666, 2666, 2666, 2666, 2666,
+ 2666, 2666, 2666, 2666, 2666, 2666, 1, 1,
+ 48, 2666, 1, 2666, 1, 2666, 2666, 2666,
+ 2666, 2666, 2666, 2666, 2666, 2666, 2666, 2666,
+ 2666, 2666, 2666, 2666, 2666, 2666, 2666, 2666,
+ 2666, 2666, 2666, 2666, 2666, 2666, 2666, 1,
+ 1, 1, 2666, 2666, 2666, 2666, 2666, 2666,
+ 2666, 2666, 2666, 2666, 2666, 2666, 2666, 2666,
+ 2666, 2666, 2666, 2666, 2666, 2666, 2666, 2666,
+ 2666, 2666, 2666, 2666, 2666, 2666, 2666, 2666,
+ 2666, 2666, 2666, 1, 2670, 1, 1, 1,
+ 2671, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2670, 3, 4, 3, 3,
+ 3, 3, 3, 5, 1, 3, 3, 1,
+ 3, 7, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 1, 1, 8,
+ 3, 1, 3, 1, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 1, 1,
+ 1, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 1, 2672, 1, 2670, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2670, 1, 2673, 2674,
+ 2673, 2673, 2673, 2673, 2673, 1, 1, 2673,
+ 2673, 1, 2673, 2675, 2673, 2673, 2673, 2673,
+ 2673, 2673, 2673, 2673, 2673, 2673, 2673, 1,
+ 1, 1, 2673, 1, 2673, 1, 2673, 2673,
+ 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
+ 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
+ 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
+ 1, 1, 1, 2673, 2673, 2673, 2673, 2673,
+ 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
+ 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
+ 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
+ 2673, 2673, 2673, 2673, 1, 2676, 1, 2677,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2677, 1,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2674, 1, 2678, 2678, 2679, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2674,
+ 2678, 1, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2680, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 1,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 1, 2678, 2678, 2681, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 2673, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2680, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 2678,
+ 2678, 2678, 2678, 2678, 2678, 2678, 2678, 1,
+ 2682, 1, 2678, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2678, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2678, 2683, 1, 2674, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2674, 1, 38,
+ 1, 1, 1, 39, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 38, 2684,
+ 2685, 2684, 2684, 2684, 2684, 2684, 40, 1,
+ 2684, 2684, 1, 2684, 2686, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 18, 1, 19, 2684, 1, 2684, 17, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 1, 1, 1, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 1, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 1,
+ 2687, 2687, 2688, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2689, 2690, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2691, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 2687, 2687, 2687,
+ 2687, 2687, 2687, 2687, 2687, 1, 2692, 2692,
+ 2692, 2692, 2692, 2692, 2692, 2692, 2692, 1,
+ 2692, 2692, 2693, 2692, 2692, 2692, 2692, 2692,
+ 2692, 2692, 2692, 2692, 2692, 2692, 2692, 2692,
+ 2692, 2692, 2692, 2692, 2692, 2692, 2692, 2692,
+ 2692, 2692, 2692, 2692, 2692, 2694, 2695, 2692,
+ 2692, 2692, 2692, 2692, 2692, 2692, 2692, 2692,
+ 2692, 2692, 2692, 2692, 2692, 2692, 2692, 2692,
+ 2692, 2692, 2692, 2692, 2692, 2692, 2692, 2692,
+ 2692, 2692, 2692, 2692, 2692, 2692, 2692, 2692,
+ 2692, 2692, 2692, 2692, 2692, 2692, 2692, 2692,
+ 2692, 2692, 2692, 2692, 2692, 2692, 2692, 2692,
+ 2692, 2696, 2692, 2692, 2692, 2692, 2692, 2692,
+ 2692, 2692, 2692, 2692, 2692, 2692, 2692, 2692,
+ 2692, 2692, 2692, 2692, 2692, 2692, 2692, 2692,
+ 2692, 2692, 2692, 2692, 2692, 2692, 2692, 2692,
+ 2692, 2692, 2692, 2692, 2692, 1, 2697, 1,
+ 2692, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2692,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2692, 2698, 1, 1, 1, 2699, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2698, 2700, 2701, 2700, 2700, 2700, 2700,
+ 2700, 2702, 1, 2700, 2700, 6, 2700, 2703,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 1, 6, 2704, 2700, 1,
+ 2700, 2705, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 1, 1, 1, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 2700, 2700, 2700, 2700, 2700, 2700, 2700, 2700,
+ 1, 2706, 1, 1, 1, 2707, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2706, 2708, 2685, 2708, 2708, 2708, 2708, 2708,
+ 2709, 1, 2708, 2708, 2710, 2708, 2711, 2708,
+ 2708, 2708, 2708, 2708, 2708, 2708, 2708, 2708,
+ 2708, 2708, 18, 2710, 19, 2708, 1, 2708,
+ 2712, 2708, 2708, 2708, 2708, 2708, 2708, 2708,
+ 2708, 2708, 2708, 2708, 2708, 2708, 2708, 2708,
+ 2708, 2708, 2708, 2708, 2708, 2708, 2708, 2708,
+ 2708, 2708, 2708, 1, 1, 1, 2708, 2708,
+ 2708, 2708, 2708, 2708, 2708, 2708, 2708, 2708,
+ 2708, 2708, 2708, 2708, 2708, 2708, 2708, 2708,
+ 2708, 2708, 2708, 2708, 2708, 2708, 2708, 2708,
+ 2708, 2708, 2708, 2708, 2708, 2708, 2708, 1,
+ 2713, 1, 1, 1, 2714, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2713,
+ 14, 15, 14, 14, 14, 14, 14, 2715,
+ 1, 14, 14, 2716, 14, 2717, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 18, 2716, 19, 14, 1, 14, 2718,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 1, 1, 1, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 1, 2719,
+ 1, 1, 1, 2720, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2719, 1,
+ 1, 1, 1, 1, 1, 1, 2721, 1,
+ 1, 1, 2722, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2722, 1, 2723, 1, 1, 1, 2724,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2723, 1, 1, 1, 1, 1,
+ 1, 1, 2725, 1, 1, 1, 2726, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2726, 1, 2727,
+ 1, 1, 1, 2728, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2727, 2729,
+ 2730, 2729, 2729, 2729, 2729, 2729, 2731, 1,
+ 2729, 2729, 6, 2729, 2732, 2729, 2729, 2729,
+ 2729, 2729, 2729, 2729, 2729, 2729, 2729, 2729,
+ 1, 6, 2704, 2729, 1, 2729, 2705, 2729,
+ 2729, 2729, 2729, 2729, 2729, 2729, 2729, 2729,
+ 2729, 2729, 2729, 2729, 2729, 2729, 2729, 2729,
+ 2729, 2729, 2729, 2729, 2729, 2729, 2729, 2729,
+ 2729, 1, 1, 1, 2729, 2729, 2729, 2729,
+ 2729, 2729, 2729, 2729, 2729, 2729, 2729, 2729,
+ 2729, 2729, 2729, 2729, 2729, 2729, 2729, 2729,
+ 2729, 2729, 2729, 2729, 2729, 2729, 2729, 2729,
+ 2729, 2729, 2729, 2729, 2729, 1, 2733, 1,
+ 1, 1, 2734, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2733, 2735, 2310,
+ 2735, 2735, 2735, 2735, 2735, 2736, 1, 2735,
+ 2735, 2710, 2735, 2737, 2735, 2735, 2735, 2735,
+ 2735, 2735, 2735, 2735, 2735, 2735, 2735, 18,
+ 2710, 19, 2735, 1, 2735, 2738, 2735, 2735,
+ 2735, 2735, 2735, 2735, 2735, 2735, 2735, 2735,
+ 2735, 2735, 2735, 2735, 2735, 2735, 2735, 2735,
+ 2735, 2735, 2735, 2735, 2735, 2735, 2735, 2735,
+ 1, 1, 1, 2735, 2735, 2735, 2735, 2735,
+ 2735, 2735, 2735, 2735, 2735, 2735, 2735, 2735,
+ 2735, 2735, 2735, 2735, 2735, 2735, 2735, 2735,
+ 2735, 2735, 2735, 2735, 2735, 2735, 2735, 2735,
+ 2735, 2735, 2735, 2735, 1, 2739, 1, 1,
+ 1, 2740, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2739, 14, 15, 14,
+ 14, 14, 14, 14, 2741, 1, 14, 14,
+ 2716, 14, 2742, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 18, 2716,
+ 19, 14, 1, 14, 2743, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 1,
+ 1, 1, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 1, 2744, 1, 1, 1,
+ 2745, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2744, 32, 33, 32, 32,
+ 32, 32, 32, 2746, 1, 32, 32, 2747,
+ 32, 2748, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 36, 2747, 37,
+ 32, 1, 32, 2749, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 1, 1,
+ 1, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 1, 2750, 1, 1, 1, 2751,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2750, 104, 15, 104, 104, 104,
+ 104, 104, 2752, 1, 104, 104, 2722, 104,
+ 2742, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 18, 2722, 19, 104,
+ 1, 104, 2753, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 1, 1, 1,
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 1, 2750, 1, 1, 1, 2751, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2750, 14, 15, 14, 14, 14, 14,
+ 14, 2752, 1, 14, 14, 2722, 14, 2742,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 18, 2722, 19, 14, 1,
+ 14, 2753, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 1, 1, 1, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 1, 2754, 1, 1, 1, 2755, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2754, 32, 33, 32, 32, 32, 32, 32,
+ 2756, 1, 32, 32, 2726, 32, 2748, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 36, 2726, 37, 32, 1, 32,
+ 2757, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 1, 1, 1, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 1,
+ 2758, 1, 1, 1, 2759, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2758,
+ 413, 414, 413, 413, 413, 413, 413, 2760,
+ 1, 413, 413, 6, 413, 416, 413, 413,
+ 413, 413, 413, 413, 413, 413, 413, 413,
+ 413, 1, 6, 417, 413, 1, 413, 418,
+ 413, 413, 413, 413, 413, 413, 413, 413,
+ 413, 413, 413, 413, 413, 413, 413, 413,
+ 413, 413, 413, 413, 413, 413, 413, 413,
+ 413, 413, 1, 1, 1, 413, 413, 413,
+ 413, 413, 413, 413, 413, 413, 413, 413,
+ 413, 413, 413, 413, 413, 413, 413, 413,
+ 413, 413, 413, 413, 413, 413, 413, 413,
+ 413, 413, 413, 413, 413, 413, 1, 302,
+ 1, 1, 1, 2761, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 302, 421,
+ 422, 421, 421, 421, 421, 421, 2762, 1,
+ 421, 421, 6, 421, 424, 421, 421, 421,
+ 421, 421, 421, 421, 421, 421, 421, 421,
+ 1, 6, 349, 421, 1, 421, 1, 421,
+ 421, 421, 421, 421, 421, 421, 421, 421,
+ 421, 421, 421, 421, 421, 421, 421, 421,
+ 421, 421, 421, 421, 421, 421, 421, 421,
+ 421, 1, 1, 1, 421, 421, 421, 421,
+ 421, 421, 421, 421, 421, 421, 421, 421,
+ 421, 421, 421, 421, 421, 421, 421, 421,
+ 421, 421, 421, 421, 421, 421, 421, 421,
+ 421, 421, 421, 421, 421, 1, 2763, 1,
+ 1, 1, 2764, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2763, 695, 696,
+ 695, 695, 695, 695, 695, 2765, 1, 695,
+ 695, 2766, 695, 698, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 1,
+ 2766, 354, 695, 1, 695, 1, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695,
+ 1, 1, 1, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 695, 695, 695, 695,
+ 695, 695, 695, 695, 1, 120, 1, 1,
+ 1, 2767, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 120, 1, 1, 1,
+ 1, 1, 1, 1, 2768, 1, 1, 1,
+ 6, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 6,
+ 1, 1184, 1, 1, 1, 2769, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1184, 1, 1, 1, 1, 1, 1, 1,
+ 2770, 1, 1, 1, 2766, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2766, 1, 2771, 1, 1,
+ 1, 2772, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2771, 2140, 2141, 2140,
+ 2140, 2140, 2140, 2140, 2773, 1, 2140, 2140,
+ 2774, 2140, 2775, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 18, 2774,
+ 19, 2140, 1, 2140, 17, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 1,
+ 1, 1, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140,
+ 2140, 2140, 2140, 1, 2771, 1, 1, 1,
+ 2772, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2771, 14, 15, 14, 14,
+ 14, 14, 14, 2773, 1, 14, 14, 2774,
+ 14, 2776, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 18, 2774, 19,
+ 14, 1, 14, 17, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 1, 1,
+ 1, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 1, 2777, 1, 1, 1, 2778,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2777, 32, 33, 32, 32, 32,
+ 32, 32, 2779, 1, 32, 32, 2780, 32,
+ 2781, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 36, 2780, 37, 32,
+ 1, 32, 35, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 1, 1, 1,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 1, 2771, 1, 1, 1, 2772, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2771, 2150, 15, 2150, 2150, 2150, 2150,
+ 2150, 2773, 1, 2150, 2150, 2774, 2150, 2776,
+ 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
+ 2150, 2150, 2150, 18, 2774, 19, 2150, 1,
+ 2150, 17, 2150, 2150, 2150, 2150, 2150, 2150,
+ 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
+ 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
+ 2150, 2150, 2150, 2150, 1, 1, 1, 2150,
+ 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
+ 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
+ 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
+ 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150,
+ 1, 2782, 1, 1, 1, 2783, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2782, 2171, 2141, 2171, 2171, 2171, 2171, 2171,
+ 2784, 1, 2171, 2171, 2774, 2171, 2172, 2171,
+ 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
+ 2171, 2171, 18, 2774, 19, 2171, 1, 2171,
+ 17, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
+ 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
+ 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
+ 2171, 2171, 2171, 1, 1, 1, 2171, 2171,
+ 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
+ 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
+ 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
+ 2171, 2171, 2171, 2171, 2171, 2171, 2171, 1,
+ 2782, 1, 1, 1, 2783, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2782,
+ 14, 15, 14, 14, 14, 14, 14, 2784,
+ 1, 14, 14, 2774, 14, 17, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 18, 2774, 19, 14, 1, 14, 17,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 1, 1, 1, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 1, 2785,
+ 1, 1, 1, 2786, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2785, 32,
+ 33, 32, 32, 32, 32, 32, 2787, 1,
+ 32, 32, 2780, 32, 35, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 36, 2780, 37, 32, 1, 32, 35, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 1, 1, 1, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 1, 2788, 1,
+ 1, 1, 2789, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2788, 2183, 2184,
+ 2183, 2183, 2183, 2183, 2183, 2790, 1, 2183,
+ 2183, 2774, 2183, 2143, 2183, 2183, 2183, 2183,
+ 2183, 2183, 2183, 2183, 2183, 2183, 2183, 1,
+ 2774, 1, 2183, 1, 2183, 1, 2183, 2183,
+ 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183,
+ 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183,
+ 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183,
+ 1, 1, 1, 2183, 2183, 2183, 2183, 2183,
+ 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183,
+ 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183,
+ 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183,
+ 2183, 2183, 2183, 2183, 1, 2788, 1, 1,
+ 1, 2789, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2788, 1, 1, 1,
+ 1, 1, 1, 1, 2790, 1, 1, 1,
+ 2774, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2774,
+ 1, 2791, 1, 1, 1, 2792, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2791, 1, 1, 1, 1, 1, 1, 1,
+ 2793, 1, 1, 1, 2780, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2780, 1, 2794, 1, 1,
+ 1, 2795, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2794, 2309, 2310, 2309,
+ 2309, 2309, 2309, 2309, 2796, 1, 2309, 2309,
+ 2710, 2309, 2797, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 18, 2710,
+ 19, 2309, 1, 2309, 2738, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 1,
+ 1, 1, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 1, 2798, 1, 1, 1,
+ 2799, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2798, 14, 15, 14, 14,
+ 14, 14, 14, 2800, 1, 14, 14, 2716,
+ 14, 17, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 18, 2716, 19,
+ 14, 1, 14, 2743, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 1, 1,
+ 1, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 1, 2801, 1, 1, 1, 2802,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2801, 32, 33, 32, 32, 32,
+ 32, 32, 2803, 1, 32, 32, 2747, 32,
+ 35, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 36, 2747, 37, 32,
+ 1, 32, 2749, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 1, 1, 1,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 1, 2804, 1, 1, 1, 2805, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2804, 2309, 2310, 2309, 2309, 2309, 2309,
+ 2309, 2806, 1, 2309, 2309, 2710, 2309, 2797,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 18, 2710, 19, 2309, 1,
+ 2309, 2738, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 1, 1, 1, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 1, 2807, 1, 1, 1, 2808, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2807, 14, 15, 14, 14, 14, 14, 14,
+ 2809, 1, 14, 14, 2716, 14, 1, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 1, 2716, 8, 14, 1, 14,
+ 2810, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 1, 1, 1, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 1,
+ 2811, 1, 1, 1, 2812, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2811,
+ 32, 33, 32, 32, 32, 32, 32, 2813,
+ 1, 32, 32, 2747, 32, 1, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 1, 2747, 48, 32, 1, 32, 2814,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 1, 1, 1, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 1, 2815,
+ 1, 1, 1, 2816, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2815, 2231,
+ 2184, 2231, 2231, 2231, 2231, 2231, 2817, 1,
+ 2231, 2231, 2774, 2231, 2818, 2231, 2231, 2231,
+ 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
+ 1, 2774, 1, 2231, 1, 2231, 1, 2231,
+ 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
+ 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
+ 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
+ 2231, 1, 1, 1, 2231, 2231, 2231, 2231,
+ 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
+ 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
+ 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231,
+ 2231, 2231, 2231, 2231, 2231, 1, 2815, 1,
+ 1, 1, 2816, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2815, 1, 1,
+ 1, 1, 1, 1, 1, 2817, 1, 1,
+ 1, 2774, 1, 2236, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2774, 1, 2819, 1, 1, 1, 2820, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2819, 1, 1, 1, 1, 1, 1,
+ 1, 2821, 1, 1, 1, 2780, 1, 2241,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2780, 1, 2815, 1,
+ 1, 1, 2816, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2815, 2238, 1,
+ 2238, 2238, 2238, 2238, 2238, 2817, 1, 2238,
+ 2238, 2774, 2238, 2236, 2238, 2238, 2238, 2238,
+ 2238, 2238, 2238, 2238, 2238, 2238, 2238, 1,
+ 2774, 1, 2238, 1, 2238, 1, 2238, 2238,
+ 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
+ 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
+ 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
+ 1, 1, 1, 2238, 2238, 2238, 2238, 2238,
+ 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
+ 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
+ 2238, 2238, 2238, 2238, 2238, 2238, 2238, 2238,
+ 2238, 2238, 2238, 2238, 1, 2822, 1, 1,
+ 1, 2823, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2822, 2735, 2824, 2735,
+ 2735, 2735, 2735, 2735, 2825, 1, 2735, 2735,
+ 2710, 2735, 2797, 2735, 2735, 2735, 2735, 2735,
+ 2735, 2735, 2735, 2735, 2735, 2735, 18, 2710,
+ 19, 2735, 1, 2735, 2738, 2735, 2735, 2735,
+ 2735, 2735, 2735, 2735, 2735, 2735, 2735, 2735,
+ 2735, 2735, 2735, 2735, 2735, 2735, 2735, 2735,
+ 2735, 2735, 2735, 2735, 2735, 2735, 2735, 1,
+ 1, 1, 2735, 2735, 2735, 2735, 2735, 2735,
+ 2735, 2735, 2735, 2735, 2735, 2735, 2735, 2735,
+ 2735, 2735, 2735, 2735, 2735, 2735, 2735, 2735,
+ 2735, 2735, 2735, 2735, 2735, 2735, 2735, 2735,
+ 2735, 2735, 2735, 1, 2826, 1, 1, 1,
+ 2827, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2826, 104, 105, 104, 104,
+ 104, 104, 104, 2828, 1, 104, 104, 2716,
+ 104, 1, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 1, 2716, 8,
+ 104, 1, 104, 2810, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 1, 1,
+ 1, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ 104, 104, 1, 2829, 1, 1, 1, 2830,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2829, 2207, 2208, 2207, 2207, 2207,
+ 2207, 2207, 2831, 1, 2207, 2207, 2747, 2207,
+ 1, 2207, 2207, 2207, 2207, 2207, 2207, 2207,
+ 2207, 2207, 2207, 2207, 1, 2747, 48, 2207,
+ 1, 2207, 2814, 2207, 2207, 2207, 2207, 2207,
+ 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207,
+ 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207,
+ 2207, 2207, 2207, 2207, 2207, 1, 1, 1,
+ 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207,
+ 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207,
+ 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207,
+ 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207,
+ 2207, 1, 2733, 1, 1, 1, 2734, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2733, 2309, 2310, 2309, 2309, 2309, 2309,
+ 2309, 2736, 1, 2309, 2309, 2710, 2309, 2737,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 18, 2710, 19, 2309, 1,
+ 2309, 2738, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 1, 1, 1, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 1, 2832, 1, 1, 1, 2833, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2832, 2309, 2310, 2309, 2309, 2309, 2309, 2309,
+ 2834, 1, 2309, 2309, 2835, 2309, 2737, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 18, 2835, 19, 2309, 1, 2309,
+ 2836, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 1, 1, 1, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 2309,
+ 2309, 2309, 2309, 2309, 2309, 2309, 2309, 1,
+ 2837, 1, 1, 1, 2838, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2837,
+ 14, 15, 14, 14, 14, 14, 14, 2839,
+ 1, 14, 14, 2840, 14, 2742, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 18, 2840, 19, 14, 1, 14, 2841,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 1, 1, 1, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 1, 2842,
+ 1, 1, 1, 2843, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2842, 32,
+ 33, 32, 32, 32, 32, 32, 2844, 1,
+ 32, 32, 2845, 32, 2748, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 36, 2845, 37, 32, 1, 32, 2846, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 1, 1, 1, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 1, 2847, 1,
+ 1, 1, 2848, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2847, 14, 15,
+ 14, 14, 14, 14, 14, 2849, 1, 14,
+ 14, 2850, 14, 2742, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 18,
+ 2850, 19, 14, 1, 14, 2851, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 1, 1, 1, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 1, 2852, 1, 1,
+ 1, 2853, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2852, 32, 33, 32,
+ 32, 32, 32, 32, 2854, 1, 32, 32,
+ 2855, 32, 2748, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 36, 2855,
+ 37, 32, 1, 32, 2856, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 1,
+ 1, 1, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 1, 2857, 1, 1, 1,
+ 2858, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2857, 2298, 2299, 2298, 2298,
+ 2298, 2298, 2298, 2859, 1, 2298, 2298, 2710,
+ 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298,
+ 2298, 2298, 2298, 2298, 2298, 1, 2710, 1,
+ 2298, 1, 2298, 2860, 2298, 2298, 2298, 2298,
+ 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298,
+ 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298,
+ 2298, 2298, 2298, 2298, 2298, 2298, 1, 1,
+ 1, 2298, 2298, 2298, 2298, 2298, 2298, 2298,
+ 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298,
+ 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298,
+ 2298, 2298, 2298, 2298, 2298, 2298, 2298, 2298,
+ 2298, 2298, 1, 2861, 1, 1, 1, 2862,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2861, 1, 1, 1, 1, 1,
+ 1, 1, 2863, 1, 1, 1, 2716, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2716, 1, 1,
+ 1, 1, 2810, 1, 2864, 1, 1, 1,
+ 2865, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2864, 1, 1, 1, 1,
+ 1, 1, 1, 2866, 1, 1, 1, 2747,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2747, 1,
+ 1, 1, 1, 2814, 1, 2867, 1, 1,
+ 1, 2868, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2867, 32, 33, 32,
+ 32, 32, 32, 32, 2869, 1, 32, 32,
+ 2747, 32, 2870, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 36, 2747,
+ 37, 32, 1, 32, 2871, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 1,
+ 1, 1, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 1, 2872, 1, 1, 1,
+ 2873, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2872, 2557, 15, 2557, 2557,
+ 2557, 2557, 2557, 2874, 1, 2557, 2557, 2722,
+ 2557, 2717, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 18, 2722, 19,
+ 2557, 1, 2557, 2875, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 1, 1,
+ 1, 2557, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 1, 2872, 1, 1, 1, 2873,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2872, 14, 15, 14, 14, 14,
+ 14, 14, 2874, 1, 14, 14, 2722, 14,
+ 2717, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 18, 2722, 19, 14,
+ 1, 14, 2875, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 1, 1, 1,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 1, 2876, 1, 1, 1, 2877, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2876, 32, 33, 32, 32, 32, 32,
+ 32, 2878, 1, 32, 32, 2726, 32, 2870,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 36, 2726, 37, 32, 1,
+ 32, 2879, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 1, 1, 1, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 1, 2186, 1, 1, 1, 2880, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2186, 2578, 2579, 2578, 2578, 2578, 2578, 2578,
+ 2790, 1, 2578, 2578, 2774, 2578, 2572, 2578,
+ 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578,
+ 2578, 2578, 1, 2774, 1, 2578, 1, 2578,
+ 1, 2578, 2578, 2578, 2578, 2578, 2578, 2578,
+ 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578,
+ 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578,
+ 2578, 2578, 2578, 1, 1, 1, 2578, 2578,
+ 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578,
+ 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578,
+ 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578,
+ 2578, 2578, 2578, 2578, 2578, 2578, 2578, 1,
+ 2881, 1, 1, 1, 2882, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2881,
+ 2684, 2685, 2684, 2684, 2684, 2684, 2684, 2883,
+ 1, 2684, 2684, 2710, 2684, 2884, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 18, 2710, 19, 2684, 1, 2684, 2712,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 1, 1, 1, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 1, 2885,
+ 1, 1, 1, 2886, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2885, 14,
+ 15, 14, 14, 14, 14, 14, 2887, 1,
+ 14, 14, 2716, 14, 17, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 18, 2716, 19, 14, 1, 14, 2718, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 1, 1, 1, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 1, 2888, 1,
+ 1, 1, 2889, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2888, 32, 33,
+ 32, 32, 32, 32, 32, 2890, 1, 32,
+ 32, 2747, 32, 35, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 36,
+ 2747, 37, 32, 1, 32, 2871, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 1, 1, 1, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 1, 2891, 1, 1,
+ 1, 2892, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2891, 2684, 2685, 2684,
+ 2684, 2684, 2684, 2684, 2893, 1, 2684, 2684,
+ 2710, 2684, 2884, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 18, 2710,
+ 19, 2684, 1, 2684, 2712, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 1,
+ 1, 1, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 1, 2894, 1, 1, 1,
+ 2895, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2894, 14, 15, 14, 14,
+ 14, 14, 14, 2896, 1, 14, 14, 2716,
+ 14, 1, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 1, 2716, 8,
+ 14, 1, 14, 2897, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 1, 1,
+ 1, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 1, 2898, 1, 1, 1, 2899,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2898, 32, 33, 32, 32, 32,
+ 32, 32, 2900, 1, 32, 32, 2747, 32,
+ 1, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 1, 2747, 48, 32,
+ 1, 32, 2901, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 1, 1, 1,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 1, 2235, 1, 1, 1, 2902, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2235, 2621, 2579, 2621, 2621, 2621, 2621,
+ 2621, 2817, 1, 2621, 2621, 2774, 2621, 2903,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 1, 2774, 1, 2621, 1,
+ 2621, 1, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 1, 1, 1, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
+ 1, 2904, 1, 1, 1, 2905, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2904, 2708, 2906, 2708, 2708, 2708, 2708, 2708,
+ 2907, 1, 2708, 2708, 2710, 2708, 2884, 2708,
+ 2708, 2708, 2708, 2708, 2708, 2708, 2708, 2708,
+ 2708, 2708, 18, 2710, 19, 2708, 1, 2708,
+ 2712, 2708, 2708, 2708, 2708, 2708, 2708, 2708,
+ 2708, 2708, 2708, 2708, 2708, 2708, 2708, 2708,
+ 2708, 2708, 2708, 2708, 2708, 2708, 2708, 2708,
+ 2708, 2708, 2708, 1, 1, 1, 2708, 2708,
+ 2708, 2708, 2708, 2708, 2708, 2708, 2708, 2708,
+ 2708, 2708, 2708, 2708, 2708, 2708, 2708, 2708,
+ 2708, 2708, 2708, 2708, 2708, 2708, 2708, 2708,
+ 2708, 2708, 2708, 2708, 2708, 2708, 2708, 1,
+ 2908, 1, 1, 1, 2909, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2908,
+ 2557, 2558, 2557, 2557, 2557, 2557, 2557, 2910,
+ 1, 2557, 2557, 2716, 2557, 1, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 1, 2716, 8, 2557, 1, 2557, 2897,
+ 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 1, 1, 1, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 2557, 2557,
+ 2557, 2557, 2557, 2557, 2557, 2557, 1, 2911,
+ 1, 1, 1, 2912, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2911, 2597,
+ 2598, 2597, 2597, 2597, 2597, 2597, 2913, 1,
+ 2597, 2597, 2747, 2597, 1, 2597, 2597, 2597,
+ 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597,
+ 1, 2747, 48, 2597, 1, 2597, 2901, 2597,
+ 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597,
+ 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597,
+ 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597,
+ 2597, 1, 1, 1, 2597, 2597, 2597, 2597,
+ 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597,
+ 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597,
+ 2597, 2597, 2597, 2597, 2597, 2597, 2597, 2597,
+ 2597, 2597, 2597, 2597, 2597, 1, 2706, 1,
+ 1, 1, 2707, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 2706, 2684, 2685,
+ 2684, 2684, 2684, 2684, 2684, 2709, 1, 2684,
+ 2684, 2710, 2684, 2711, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 18,
+ 2710, 19, 2684, 1, 2684, 2712, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 1, 1, 1, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 1, 2914, 1, 1,
+ 1, 2915, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2914, 2684, 2685, 2684,
+ 2684, 2684, 2684, 2684, 2916, 1, 2684, 2684,
+ 2835, 2684, 2711, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 18, 2835,
+ 19, 2684, 1, 2684, 2917, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 1,
+ 1, 1, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 2684, 2684, 2684, 2684, 2684,
+ 2684, 2684, 2684, 1, 2918, 1, 1, 1,
+ 2919, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2918, 14, 15, 14, 14,
+ 14, 14, 14, 2920, 1, 14, 14, 2840,
+ 14, 2717, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 18, 2840, 19,
+ 14, 1, 14, 2921, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 1, 1,
+ 1, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 1, 2922, 1, 1, 1, 2923,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2922, 32, 33, 32, 32, 32,
+ 32, 32, 2924, 1, 32, 32, 2845, 32,
+ 2870, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 36, 2845, 37, 32,
+ 1, 32, 2925, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 1, 1, 1,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 1, 2926, 1, 1, 1, 2927, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2926, 14, 15, 14, 14, 14, 14,
+ 14, 2928, 1, 14, 14, 2850, 14, 2717,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 18, 2850, 19, 14, 1,
+ 14, 2929, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 1, 1, 1, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 1, 2930, 1, 1, 1, 2931, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 2930, 32, 33, 32, 32, 32, 32, 32,
+ 2932, 1, 32, 32, 2855, 32, 2870, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 36, 2855, 37, 32, 1, 32,
+ 2933, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 1, 1, 1, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 1,
+ 2934, 1, 1, 1, 2935, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2934,
+ 2673, 2674, 2673, 2673, 2673, 2673, 2673, 2936,
+ 1, 2673, 2673, 2710, 2673, 2673, 2673, 2673,
+ 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
+ 2673, 1, 2710, 1, 2673, 1, 2673, 2937,
+ 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
+ 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
+ 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
+ 2673, 2673, 1, 1, 1, 2673, 2673, 2673,
+ 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
+ 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
+ 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673,
+ 2673, 2673, 2673, 2673, 2673, 2673, 1, 2938,
+ 1, 1, 1, 2939, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2938, 1,
+ 1, 1, 1, 1, 1, 1, 2940, 1,
+ 1, 1, 2716, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2716, 1, 1, 1, 1, 2897, 1,
+ 2941, 1, 1, 1, 2942, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 2941,
+ 1, 1, 1, 1, 1, 1, 1, 2943,
+ 1, 1, 1, 2747, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2747, 1, 1, 1, 1, 2901,
+ 1, 1, 0
+]
+
+class << self
+ attr_accessor :_address_lists_trans_targs
+ private :_address_lists_trans_targs, :_address_lists_trans_targs=
+end
+self._address_lists_trans_targs = [
+ 1, 0, 2, 1335, 1302, 1314, 1339, 1318,
+ 20, 3, 5, 1336, 6, 7, 6, 9,
+ 14, 15, 49, 20, 8, 10, 11, 6,
+ 13, 10, 11, 6, 13, 12, 6, 7,
+ 6, 9, 14, 15, 49, 20, 16, 17,
+ 19, 16, 17, 19, 18, 16, 17, 19,
+ 20, 21, 22, 24, 1184, 1201, 1202, 1224,
+ 1206, 21, 22, 1201, 1202, 1206, 23, 25,
+ 26, 24, 1158, 28, 1170, 1337, 1119, 25,
+ 26, 28, 29, 1337, 1119, 27, 25, 26,
+ 28, 29, 1337, 1119, 30, 32, 1152, 1157,
+ 31, 33, 34, 36, 1119, 35, 33, 34,
+ 36, 1119, 38, 40, 42, 1341, 44, 45,
+ 1343, 1052, 1057, 44, 45, 1057, 46, 48,
+ 1344, 50, 51, 53, 96, 1008, 1009, 877,
+ 1349, 71, 66, 50, 51, 53, 96, 1008,
+ 864, 71, 52, 54, 55, 53, 492, 531,
+ 92, 521, 1346, 71, 433, 54, 55, 57,
+ 60, 531, 92, 105, 1346, 433, 56, 54,
+ 57, 58, 65, 66, 59, 61, 62, 57,
+ 64, 61, 62, 57, 64, 63, 57, 58,
+ 57, 60, 65, 66, 71, 67, 68, 70,
+ 67, 68, 70, 69, 67, 68, 70, 71,
+ 72, 73, 75, 943, 960, 961, 983, 965,
+ 72, 73, 960, 961, 965, 74, 76, 77,
+ 75, 917, 79, 929, 88, 878, 76, 77,
+ 79, 80, 88, 878, 78, 76, 77, 79,
+ 80, 88, 878, 81, 83, 911, 916, 82,
+ 84, 85, 87, 878, 86, 84, 85, 87,
+ 878, 89, 91, 92, 1346, 90, 89, 91,
+ 92, 1346, 93, 94, 544, 545, 93, 94,
+ 544, 95, 97, 537, 538, 540, 536, 97,
+ 98, 100, 536, 99, 101, 102, 487, 104,
+ 92, 1346, 433, 101, 102, 104, 92, 1346,
+ 433, 103, 101, 101, 102, 104, 92, 105,
+ 1346, 433, 106, 107, 109, 481, 486, 106,
+ 107, 486, 108, 110, 111, 113, 433, 112,
+ 110, 110, 111, 113, 433, 115, 1347, 117,
+ 118, 116, 236, 275, 155, 265, 134, 177,
+ 117, 118, 120, 123, 275, 155, 168, 177,
+ 119, 117, 120, 121, 128, 129, 122, 124,
+ 125, 120, 127, 124, 125, 120, 127, 126,
+ 120, 121, 120, 123, 128, 129, 134, 130,
+ 131, 133, 130, 131, 133, 134, 132, 130,
+ 131, 133, 134, 135, 136, 138, 368, 385,
+ 386, 408, 390, 135, 136, 385, 386, 390,
+ 137, 139, 140, 138, 342, 142, 354, 151,
+ 303, 139, 140, 142, 143, 151, 303, 141,
+ 139, 140, 142, 143, 151, 303, 144, 146,
+ 336, 341, 145, 147, 148, 150, 303, 149,
+ 147, 148, 150, 303, 152, 154, 155, 153,
+ 152, 154, 155, 156, 157, 116, 159, 288,
+ 302, 134, 129, 156, 157, 116, 159, 288,
+ 289, 158, 160, 281, 282, 284, 280, 160,
+ 161, 163, 280, 162, 164, 165, 231, 167,
+ 155, 177, 164, 165, 167, 155, 177, 166,
+ 164, 164, 165, 167, 155, 168, 177, 169,
+ 170, 172, 225, 230, 169, 170, 230, 171,
+ 173, 174, 176, 177, 175, 173, 173, 174,
+ 176, 177, 178, 179, 181, 192, 207, 201,
+ 221, 178, 179, 181, 192, 207, 208, 221,
+ 180, 182, 183, 185, 155, 206, 1346, 186,
+ 184, 182, 182, 183, 185, 155, 186, 1346,
+ 187, 188, 190, 191, 187, 188, 191, 189,
+ 187, 188, 190, 191, 193, 203, 204, 202,
+ 193, 194, 196, 202, 195, 197, 198, 196,
+ 200, 201, 199, 197, 197, 198, 200, 203,
+ 204, 205, 178, 179, 181, 192, 207, 208,
+ 221, 209, 214, 210, 211, 213, 212, 210,
+ 211, 213, 215, 219, 218, 216, 217, 220,
+ 222, 224, 223, 226, 227, 173, 229, 226,
+ 227, 173, 229, 228, 169, 170, 172, 225,
+ 230, 232, 233, 235, 244, 232, 233, 235,
+ 234, 232, 232, 233, 235, 155, 1346, 177,
+ 237, 241, 242, 240, 237, 238, 231, 240,
+ 239, 241, 242, 243, 245, 246, 248, 245,
+ 246, 248, 249, 247, 245, 246, 248, 249,
+ 250, 251, 253, 214, 264, 208, 250, 251,
+ 253, 264, 252, 254, 255, 257, 263, 258,
+ 256, 254, 255, 257, 258, 259, 261, 262,
+ 260, 259, 261, 262, 250, 251, 253, 214,
+ 264, 266, 267, 270, 269, 266, 267, 269,
+ 268, 266, 267, 269, 271, 277, 278, 276,
+ 271, 272, 274, 276, 273, 117, 118, 275,
+ 277, 278, 279, 281, 282, 284, 283, 284,
+ 285, 287, 155, 1346, 177, 286, 284, 284,
+ 285, 287, 155, 1346, 177, 156, 157, 116,
+ 159, 288, 289, 290, 295, 289, 291, 292,
+ 294, 249, 291, 292, 294, 293, 291, 292,
+ 294, 296, 300, 299, 297, 298, 301, 302,
+ 304, 305, 307, 317, 331, 326, 332, 304,
+ 305, 307, 317, 331, 326, 332, 306, 308,
+ 309, 311, 330, 151, 312, 310, 308, 309,
+ 311, 312, 151, 313, 315, 316, 314, 313,
+ 315, 316, 318, 328, 327, 319, 321, 320,
+ 322, 323, 325, 324, 322, 323, 325, 329,
+ 304, 305, 307, 317, 331, 326, 332, 333,
+ 335, 334, 337, 338, 147, 340, 337, 338,
+ 147, 340, 339, 144, 146, 336, 341, 343,
+ 352, 351, 344, 346, 345, 347, 348, 350,
+ 347, 348, 350, 349, 347, 348, 350, 353,
+ 355, 356, 359, 358, 355, 356, 358, 357,
+ 355, 356, 358, 360, 365, 366, 364, 360,
+ 361, 363, 364, 362, 365, 366, 367, 369,
+ 378, 379, 381, 377, 369, 370, 372, 377,
+ 371, 373, 374, 376, 303, 373, 374, 376,
+ 303, 375, 373, 374, 376, 303, 378, 379,
+ 381, 380, 381, 382, 384, 303, 383, 381,
+ 382, 384, 303, 135, 136, 138, 368, 385,
+ 386, 408, 390, 387, 389, 388, 387, 389,
+ 391, 392, 394, 414, 428, 423, 429, 391,
+ 392, 394, 414, 428, 423, 429, 393, 395,
+ 396, 398, 399, 427, 403, 409, 397, 395,
+ 396, 398, 399, 409, 403, 399, 400, 402,
+ 403, 401, 399, 400, 402, 403, 404, 405,
+ 138, 368, 407, 408, 404, 405, 407, 406,
+ 404, 405, 407, 408, 410, 412, 413, 411,
+ 410, 412, 413, 415, 425, 424, 416, 418,
+ 417, 419, 420, 422, 421, 419, 420, 422,
+ 426, 391, 392, 394, 414, 428, 423, 429,
+ 430, 432, 431, 434, 435, 437, 448, 463,
+ 457, 477, 434, 435, 437, 448, 463, 464,
+ 477, 436, 438, 439, 441, 92, 462, 442,
+ 440, 438, 438, 439, 441, 92, 442, 443,
+ 444, 446, 447, 443, 444, 447, 445, 443,
+ 444, 446, 447, 449, 459, 460, 458, 449,
+ 450, 452, 458, 451, 453, 454, 452, 456,
+ 457, 455, 453, 453, 454, 456, 459, 460,
+ 461, 434, 435, 437, 448, 463, 464, 477,
+ 465, 470, 466, 467, 469, 468, 466, 467,
+ 469, 471, 475, 474, 472, 473, 476, 478,
+ 480, 479, 482, 483, 110, 485, 482, 483,
+ 110, 485, 484, 106, 107, 109, 481, 486,
+ 488, 489, 491, 500, 488, 489, 491, 490,
+ 488, 488, 489, 491, 92, 433, 493, 497,
+ 498, 496, 493, 494, 487, 496, 495, 497,
+ 498, 499, 501, 502, 504, 501, 502, 504,
+ 505, 503, 501, 502, 504, 505, 506, 507,
+ 509, 470, 520, 464, 506, 507, 509, 520,
+ 508, 510, 511, 513, 519, 514, 512, 510,
+ 511, 513, 514, 515, 517, 518, 516, 515,
+ 517, 518, 506, 507, 509, 470, 520, 522,
+ 523, 526, 525, 522, 523, 525, 524, 522,
+ 523, 525, 527, 533, 534, 532, 527, 528,
+ 530, 532, 529, 54, 55, 531, 533, 534,
+ 535, 537, 538, 540, 539, 540, 541, 543,
+ 92, 433, 542, 540, 540, 541, 543, 92,
+ 433, 93, 94, 53, 96, 544, 545, 864,
+ 1349, 546, 547, 549, 832, 849, 863, 567,
+ 562, 546, 547, 549, 832, 849, 850, 567,
+ 548, 550, 551, 549, 784, 720, 545, 818,
+ 1349, 567, 730, 550, 551, 553, 556, 720,
+ 545, 721, 1349, 730, 552, 550, 553, 554,
+ 561, 562, 555, 557, 558, 553, 560, 557,
+ 558, 553, 560, 559, 553, 554, 553, 556,
+ 561, 562, 567, 563, 564, 566, 563, 564,
+ 566, 565, 563, 564, 566, 567, 568, 569,
+ 571, 655, 672, 673, 695, 677, 568, 569,
+ 672, 673, 677, 570, 572, 573, 571, 629,
+ 575, 641, 584, 590, 572, 573, 575, 576,
+ 584, 590, 574, 572, 573, 575, 576, 584,
+ 590, 577, 579, 623, 628, 578, 580, 581,
+ 583, 590, 582, 580, 581, 583, 590, 585,
+ 587, 545, 1349, 586, 585, 587, 545, 1349,
+ 589, 591, 592, 594, 604, 618, 613, 619,
+ 591, 592, 594, 604, 618, 613, 619, 593,
+ 595, 596, 598, 617, 584, 599, 597, 595,
+ 596, 598, 599, 584, 600, 602, 603, 601,
+ 600, 602, 603, 605, 615, 614, 606, 608,
+ 607, 609, 610, 612, 611, 609, 610, 612,
+ 616, 591, 592, 594, 604, 618, 613, 619,
+ 620, 622, 621, 624, 625, 580, 627, 624,
+ 625, 580, 627, 626, 577, 579, 623, 628,
+ 630, 639, 638, 631, 633, 632, 634, 635,
+ 637, 634, 635, 637, 636, 634, 635, 637,
+ 640, 642, 643, 646, 645, 642, 643, 645,
+ 644, 642, 643, 645, 647, 652, 653, 651,
+ 647, 648, 650, 651, 649, 652, 653, 654,
+ 656, 665, 666, 668, 664, 656, 657, 659,
+ 664, 658, 660, 661, 663, 590, 660, 661,
+ 663, 590, 662, 660, 661, 663, 590, 665,
+ 666, 668, 667, 668, 669, 671, 590, 670,
+ 668, 669, 671, 590, 568, 569, 571, 655,
+ 672, 673, 695, 677, 674, 676, 675, 674,
+ 676, 678, 679, 681, 701, 715, 710, 716,
+ 678, 679, 681, 701, 715, 710, 716, 680,
+ 682, 683, 685, 686, 714, 690, 696, 684,
+ 682, 683, 685, 686, 696, 690, 686, 687,
+ 689, 690, 688, 686, 687, 689, 690, 691,
+ 692, 571, 655, 694, 695, 691, 692, 694,
+ 693, 691, 692, 694, 695, 697, 699, 700,
+ 698, 697, 699, 700, 702, 712, 711, 703,
+ 705, 704, 706, 707, 709, 708, 706, 707,
+ 709, 713, 678, 679, 681, 701, 715, 710,
+ 716, 717, 719, 718, 550, 551, 720, 545,
+ 721, 1349, 730, 722, 723, 725, 778, 783,
+ 722, 723, 783, 724, 726, 727, 729, 730,
+ 728, 726, 726, 727, 729, 730, 731, 732,
+ 734, 745, 760, 754, 774, 731, 732, 734,
+ 745, 760, 761, 774, 733, 735, 736, 738,
+ 545, 759, 1349, 739, 737, 735, 735, 736,
+ 738, 545, 739, 1349, 740, 741, 743, 744,
+ 740, 741, 744, 742, 740, 741, 743, 744,
+ 746, 756, 757, 755, 746, 747, 749, 755,
+ 748, 750, 751, 749, 753, 754, 752, 750,
+ 750, 751, 753, 756, 757, 758, 731, 732,
+ 734, 745, 760, 761, 774, 762, 767, 763,
+ 764, 766, 765, 763, 764, 766, 768, 772,
+ 771, 769, 770, 773, 775, 777, 776, 779,
+ 780, 726, 782, 779, 780, 726, 782, 781,
+ 722, 723, 725, 778, 783, 785, 815, 816,
+ 814, 785, 786, 788, 814, 787, 789, 790,
+ 788, 792, 793, 789, 790, 792, 791, 789,
+ 789, 790, 792, 794, 795, 797, 794, 795,
+ 797, 798, 796, 794, 795, 797, 798, 799,
+ 800, 802, 767, 813, 761, 799, 800, 802,
+ 813, 801, 803, 804, 806, 812, 807, 805,
+ 803, 804, 806, 807, 808, 810, 811, 809,
+ 808, 810, 811, 799, 800, 802, 767, 813,
+ 815, 816, 817, 819, 820, 823, 822, 819,
+ 820, 822, 821, 819, 820, 822, 824, 829,
+ 830, 828, 824, 825, 827, 828, 826, 829,
+ 830, 831, 833, 842, 843, 845, 841, 833,
+ 834, 836, 841, 835, 837, 838, 840, 545,
+ 1349, 730, 837, 838, 840, 545, 1349, 730,
+ 839, 837, 837, 838, 840, 545, 1349, 730,
+ 842, 843, 845, 844, 845, 846, 848, 545,
+ 1349, 730, 847, 845, 845, 846, 848, 545,
+ 1349, 730, 546, 547, 549, 832, 849, 850,
+ 851, 856, 850, 852, 853, 855, 798, 852,
+ 853, 855, 854, 852, 853, 855, 857, 861,
+ 860, 858, 859, 862, 863, 865, 870, 864,
+ 866, 867, 869, 505, 866, 867, 869, 868,
+ 866, 867, 869, 871, 875, 874, 872, 873,
+ 876, 877, 879, 880, 882, 892, 906, 901,
+ 907, 879, 880, 882, 892, 906, 901, 907,
+ 881, 883, 884, 886, 905, 88, 887, 885,
+ 883, 884, 886, 887, 88, 888, 890, 891,
+ 889, 888, 890, 891, 893, 903, 902, 894,
+ 896, 895, 897, 898, 900, 899, 897, 898,
+ 900, 904, 879, 880, 882, 892, 906, 901,
+ 907, 908, 910, 909, 912, 913, 84, 915,
+ 912, 913, 84, 915, 914, 81, 83, 911,
+ 916, 918, 927, 926, 919, 921, 920, 922,
+ 923, 925, 922, 923, 925, 924, 922, 923,
+ 925, 928, 930, 931, 934, 933, 930, 931,
+ 933, 932, 930, 931, 933, 935, 940, 941,
+ 939, 935, 936, 938, 939, 937, 940, 941,
+ 942, 944, 953, 954, 956, 952, 944, 945,
+ 947, 952, 946, 948, 949, 951, 878, 948,
+ 949, 951, 878, 950, 948, 949, 951, 878,
+ 953, 954, 956, 955, 956, 957, 959, 878,
+ 958, 956, 957, 959, 878, 72, 73, 75,
+ 943, 960, 961, 983, 965, 962, 964, 963,
+ 962, 964, 966, 967, 969, 989, 1003, 998,
+ 1004, 966, 967, 969, 989, 1003, 998, 1004,
+ 968, 970, 971, 973, 974, 1002, 978, 984,
+ 972, 970, 971, 973, 974, 984, 978, 974,
+ 975, 977, 978, 976, 974, 975, 977, 978,
+ 979, 980, 75, 943, 982, 983, 979, 980,
+ 982, 981, 979, 980, 982, 983, 985, 987,
+ 988, 986, 985, 987, 988, 990, 1000, 999,
+ 991, 993, 992, 994, 995, 997, 996, 994,
+ 995, 997, 1001, 966, 967, 969, 989, 1003,
+ 998, 1004, 1005, 1007, 1006, 50, 51, 1008,
+ 1009, 1010, 1011, 1013, 1010, 1011, 1013, 1012,
+ 1010, 1011, 1013, 1015, 1016, 1351, 1025, 1037,
+ 1031, 1048, 1015, 1016, 1351, 1025, 1037, 1038,
+ 1048, 1017, 1019, 1352, 1021, 1022, 1354, 1024,
+ 1021, 1022, 1024, 1023, 1021, 1022, 1354, 1024,
+ 1026, 1033, 1034, 1032, 1026, 1027, 1355, 1032,
+ 1028, 1030, 1356, 1355, 1031, 1033, 1034, 1035,
+ 1015, 1016, 1351, 1025, 1037, 1038, 1048, 1358,
+ 1041, 1040, 1359, 1042, 1046, 1045, 1043, 1044,
+ 1047, 1049, 1051, 1050, 1053, 1054, 1344, 1056,
+ 1053, 1054, 1344, 1056, 1055, 44, 45, 1343,
+ 1052, 1057, 1059, 1079, 1080, 1078, 1059, 1060,
+ 1361, 1078, 1061, 1063, 1362, 1065, 1365, 1067,
+ 1068, 1367, 1041, 1077, 1038, 1067, 1068, 1367,
+ 1077, 1069, 1071, 1368, 1072, 1073, 1370, 1075,
+ 1074, 1072, 1073, 1370, 1075, 1067, 1068, 1367,
+ 1041, 1077, 1079, 1080, 1081, 1083, 1372, 1085,
+ 1089, 1090, 1088, 1085, 1086, 1374, 1088, 1087,
+ 1089, 1090, 1091, 1093, 1099, 1100, 1378, 1098,
+ 1093, 1094, 1375, 1098, 1095, 1097, 1376, 1099,
+ 1100, 1378, 1101, 1103, 1378, 1105, 1106, 1340,
+ 1092, 1104, 1108, 1105, 1106, 1340, 1092, 1104,
+ 1108, 1107, 1380, 1111, 1108, 1110, 1381, 1112,
+ 1116, 1115, 1113, 1114, 1117, 1361, 1058, 1118,
+ 1120, 1121, 1123, 1133, 1147, 1142, 1148, 1120,
+ 1121, 1123, 1133, 1147, 1142, 1148, 1122, 1124,
+ 1125, 1127, 1146, 1337, 1128, 1126, 1124, 1125,
+ 1127, 1128, 1337, 1129, 1131, 1132, 1130, 1129,
+ 1131, 1132, 1134, 1144, 1143, 1135, 1137, 1136,
+ 1138, 1139, 1141, 1140, 1138, 1139, 1141, 1145,
+ 1120, 1121, 1123, 1133, 1147, 1142, 1148, 1149,
+ 1151, 1150, 1153, 1154, 33, 1156, 1153, 1154,
+ 33, 1156, 1155, 30, 32, 1152, 1157, 1159,
+ 1168, 1167, 1160, 1162, 1161, 1163, 1164, 1166,
+ 1163, 1164, 1166, 1165, 1163, 1164, 1166, 1169,
+ 1171, 1172, 1175, 1174, 1171, 1172, 1174, 1173,
+ 1171, 1172, 1174, 1176, 1181, 1182, 1180, 1176,
+ 1177, 1179, 1180, 1178, 1181, 1182, 1183, 1185,
+ 1194, 1195, 1197, 1193, 1185, 1186, 1188, 1193,
+ 1187, 1189, 1190, 1192, 1119, 1189, 1190, 1192,
+ 1119, 1191, 1189, 1190, 1192, 1119, 1194, 1195,
+ 1197, 1196, 1197, 1198, 1200, 1119, 1199, 1197,
+ 1198, 1200, 1119, 21, 22, 24, 1184, 1201,
+ 1202, 1224, 1206, 1203, 1205, 1204, 1203, 1205,
+ 1207, 1208, 1210, 1230, 1244, 1239, 1245, 1207,
+ 1208, 1210, 1230, 1244, 1239, 1245, 1209, 1211,
+ 1212, 1214, 1215, 1243, 1219, 1225, 1213, 1211,
+ 1212, 1214, 1215, 1225, 1219, 1215, 1216, 1218,
+ 1219, 1217, 1215, 1216, 1218, 1219, 1220, 1221,
+ 24, 1184, 1223, 1224, 1220, 1221, 1223, 1222,
+ 1220, 1221, 1223, 1224, 1226, 1228, 1229, 1227,
+ 1226, 1228, 1229, 1231, 1241, 1240, 1232, 1234,
+ 1233, 1235, 1236, 1238, 1237, 1235, 1236, 1238,
+ 1242, 1207, 1208, 1210, 1230, 1244, 1239, 1245,
+ 1246, 1248, 1247, 1250, 1251, 1384, 1268, 1273,
+ 1250, 1251, 1273, 1252, 1254, 1385, 1256, 1257,
+ 1259, 1256, 1257, 1259, 1260, 1258, 1256, 1257,
+ 1259, 1260, 1387, 1261, 1262, 1266, 1265, 1263,
+ 1264, 1267, 1269, 1270, 1385, 1272, 1269, 1270,
+ 1385, 1272, 1271, 1250, 1251, 1384, 1268, 1273,
+ 1275, 1289, 1290, 1288, 1275, 1276, 1388, 1288,
+ 1277, 1279, 1389, 1281, 1392, 1283, 1284, 1394,
+ 1261, 1287, 1260, 1283, 1284, 1394, 1287, 1285,
+ 1283, 1284, 1394, 1261, 1287, 1289, 1290, 1291,
+ 1293, 1396, 1295, 1299, 1300, 1298, 1295, 1296,
+ 1398, 1298, 1297, 1299, 1300, 1301, 1303, 1309,
+ 1310, 1402, 1308, 1303, 1304, 1399, 1308, 1305,
+ 1307, 1400, 1309, 1310, 1402, 1311, 1313, 1402,
+ 1315, 1316, 1335, 1302, 1314, 1318, 1315, 1316,
+ 1317, 1404, 1321, 1318, 1320, 1405, 1322, 1326,
+ 1325, 1323, 1324, 1327, 1388, 1274, 1328, 1330,
+ 1331, 1330, 1407, 1333, 1330, 1331, 1330, 1407,
+ 1333, 1332, 1, 2, 1335, 1302, 1314, 1328,
+ 20, 15, 1336, 4, 1335, 1383, 1339, 1395,
+ 1255, 1336, 4, 1383, 1339, 1249, 1255, 1337,
+ 37, 1338, 1339, 1337, 37, 1338, 1339, 1339,
+ 39, 1340, 1092, 1104, 1118, 1341, 41, 1340,
+ 1342, 1371, 1014, 1341, 41, 1342, 43, 1014,
+ 1341, 41, 1342, 1339, 43, 1014, 1344, 47,
+ 1345, 1014, 1344, 47, 1345, 1014, 1347, 114,
+ 1348, 114, 1348, 1347, 114, 1348, 1339, 588,
+ 1350, 588, 1350, 1352, 1018, 1353, 1339, 1036,
+ 1020, 1352, 1018, 1353, 1339, 1020, 1356, 1029,
+ 1357, 1356, 1029, 1357, 1359, 1039, 1360, 1359,
+ 1039, 1360, 1362, 1062, 1363, 1364, 1362, 1062,
+ 1363, 1362, 1062, 1363, 1365, 1064, 1366, 1365,
+ 1064, 1366, 1066, 1365, 1064, 1366, 1066, 1368,
+ 1070, 1369, 1076, 1368, 1070, 1369, 1372, 1082,
+ 1084, 1373, 1372, 1082, 1373, 1372, 1082, 1373,
+ 1376, 1096, 1377, 1339, 1014, 1376, 1096, 1377,
+ 1339, 1014, 1376, 1096, 1377, 1339, 1014, 1378,
+ 1102, 1379, 1339, 1014, 1378, 1102, 1379, 1339,
+ 1014, 1381, 1109, 1382, 1066, 1381, 1109, 1382,
+ 1381, 1109, 1382, 1336, 4, 1383, 1249, 1255,
+ 1385, 1253, 1386, 1255, 1385, 1253, 1386, 1255,
+ 1039, 1389, 1278, 1390, 1391, 1389, 1278, 1390,
+ 1389, 1278, 1390, 1392, 1280, 1393, 1392, 1280,
+ 1393, 1282, 1392, 1280, 1393, 1282, 1070, 1286,
+ 1396, 1292, 1294, 1397, 1396, 1292, 1397, 1396,
+ 1292, 1397, 1400, 1306, 1401, 1255, 1400, 1306,
+ 1401, 1255, 1400, 1306, 1401, 1255, 1402, 1312,
+ 1403, 1255, 1402, 1312, 1403, 1255, 1405, 1319,
+ 1406, 1282, 1405, 1319, 1406, 1405, 1319, 1406
+]
+
+class << self
+ attr_accessor :_address_lists_trans_actions
+ private :_address_lists_trans_actions, :_address_lists_trans_actions=
+end
+self._address_lists_trans_actions = [
+ 0, 0, 0, 1, 1, 2, 0, 1,
+ 3, 0, 0, 0, 4, 4, 0, 0,
+ 5, 0, 6, 7, 0, 8, 8, 9,
+ 8, 0, 0, 10, 0, 0, 11, 11,
+ 12, 12, 13, 12, 14, 15, 4, 4,
+ 5, 0, 0, 2, 0, 12, 12, 16,
+ 17, 18, 18, 1, 1, 19, 20, 1,
+ 20, 0, 0, 2, 0, 0, 0, 21,
+ 21, 0, 0, 22, 0, 21, 23, 0,
+ 0, 2, 0, 0, 24, 0, 12, 12,
+ 16, 12, 12, 25, 0, 0, 0, 2,
+ 0, 0, 0, 2, 0, 0, 12, 12,
+ 16, 12, 0, 0, 0, 0, 4, 4,
+ 0, 0, 5, 0, 0, 2, 0, 0,
+ 0, 26, 26, 26, 26, 27, 0, 26,
+ 0, 28, 29, 0, 0, 1, 1, 2,
+ 1, 3, 0, 30, 30, 0, 0, 31,
+ 32, 0, 32, 7, 23, 4, 4, 0,
+ 0, 5, 33, 0, 33, 24, 0, 0,
+ 4, 4, 5, 0, 0, 8, 8, 9,
+ 8, 0, 0, 10, 0, 0, 11, 11,
+ 12, 12, 13, 12, 15, 4, 4, 5,
+ 0, 0, 2, 0, 12, 12, 16, 17,
+ 18, 18, 1, 1, 19, 20, 1, 20,
+ 0, 0, 2, 0, 0, 0, 21, 21,
+ 0, 0, 22, 0, 21, 23, 0, 0,
+ 2, 0, 0, 24, 0, 12, 12, 16,
+ 12, 12, 25, 0, 0, 0, 2, 0,
+ 0, 0, 2, 0, 0, 12, 12, 16,
+ 12, 0, 2, 34, 34, 0, 12, 16,
+ 35, 35, 26, 26, 27, 0, 0, 0,
+ 2, 0, 8, 8, 8, 9, 8, 0,
+ 0, 10, 0, 0, 30, 30, 0, 31,
+ 36, 36, 37, 4, 4, 5, 38, 38,
+ 39, 0, 0, 11, 11, 13, 40, 12,
+ 40, 41, 4, 4, 0, 0, 5, 0,
+ 0, 2, 0, 4, 4, 5, 0, 0,
+ 0, 11, 11, 13, 12, 0, 0, 30,
+ 30, 0, 0, 31, 32, 0, 7, 23,
+ 4, 4, 0, 0, 5, 33, 0, 24,
+ 0, 0, 4, 4, 5, 0, 0, 8,
+ 8, 9, 8, 0, 0, 10, 0, 0,
+ 11, 11, 12, 12, 13, 12, 15, 4,
+ 4, 5, 0, 0, 2, 3, 0, 12,
+ 12, 16, 17, 18, 18, 1, 1, 19,
+ 20, 1, 20, 0, 0, 2, 0, 0,
+ 0, 21, 21, 0, 0, 22, 0, 21,
+ 23, 0, 0, 2, 0, 0, 24, 0,
+ 12, 12, 16, 12, 12, 25, 0, 0,
+ 0, 2, 0, 0, 0, 2, 0, 0,
+ 12, 12, 16, 12, 0, 2, 34, 0,
+ 12, 16, 35, 26, 26, 26, 26, 27,
+ 26, 28, 29, 0, 0, 1, 1, 2,
+ 1, 0, 8, 8, 8, 9, 8, 0,
+ 0, 10, 0, 0, 30, 30, 0, 31,
+ 36, 37, 4, 4, 5, 38, 39, 0,
+ 0, 11, 11, 13, 40, 12, 41, 4,
+ 4, 0, 0, 5, 0, 0, 2, 0,
+ 4, 4, 5, 0, 0, 0, 11, 11,
+ 13, 12, 42, 42, 43, 43, 44, 43,
+ 43, 0, 0, 0, 0, 2, 0, 0,
+ 0, 4, 4, 5, 45, 0, 45, 0,
+ 0, 0, 11, 11, 13, 46, 12, 46,
+ 4, 4, 0, 5, 0, 0, 2, 0,
+ 12, 12, 12, 16, 8, 8, 8, 8,
+ 0, 0, 10, 0, 0, 4, 4, 0,
+ 5, 0, 0, 0, 11, 11, 13, 0,
+ 0, 0, 12, 12, 12, 12, 16, 12,
+ 12, 0, 0, 0, 0, 2, 0, 12,
+ 12, 16, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 8, 8, 9, 8, 0,
+ 0, 10, 0, 0, 12, 12, 12, 12,
+ 16, 30, 30, 31, 0, 4, 4, 5,
+ 0, 0, 11, 11, 13, 47, 47, 25,
+ 8, 8, 8, 8, 0, 0, 10, 0,
+ 0, 0, 0, 0, 30, 30, 31, 0,
+ 0, 2, 24, 0, 12, 12, 16, 25,
+ 43, 43, 43, 43, 48, 43, 0, 0,
+ 0, 2, 0, 0, 0, 2, 0, 0,
+ 0, 12, 12, 16, 12, 0, 0, 2,
+ 0, 12, 12, 16, 12, 12, 12, 12,
+ 16, 30, 30, 0, 31, 0, 0, 2,
+ 0, 12, 12, 16, 8, 8, 8, 8,
+ 0, 0, 10, 0, 0, 11, 11, 13,
+ 0, 0, 0, 0, 0, 10, 0, 4,
+ 4, 5, 49, 49, 50, 0, 0, 11,
+ 11, 13, 51, 51, 52, 12, 12, 53,
+ 53, 16, 53, 0, 0, 0, 21, 21,
+ 22, 23, 0, 0, 2, 0, 12, 12,
+ 16, 0, 0, 0, 0, 0, 0, 0,
+ 43, 43, 43, 43, 48, 43, 43, 0,
+ 0, 0, 0, 2, 0, 0, 0, 0,
+ 0, 2, 0, 54, 0, 0, 12, 12,
+ 16, 12, 55, 0, 0, 2, 0, 12,
+ 12, 16, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2, 0, 12, 12, 16, 0,
+ 12, 12, 12, 12, 16, 12, 12, 0,
+ 0, 0, 8, 8, 9, 8, 0, 0,
+ 10, 0, 0, 12, 12, 12, 16, 0,
+ 0, 0, 0, 0, 0, 21, 21, 22,
+ 0, 0, 2, 0, 12, 12, 16, 0,
+ 21, 21, 0, 22, 0, 0, 2, 0,
+ 12, 12, 16, 8, 8, 8, 8, 0,
+ 0, 10, 0, 0, 0, 0, 0, 8,
+ 8, 8, 9, 8, 0, 0, 10, 0,
+ 0, 21, 21, 22, 37, 0, 0, 2,
+ 39, 0, 12, 12, 16, 41, 0, 0,
+ 10, 0, 0, 0, 2, 50, 0, 12,
+ 12, 16, 52, 12, 12, 53, 53, 16,
+ 12, 53, 12, 0, 2, 0, 12, 16,
+ 43, 43, 43, 43, 48, 43, 43, 0,
+ 0, 0, 0, 2, 0, 0, 0, 0,
+ 0, 2, 54, 0, 54, 0, 0, 12,
+ 12, 16, 55, 12, 55, 0, 0, 2,
+ 0, 0, 12, 12, 16, 12, 56, 56,
+ 56, 56, 57, 56, 0, 0, 2, 0,
+ 12, 12, 16, 0, 0, 0, 2, 0,
+ 12, 12, 16, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2, 0, 12, 12, 16,
+ 0, 12, 12, 12, 12, 16, 12, 12,
+ 0, 0, 0, 42, 42, 43, 43, 44,
+ 43, 43, 0, 0, 0, 0, 2, 0,
+ 0, 0, 4, 4, 5, 45, 0, 0,
+ 0, 0, 11, 11, 13, 46, 12, 4,
+ 4, 0, 5, 0, 0, 2, 0, 12,
+ 12, 12, 16, 8, 8, 8, 8, 0,
+ 0, 10, 0, 0, 4, 4, 0, 5,
+ 0, 0, 0, 11, 11, 13, 0, 0,
+ 0, 12, 12, 12, 12, 16, 12, 12,
+ 0, 0, 0, 0, 2, 0, 12, 12,
+ 16, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 8, 8, 9, 8, 0, 0,
+ 10, 0, 0, 12, 12, 12, 12, 16,
+ 30, 30, 31, 0, 4, 4, 5, 0,
+ 0, 11, 11, 13, 47, 25, 8, 8,
+ 8, 8, 0, 0, 10, 0, 0, 0,
+ 0, 0, 30, 30, 31, 0, 0, 2,
+ 24, 0, 12, 12, 16, 25, 43, 43,
+ 43, 43, 48, 43, 0, 0, 0, 2,
+ 0, 0, 0, 2, 0, 0, 0, 12,
+ 12, 16, 12, 0, 0, 2, 0, 12,
+ 12, 16, 12, 12, 12, 12, 16, 30,
+ 30, 0, 31, 0, 0, 2, 0, 12,
+ 12, 16, 8, 8, 8, 8, 0, 0,
+ 10, 0, 0, 11, 11, 13, 0, 0,
+ 0, 0, 0, 10, 0, 4, 4, 5,
+ 49, 50, 0, 0, 11, 11, 13, 51,
+ 52, 12, 12, 53, 53, 16, 12, 53,
+ 12, 26, 26, 26, 26, 27, 26, 28,
+ 29, 0, 0, 1, 1, 2, 1, 3,
+ 0, 30, 30, 0, 0, 31, 32, 0,
+ 32, 7, 23, 4, 4, 0, 0, 5,
+ 33, 0, 33, 24, 0, 0, 4, 4,
+ 5, 0, 0, 8, 8, 9, 8, 0,
+ 0, 10, 0, 0, 11, 11, 12, 12,
+ 13, 12, 15, 4, 4, 5, 0, 0,
+ 2, 0, 12, 12, 16, 17, 18, 18,
+ 1, 1, 19, 20, 1, 20, 0, 0,
+ 2, 0, 0, 0, 21, 21, 0, 0,
+ 22, 0, 21, 23, 0, 0, 2, 0,
+ 0, 24, 0, 12, 12, 16, 12, 12,
+ 25, 0, 0, 0, 2, 0, 0, 0,
+ 2, 0, 0, 12, 12, 16, 12, 0,
+ 2, 34, 34, 0, 12, 16, 35, 35,
+ 0, 43, 43, 43, 43, 48, 43, 43,
+ 0, 0, 0, 0, 2, 0, 0, 0,
+ 0, 0, 2, 0, 54, 0, 0, 12,
+ 12, 16, 12, 55, 0, 0, 2, 0,
+ 12, 12, 16, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2, 0, 12, 12, 16,
+ 0, 12, 12, 12, 12, 16, 12, 12,
+ 0, 0, 0, 8, 8, 9, 8, 0,
+ 0, 10, 0, 0, 12, 12, 12, 16,
+ 0, 0, 0, 0, 0, 0, 21, 21,
+ 22, 0, 0, 2, 0, 12, 12, 16,
+ 0, 21, 21, 0, 22, 0, 0, 2,
+ 0, 12, 12, 16, 8, 8, 8, 8,
+ 0, 0, 10, 0, 0, 0, 0, 0,
+ 8, 8, 8, 9, 8, 0, 0, 10,
+ 0, 0, 21, 21, 22, 37, 0, 0,
+ 2, 39, 0, 12, 12, 16, 41, 0,
+ 0, 10, 0, 0, 0, 2, 50, 0,
+ 12, 12, 16, 52, 12, 12, 53, 53,
+ 16, 12, 53, 12, 0, 2, 0, 12,
+ 16, 43, 43, 43, 43, 48, 43, 43,
+ 0, 0, 0, 0, 2, 0, 0, 0,
+ 0, 0, 2, 54, 0, 54, 0, 0,
+ 12, 12, 16, 55, 12, 55, 0, 0,
+ 2, 0, 0, 12, 12, 16, 12, 56,
+ 56, 56, 56, 57, 56, 0, 0, 2,
+ 0, 12, 12, 16, 0, 0, 0, 2,
+ 0, 12, 12, 16, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2, 0, 12, 12,
+ 16, 0, 12, 12, 12, 12, 16, 12,
+ 12, 0, 0, 0, 11, 11, 13, 47,
+ 12, 47, 25, 4, 4, 0, 0, 5,
+ 0, 0, 2, 0, 4, 4, 5, 0,
+ 0, 0, 11, 11, 13, 12, 42, 42,
+ 43, 43, 44, 43, 43, 0, 0, 0,
+ 0, 2, 0, 0, 0, 4, 4, 5,
+ 45, 0, 45, 0, 0, 0, 11, 11,
+ 13, 46, 12, 46, 4, 4, 0, 5,
+ 0, 0, 2, 0, 12, 12, 12, 16,
+ 8, 8, 8, 8, 0, 0, 10, 0,
+ 0, 4, 4, 0, 5, 0, 0, 0,
+ 11, 11, 13, 0, 0, 0, 12, 12,
+ 12, 12, 16, 12, 12, 0, 0, 0,
+ 0, 2, 0, 12, 12, 16, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 8,
+ 8, 9, 8, 0, 0, 10, 0, 0,
+ 12, 12, 12, 12, 16, 8, 8, 8,
+ 8, 0, 0, 10, 0, 0, 30, 30,
+ 0, 31, 0, 4, 4, 5, 0, 0,
+ 11, 11, 13, 30, 30, 31, 0, 0,
+ 2, 24, 0, 12, 12, 16, 25, 43,
+ 43, 43, 43, 48, 43, 0, 0, 0,
+ 2, 0, 0, 0, 2, 0, 0, 0,
+ 12, 12, 16, 12, 0, 0, 2, 0,
+ 12, 12, 16, 12, 12, 12, 12, 16,
+ 0, 0, 0, 30, 30, 0, 31, 0,
+ 0, 2, 0, 12, 12, 16, 8, 8,
+ 8, 8, 0, 0, 10, 0, 0, 0,
+ 0, 0, 8, 8, 8, 9, 8, 0,
+ 0, 10, 0, 0, 30, 30, 31, 36,
+ 36, 37, 4, 4, 5, 38, 38, 39,
+ 0, 0, 11, 11, 13, 40, 40, 41,
+ 0, 0, 10, 0, 4, 4, 5, 49,
+ 49, 50, 0, 0, 11, 11, 13, 51,
+ 51, 52, 12, 12, 53, 53, 16, 53,
+ 0, 0, 0, 21, 21, 22, 23, 0,
+ 0, 2, 0, 12, 12, 16, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 21, 21, 22, 23, 0, 0, 2, 0,
+ 12, 12, 16, 0, 0, 0, 0, 0,
+ 0, 0, 43, 43, 43, 43, 48, 43,
+ 43, 0, 0, 0, 0, 2, 0, 0,
+ 0, 0, 0, 2, 0, 54, 0, 0,
+ 12, 12, 16, 12, 55, 0, 0, 2,
+ 0, 12, 12, 16, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2, 0, 12, 12,
+ 16, 0, 12, 12, 12, 12, 16, 12,
+ 12, 0, 0, 0, 8, 8, 9, 8,
+ 0, 0, 10, 0, 0, 12, 12, 12,
+ 16, 0, 0, 0, 0, 0, 0, 21,
+ 21, 22, 0, 0, 2, 0, 12, 12,
+ 16, 0, 21, 21, 0, 22, 0, 0,
+ 2, 0, 12, 12, 16, 8, 8, 8,
+ 8, 0, 0, 10, 0, 0, 0, 0,
+ 0, 8, 8, 8, 9, 8, 0, 0,
+ 10, 0, 0, 21, 21, 22, 37, 0,
+ 0, 2, 39, 0, 12, 12, 16, 41,
+ 0, 0, 10, 0, 0, 0, 2, 50,
+ 0, 12, 12, 16, 52, 12, 12, 53,
+ 53, 16, 12, 53, 12, 0, 2, 0,
+ 12, 16, 43, 43, 43, 43, 48, 43,
+ 43, 0, 0, 0, 0, 2, 0, 0,
+ 0, 0, 0, 2, 54, 0, 54, 0,
+ 0, 12, 12, 16, 55, 12, 55, 0,
+ 0, 2, 0, 0, 12, 12, 16, 12,
+ 56, 56, 56, 56, 57, 56, 0, 0,
+ 2, 0, 12, 12, 16, 0, 0, 0,
+ 2, 0, 12, 12, 16, 0, 0, 0,
+ 0, 0, 0, 0, 0, 2, 0, 12,
+ 12, 16, 0, 12, 12, 12, 12, 16,
+ 12, 12, 0, 0, 0, 12, 12, 16,
+ 12, 26, 26, 58, 0, 0, 2, 0,
+ 12, 12, 16, 42, 42, 43, 43, 44,
+ 43, 43, 0, 0, 0, 0, 2, 0,
+ 0, 0, 0, 0, 4, 4, 0, 5,
+ 0, 0, 2, 0, 12, 12, 12, 16,
+ 8, 8, 8, 8, 0, 0, 10, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 12, 12, 12, 12, 16, 12, 12, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 8, 8, 9, 8,
+ 0, 0, 10, 0, 0, 12, 12, 12,
+ 12, 16, 8, 8, 8, 8, 0, 0,
+ 10, 0, 0, 0, 0, 0, 0, 43,
+ 43, 43, 43, 48, 43, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 0, 2,
+ 0, 12, 12, 12, 16, 12, 12, 12,
+ 12, 16, 0, 0, 0, 0, 0, 8,
+ 8, 8, 8, 0, 0, 10, 0, 0,
+ 0, 0, 0, 8, 8, 8, 9, 8,
+ 0, 0, 10, 0, 0, 0, 0, 0,
+ 0, 10, 0, 0, 0, 12, 12, 53,
+ 53, 16, 53, 0, 0, 1, 1, 2,
+ 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 43, 43, 43, 43, 48, 43, 43, 0,
+ 0, 0, 0, 2, 0, 0, 0, 0,
+ 0, 2, 0, 54, 0, 0, 12, 12,
+ 16, 12, 55, 0, 0, 2, 0, 12,
+ 12, 16, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2, 0, 12, 12, 16, 0,
+ 12, 12, 12, 12, 16, 12, 12, 0,
+ 0, 0, 8, 8, 9, 8, 0, 0,
+ 10, 0, 0, 12, 12, 12, 16, 0,
+ 0, 0, 0, 0, 0, 21, 21, 22,
+ 0, 0, 2, 0, 12, 12, 16, 0,
+ 21, 21, 0, 22, 0, 0, 2, 0,
+ 12, 12, 16, 8, 8, 8, 8, 0,
+ 0, 10, 0, 0, 0, 0, 0, 8,
+ 8, 8, 9, 8, 0, 0, 10, 0,
+ 0, 21, 21, 22, 37, 0, 0, 2,
+ 39, 0, 12, 12, 16, 41, 0, 0,
+ 10, 0, 0, 0, 2, 50, 0, 12,
+ 12, 16, 52, 12, 12, 53, 53, 16,
+ 12, 53, 12, 0, 2, 0, 12, 16,
+ 43, 43, 43, 43, 48, 43, 43, 0,
+ 0, 0, 0, 2, 0, 0, 0, 0,
+ 0, 2, 54, 0, 54, 0, 0, 12,
+ 12, 16, 55, 12, 55, 0, 0, 2,
+ 0, 0, 12, 12, 16, 12, 56, 56,
+ 56, 56, 57, 56, 0, 0, 2, 0,
+ 12, 12, 16, 0, 0, 0, 2, 0,
+ 12, 12, 16, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2, 0, 12, 12, 16,
+ 0, 12, 12, 12, 12, 16, 12, 12,
+ 0, 0, 0, 4, 4, 0, 0, 5,
+ 0, 0, 2, 0, 0, 0, 42, 42,
+ 44, 0, 0, 2, 0, 0, 12, 12,
+ 16, 12, 0, 0, 0, 0, 0, 0,
+ 0, 0, 8, 8, 9, 8, 0, 0,
+ 10, 0, 0, 12, 12, 12, 12, 16,
+ 8, 8, 8, 8, 0, 0, 10, 0,
+ 0, 0, 0, 0, 0, 43, 43, 43,
+ 43, 48, 43, 0, 0, 0, 2, 0,
+ 12, 12, 12, 12, 16, 0, 0, 0,
+ 0, 0, 8, 8, 8, 8, 0, 0,
+ 10, 0, 0, 0, 0, 0, 8, 8,
+ 8, 9, 8, 0, 0, 10, 0, 0,
+ 0, 0, 0, 0, 10, 0, 0, 0,
+ 12, 12, 53, 53, 16, 53, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 59,
+ 59, 60, 61, 59, 0, 0, 2, 62,
+ 0, 0, 63, 63, 63, 63, 64, 63,
+ 28, 65, 30, 30, 0, 31, 32, 0,
+ 23, 4, 4, 5, 33, 0, 24, 34,
+ 34, 2, 34, 35, 35, 16, 35, 63,
+ 63, 63, 63, 64, 63, 30, 30, 0,
+ 31, 0, 23, 4, 4, 5, 0, 24,
+ 11, 11, 13, 47, 12, 25, 4, 4,
+ 5, 0, 11, 11, 13, 12, 26, 26,
+ 27, 0, 2, 12, 12, 16, 12, 0,
+ 2, 12, 16, 4, 4, 5, 45, 0,
+ 0, 11, 11, 13, 46, 12, 4, 4,
+ 5, 11, 11, 13, 45, 45, 2, 46,
+ 46, 16, 30, 30, 31, 0, 4, 4,
+ 5, 11, 11, 13, 30, 30, 31, 33,
+ 33, 2, 24, 47, 47, 16, 25, 45,
+ 45, 2, 0, 46, 46, 16, 30, 30,
+ 0, 31, 33, 33, 2, 47, 47, 16,
+ 30, 30, 31, 36, 37, 4, 4, 5,
+ 38, 39, 11, 11, 13, 40, 41, 4,
+ 4, 5, 49, 50, 11, 11, 13, 51,
+ 52, 32, 32, 22, 23, 33, 33, 2,
+ 47, 47, 16, 11, 11, 13, 12, 25,
+ 4, 4, 5, 0, 11, 11, 13, 12,
+ 0, 30, 30, 31, 0, 4, 4, 5,
+ 11, 11, 13, 30, 30, 31, 33, 33,
+ 2, 24, 47, 47, 16, 25, 0, 0,
+ 30, 30, 0, 31, 33, 33, 2, 47,
+ 47, 16, 30, 30, 31, 37, 4, 4,
+ 5, 39, 11, 11, 13, 41, 4, 4,
+ 5, 50, 11, 11, 13, 52, 32, 32,
+ 22, 23, 33, 33, 2, 47, 47, 16
+]
+
+class << self
+ attr_accessor :_address_lists_eof_actions
+ private :_address_lists_eof_actions, :_address_lists_eof_actions=
+end
+self._address_lists_eof_actions = [
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 32,
+ 33, 34, 35, 0, 32, 33, 47, 34,
+ 34, 35, 0, 0, 12, 0, 12, 45,
+ 45, 46, 45, 45, 45, 46, 45, 45,
+ 46, 32, 33, 47, 32, 33, 47, 45,
+ 45, 46, 45, 32, 33, 47, 32, 36,
+ 38, 40, 49, 51, 32, 33, 47, 47,
+ 34, 34, 35, 45, 32, 33, 47, 32,
+ 33, 47, 45, 32, 33, 47, 32, 36,
+ 38, 40, 49, 51, 32, 33, 47, 0
+]
+
+class << self
+ attr_accessor :address_lists_start
+end
+self.address_lists_start = 1334;
+class << self
+ attr_accessor :address_lists_first_final
+end
+self.address_lists_first_final = 1334;
+class << self
+ attr_accessor :address_lists_error
+end
+self.address_lists_error = 0;
+
+class << self
+ attr_accessor :address_lists_en_comment_tail
+end
+self.address_lists_en_comment_tail = 1329;
+class << self
+ attr_accessor :address_lists_en_main
+end
+self.address_lists_en_main = 1334;
+
+
+# line 17 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb.rl"
+
+ def self.parse(data)
+ p = 0
+ eof = data.length
+ stack = []
+
+ actions = []
+ data_unpacked = data.bytes.to_a
+
+# line 14059 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb"
+begin
+ p ||= 0
+ pe ||= data.length
+ cs = address_lists_start
+ top = 0
+end
+
+# line 26 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb.rl"
+
+# line 14069 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb"
+begin
+ testEof = false
+ _slen, _trans, _keys, _inds, _acts, _nacts = nil
+ _goto_level = 0
+ _resume = 10
+ _eof_trans = 15
+ _again = 20
+ _test_eof = 30
+ _out = 40
+ while true
+ if _goto_level <= 0
+ if p == pe
+ _goto_level = _test_eof
+ next
+ end
+ if cs == 0
+ _goto_level = _out
+ next
+ end
+ end
+ if _goto_level <= _resume
+ _keys = cs << 1
+ _inds = _address_lists_index_offsets[cs]
+ _slen = _address_lists_key_spans[cs]
+ _trans = if ( _slen > 0 &&
+ _address_lists_trans_keys[_keys] <= ( data_unpacked[p]) &&
+ ( data_unpacked[p]) <= _address_lists_trans_keys[_keys + 1]
+ ) then
+ _address_lists_indicies[ _inds + ( data_unpacked[p]) - _address_lists_trans_keys[_keys] ]
+ else
+ _address_lists_indicies[ _inds + _slen ]
+ end
+ cs = _address_lists_trans_targs[_trans]
+ if _address_lists_trans_actions[_trans] != 0
+ case _address_lists_trans_actions[_trans]
+ when 34 then
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 3 then
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(3, p) end
+ when 12 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+ when 59 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+ when 54 then
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+ when 43 then
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 24 then
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+ when 21 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+ when 1 then
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+ when 50 then
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+ when 20 then
+# line 34 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(31, p) end
+ when 4 then
+# line 39 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(36, p) end
+ when 10 then
+# line 41 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(38, p) end
+ when 8 then
+# line 42 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(39, p) end
+ when 2 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 1329
+ _goto_level = _again
+ next
+ end
+ end
+ when 62 then
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ top -= 1
+ cs = stack[top]
+ _goto_level = _again
+ next
+ end
+ end
+ when 28 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(2, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(3, p) end
+ when 29 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(2, p) end
+# line 40 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(37, p) end
+ when 35 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 17 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(3, p) end
+ when 55 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+ when 25 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+ when 53 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+ when 52 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+ when 11 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 39 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(36, p) end
+ when 16 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 1329
+ _goto_level = _again
+ next
+ end
+ end
+ when 60 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 1329
+ _goto_level = _again
+ next
+ end
+ end
+ when 61 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ top -= 1
+ cs = stack[top]
+ _goto_level = _again
+ next
+ end
+ end
+ when 45 then
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 48 then
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 1329
+ _goto_level = _again
+ next
+ end
+ end
+ when 33 then
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 39 then
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+ when 23 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+ when 22 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 1329
+ _goto_level = _again
+ next
+ end
+ end
+ when 18 then
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 34 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(31, p) end
+ when 49 then
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 56 then
+# line 33 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(30, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+ when 7 then
+# line 39 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(36, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(3, p) end
+ when 42 then
+# line 39 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(36, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 6 then
+# line 39 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(36, p) end
+# line 19 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(16, p) end
+ when 30 then
+# line 39 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(36, p) end
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+ when 9 then
+# line 42 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(39, p) end
+# line 41 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(38, p) end
+ when 5 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 1329
+ _goto_level = _again
+ next
+ end
+ end
+# line 39 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(36, p) end
+ when 26 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(2, p) end
+# line 40 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(37, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+ when 46 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 47 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 41 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+ when 51 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 15 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 39 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(36, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(3, p) end
+ when 14 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 39 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(36, p) end
+# line 19 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(16, p) end
+ when 13 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 1329
+ _goto_level = _again
+ next
+ end
+ end
+# line 39 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(36, p) end
+ when 65 then
+# line 20 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(17, p) end
+# line 40 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(37, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(2, p) end
+ when 38 then
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 32 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 37 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+ when 19 then
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 1329
+ _goto_level = _again
+ next
+ end
+ end
+# line 34 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(31, p) end
+ when 57 then
+# line 33 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(30, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 1329
+ _goto_level = _again
+ next
+ end
+ end
+ when 44 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 1329
+ _goto_level = _again
+ next
+ end
+ end
+# line 39 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(36, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 31 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 1329
+ _goto_level = _again
+ next
+ end
+ end
+# line 39 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(36, p) end
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+ when 27 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(2, p) end
+# line 40 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(37, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 1329
+ _goto_level = _again
+ next
+ end
+ end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+ when 40 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 63 then
+# line 20 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(17, p) end
+# line 40 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(37, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(2, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+ when 36 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 58 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 1329
+ _goto_level = _again
+ next
+ end
+ end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(2, p) end
+# line 40 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(37, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+ when 64 then
+# line 20 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(17, p) end
+# line 40 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(37, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 1329
+ _goto_level = _again
+ next
+ end
+ end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(2, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 14709 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb"
+ end
+ end
+ end
+ if _goto_level <= _again
+ if cs == 0
+ _goto_level = _out
+ next
+ end
+ p += 1
+ if p != pe
+ _goto_level = _resume
+ next
+ end
+ end
+ if _goto_level <= _test_eof
+ if p == eof
+ case _address_lists_eof_actions[cs]
+ when 34 then
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 12 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+ when 35 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 45 then
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 33 then
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 49 then
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 46 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 47 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 51 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 38 then
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 32 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 40 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 36 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+# line 14839 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb"
+ end
+ end
+
+ end
+ if _goto_level <= _out
+ break
+ end
+end
+ end
+
+# line 27 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb.rl"
+
+ if p == eof && cs >=
+# line 14853 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb"
+1334
+# line 28 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb.rl"
+
+ return actions, nil
+ else
+ return [], "Only able to parse up to #{data[0..p]}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb.rl b/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb.rl
new file mode 100644
index 0000000..de958a8
--- /dev/null
+++ b/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb.rl
@@ -0,0 +1,37 @@
+%%{
+ machine address_lists;
+
+ include rb_actions "rb_actions.rl";
+ include common "../../common.rl";
+
+ getkey data_unpacked[p];
+
+ main := address_lists;
+}%%
+
+module Mail
+ module Parsers
+ module Ragel
+ module AddressListsMachine
+ %%write data;
+
+ def self.parse(data)
+ p = 0
+ eof = data.length
+ stack = []
+
+ actions = []
+ data_unpacked = data.bytes.to_a
+ %%write init;
+ %%write exec;
+
+ if p == eof && cs >= %%{ write first_final; }%%
+ return actions, nil
+ else
+ return [], "Only able to parse up to #{data[0..p]}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb b/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb
new file mode 100644
index 0000000..001763f
--- /dev/null
+++ b/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb
@@ -0,0 +1,751 @@
+
+# line 1 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb.rl"
+
+# line 10 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb.rl"
+
+
+module Mail
+ module Parsers
+ module Ragel
+ module ContentDispositionMachine
+
+# line 13 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb"
+class << self
+ attr_accessor :_content_disposition_trans_keys
+ private :_content_disposition_trans_keys, :_content_disposition_trans_keys=
+end
+self._content_disposition_trans_keys = [
+ 0, 0, 9, 59, 10, 10,
+ 9, 32, 9, 59, 9,
+ 126, 10, 10, 9, 32,
+ 33, 126, 9, 126, 9, 40,
+ 10, 10, 9, 32, 1,
+ 127, 1, 127, 10, 10,
+ 9, 32, 10, 10, 9, 32,
+ 0, 127, 9, 40, 10,
+ 10, 9, 32, 9, 126,
+ 1, 127, 1, 127, 10, 10,
+ 9, 32, 0, 127, 9,
+ 126, 9, 59, 9, 59,
+ 9, 126, 9, 59, 9, 59,
+ 9, 126, 0, 0, 0
+]
+
+class << self
+ attr_accessor :_content_disposition_key_spans
+ private :_content_disposition_key_spans, :_content_disposition_key_spans=
+end
+self._content_disposition_key_spans = [
+ 0, 51, 1, 24, 51, 118, 1, 24,
+ 94, 118, 32, 1, 24, 127, 127, 1,
+ 24, 1, 24, 128, 32, 1, 24, 118,
+ 127, 127, 1, 24, 128, 118, 51, 51,
+ 118, 51, 51, 118, 0
+]
+
+class << self
+ attr_accessor :_content_disposition_index_offsets
+ private :_content_disposition_index_offsets, :_content_disposition_index_offsets=
+end
+self._content_disposition_index_offsets = [
+ 0, 0, 52, 54, 79, 131, 250, 252,
+ 277, 372, 491, 524, 526, 551, 679, 807,
+ 809, 834, 836, 861, 990, 1023, 1025, 1050,
+ 1169, 1297, 1425, 1427, 1452, 1581, 1700, 1752,
+ 1804, 1923, 1975, 2027, 2146
+]
+
+class << self
+ attr_accessor :_content_disposition_indicies
+ private :_content_disposition_indicies, :_content_disposition_indicies=
+end
+self._content_disposition_indicies = [
+ 0, 1, 1, 1, 2, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 0,
+ 1, 1, 1, 1, 1, 1, 1, 3,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 4, 1, 5, 1, 0, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 0, 1, 6,
+ 1, 1, 1, 7, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 6, 1,
+ 1, 1, 1, 1, 1, 1, 8, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 9, 1, 4, 1, 1, 1, 10,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 4, 11, 11, 11, 11, 11,
+ 11, 11, 12, 1, 11, 11, 11, 11,
+ 11, 1, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 1, 1, 1, 1,
+ 1, 1, 1, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 1, 1, 1,
+ 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 1, 13, 1, 4, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 4, 1, 14, 14, 14,
+ 14, 14, 14, 14, 1, 1, 14, 14,
+ 14, 14, 14, 1, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 1, 1,
+ 1, 15, 1, 1, 1, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 1,
+ 1, 1, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 1, 16, 1, 1, 1,
+ 17, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 16, 18, 19, 18, 18,
+ 18, 18, 18, 20, 1, 18, 18, 18,
+ 18, 18, 1, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 1, 1, 1,
+ 18, 1, 1, 1, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 1, 1,
+ 1, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 1, 21, 1, 1, 1, 22,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 21, 1, 23, 1, 1, 1,
+ 1, 1, 24, 1, 25, 1, 21, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 21, 1, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 1, 26, 26, 27, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 28, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 29, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 1, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 1, 30, 30, 31, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 32, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 33, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 1, 34,
+ 1, 30, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 30, 1, 35, 1, 36, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 36, 1, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 1, 37, 1,
+ 1, 1, 38, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 37, 1, 39,
+ 1, 1, 1, 1, 1, 40, 1, 41,
+ 1, 42, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 42, 1, 9, 1, 1, 1, 43, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 9, 44, 44, 44, 44, 44, 44,
+ 44, 45, 1, 44, 44, 44, 44, 44,
+ 1, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 1, 1, 1, 1, 1,
+ 1, 1, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 1, 1, 1, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44,
+ 1, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 1, 46, 46, 47, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 48, 49, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 50, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 46, 46, 46, 46,
+ 1, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 1, 51, 51, 52, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 53, 54, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 55, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 1, 56, 1, 51, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 51, 1, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 1, 57, 1, 1,
+ 1, 58, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 57, 59, 59, 59,
+ 59, 59, 59, 59, 60, 1, 59, 59,
+ 59, 59, 59, 1, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 1, 61,
+ 1, 1, 1, 1, 1, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 1,
+ 1, 1, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 59, 59, 59, 59, 59,
+ 59, 59, 59, 1, 62, 1, 1, 1,
+ 63, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 62, 1, 1, 1, 1,
+ 1, 1, 1, 64, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 65, 1,
+ 66, 1, 1, 1, 67, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 66,
+ 1, 1, 1, 1, 1, 1, 1, 68,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 69, 1, 70, 1, 1, 1,
+ 71, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 70, 72, 1, 72, 72,
+ 72, 72, 72, 73, 1, 72, 72, 72,
+ 72, 72, 1, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 1, 65, 1,
+ 72, 1, 1, 1, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 1, 1,
+ 1, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 1, 42, 1, 1, 1, 74,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 42, 1, 1, 1, 1, 1,
+ 1, 1, 75, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 4, 1, 76,
+ 1, 1, 1, 77, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 76, 1,
+ 1, 1, 1, 1, 1, 1, 78, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 9, 1, 79, 1, 1, 1, 80,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 79, 81, 81, 81, 81, 81,
+ 81, 81, 82, 1, 81, 81, 81, 81,
+ 81, 1, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 1, 83, 1, 1,
+ 1, 1, 1, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 1, 1, 1,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 1, 1, 0
+]
+
+class << self
+ attr_accessor :_content_disposition_trans_targs
+ private :_content_disposition_trans_targs, :_content_disposition_trans_targs=
+end
+self._content_disposition_trans_targs = [
+ 1, 0, 2, 4, 5, 3, 1, 2,
+ 4, 5, 6, 8, 23, 7, 8, 9,
+ 10, 11, 32, 13, 20, 10, 11, 13,
+ 20, 12, 14, 15, 30, 19, 14, 15,
+ 30, 19, 16, 18, 30, 10, 11, 13,
+ 20, 22, 33, 6, 8, 23, 25, 26,
+ 25, 36, 28, 25, 26, 25, 36, 28,
+ 27, 1, 2, 35, 4, 5, 30, 17,
+ 31, 5, 30, 17, 31, 5, 33, 21,
+ 32, 34, 21, 34, 33, 21, 34, 1,
+ 2, 35, 4, 5
+]
+
+class << self
+ attr_accessor :_content_disposition_trans_actions
+ private :_content_disposition_trans_actions, :_content_disposition_trans_actions=
+end
+self._content_disposition_trans_actions = [
+ 0, 0, 0, 1, 0, 0, 2, 2,
+ 3, 2, 0, 4, 1, 0, 0, 5,
+ 6, 6, 6, 6, 7, 0, 0, 0,
+ 1, 0, 8, 8, 9, 8, 0, 0,
+ 10, 0, 0, 0, 0, 2, 2, 2,
+ 3, 0, 0, 2, 11, 3, 12, 12,
+ 13, 14, 12, 0, 0, 1, 15, 0,
+ 0, 16, 16, 17, 18, 16, 19, 19,
+ 20, 19, 21, 21, 22, 21, 19, 19,
+ 0, 23, 0, 1, 2, 2, 3, 24,
+ 24, 0, 25, 24
+]
+
+class << self
+ attr_accessor :_content_disposition_eof_actions
+ private :_content_disposition_eof_actions, :_content_disposition_eof_actions=
+end
+self._content_disposition_eof_actions = [
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 16, 19, 21,
+ 19, 0, 2, 24, 0
+]
+
+class << self
+ attr_accessor :content_disposition_start
+end
+self.content_disposition_start = 29;
+class << self
+ attr_accessor :content_disposition_first_final
+end
+self.content_disposition_first_final = 29;
+class << self
+ attr_accessor :content_disposition_error
+end
+self.content_disposition_error = 0;
+
+class << self
+ attr_accessor :content_disposition_en_comment_tail
+end
+self.content_disposition_en_comment_tail = 24;
+class << self
+ attr_accessor :content_disposition_en_main
+end
+self.content_disposition_en_main = 29;
+
+
+# line 17 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb.rl"
+
+ def self.parse(data)
+ p = 0
+ eof = data.length
+ stack = []
+
+ actions = []
+ data_unpacked = data.bytes.to_a
+
+# line 416 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb"
+begin
+ p ||= 0
+ pe ||= data.length
+ cs = content_disposition_start
+ top = 0
+end
+
+# line 26 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb.rl"
+
+# line 426 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb"
+begin
+ testEof = false
+ _slen, _trans, _keys, _inds, _acts, _nacts = nil
+ _goto_level = 0
+ _resume = 10
+ _eof_trans = 15
+ _again = 20
+ _test_eof = 30
+ _out = 40
+ while true
+ if _goto_level <= 0
+ if p == pe
+ _goto_level = _test_eof
+ next
+ end
+ if cs == 0
+ _goto_level = _out
+ next
+ end
+ end
+ if _goto_level <= _resume
+ _keys = cs << 1
+ _inds = _content_disposition_index_offsets[cs]
+ _slen = _content_disposition_key_spans[cs]
+ _trans = if ( _slen > 0 &&
+ _content_disposition_trans_keys[_keys] <= ( data_unpacked[p]) &&
+ ( data_unpacked[p]) <= _content_disposition_trans_keys[_keys + 1]
+ ) then
+ _content_disposition_indicies[ _inds + ( data_unpacked[p]) - _content_disposition_trans_keys[_keys] ]
+ else
+ _content_disposition_indicies[ _inds + _slen ]
+ end
+ cs = _content_disposition_trans_targs[_trans]
+ if _content_disposition_trans_actions[_trans] != 0
+ case _content_disposition_trans_actions[_trans]
+ when 2 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+ when 12 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+ when 24 then
+# line 13 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(10, p) end
+ when 17 then
+# line 14 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(11, p) end
+ when 5 then
+# line 35 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(32, p) end
+ when 4 then
+# line 36 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(33, p) end
+ when 19 then
+# line 37 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(34, p) end
+ when 6 then
+# line 38 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(35, p) end
+ when 10 then
+# line 41 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(38, p) end
+ when 8 then
+# line 42 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(39, p) end
+ when 1 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 24
+ _goto_level = _again
+ next
+ end
+ end
+ when 15 then
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ top -= 1
+ cs = stack[top]
+ _goto_level = _again
+ next
+ end
+ end
+ when 11 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 36 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(33, p) end
+ when 21 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 37 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(34, p) end
+ when 3 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 24
+ _goto_level = _again
+ next
+ end
+ end
+ when 13 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 24
+ _goto_level = _again
+ next
+ end
+ end
+ when 14 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ top -= 1
+ cs = stack[top]
+ _goto_level = _again
+ next
+ end
+ end
+ when 25 then
+# line 13 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(10, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 24
+ _goto_level = _again
+ next
+ end
+ end
+ when 16 then
+# line 14 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(11, p) end
+# line 13 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(10, p) end
+ when 23 then
+# line 37 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(34, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 24
+ _goto_level = _again
+ next
+ end
+ end
+ when 7 then
+# line 38 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(35, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 24
+ _goto_level = _again
+ next
+ end
+ end
+ when 9 then
+# line 42 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(39, p) end
+# line 41 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(38, p) end
+ when 20 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 24
+ _goto_level = _again
+ next
+ end
+ end
+# line 37 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(34, p) end
+ when 22 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 24
+ _goto_level = _again
+ next
+ end
+ end
+# line 37 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(34, p) end
+ when 18 then
+# line 14 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(11, p) end
+# line 13 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(10, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 24
+ _goto_level = _again
+ next
+ end
+ end
+# line 682 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb"
+ end
+ end
+ end
+ if _goto_level <= _again
+ if cs == 0
+ _goto_level = _out
+ next
+ end
+ p += 1
+ if p != pe
+ _goto_level = _resume
+ next
+ end
+ end
+ if _goto_level <= _test_eof
+ if p == eof
+ case _content_disposition_eof_actions[cs]
+ when 2 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+ when 24 then
+# line 13 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(10, p) end
+ when 19 then
+# line 37 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(34, p) end
+ when 21 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 37 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(34, p) end
+ when 16 then
+# line 14 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(11, p) end
+# line 13 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(10, p) end
+# line 726 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb"
+ end
+ end
+
+ end
+ if _goto_level <= _out
+ break
+ end
+end
+ end
+
+# line 27 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb.rl"
+
+ if p == eof && cs >=
+# line 740 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb"
+29
+# line 28 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb.rl"
+
+ return actions, nil
+ else
+ return [], "Only able to parse up to #{data[0..p]}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb.rl b/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb.rl
new file mode 100644
index 0000000..c04f12c
--- /dev/null
+++ b/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb.rl
@@ -0,0 +1,37 @@
+%%{
+ machine content_disposition;
+
+ include rb_actions "rb_actions.rl";
+ include common "../../common.rl";
+
+ getkey data_unpacked[p];
+
+ main := content_disposition;
+}%%
+
+module Mail
+ module Parsers
+ module Ragel
+ module ContentDispositionMachine
+ %%write data;
+
+ def self.parse(data)
+ p = 0
+ eof = data.length
+ stack = []
+
+ actions = []
+ data_unpacked = data.bytes.to_a
+ %%write init;
+ %%write exec;
+
+ if p == eof && cs >= %%{ write first_final; }%%
+ return actions, nil
+ else
+ return [], "Only able to parse up to #{data[0..p]}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb b/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb
new file mode 100644
index 0000000..d919fa8
--- /dev/null
+++ b/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb
@@ -0,0 +1,614 @@
+
+# line 1 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb.rl"
+
+# line 10 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb.rl"
+
+
+module Mail
+ module Parsers
+ module Ragel
+ module ContentLocationMachine
+
+# line 13 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb"
+class << self
+ attr_accessor :_content_location_trans_keys
+ private :_content_location_trans_keys, :_content_location_trans_keys=
+end
+self._content_location_trans_keys = [
+ 0, 0, 9, 126, 10, 10,
+ 9, 32, 10, 10, 9,
+ 32, 1, 127, 10, 10,
+ 9, 32, -128, -1, 10, 10,
+ 9, 32, 9, 126, 1,
+ 127, 1, 127, 10, 10,
+ 9, 32, 0, 127, 9, 126,
+ 9, 40, 9, 40, 1,
+ 127, 1, 127, 1, 127,
+ 1, 127, 9, 126, 0, 0,
+ 0
+]
+
+class << self
+ attr_accessor :_content_location_key_spans
+ private :_content_location_key_spans, :_content_location_key_spans=
+end
+self._content_location_key_spans = [
+ 0, 118, 1, 24, 1, 24, 127, 1,
+ 24, 128, 1, 24, 118, 127, 127, 1,
+ 24, 128, 118, 32, 32, 127, 127, 127,
+ 127, 118, 0
+]
+
+class << self
+ attr_accessor :_content_location_index_offsets
+ private :_content_location_index_offsets, :_content_location_index_offsets=
+end
+self._content_location_index_offsets = [
+ 0, 0, 119, 121, 146, 148, 173, 301,
+ 303, 328, 457, 459, 484, 603, 731, 859,
+ 861, 886, 1015, 1134, 1167, 1200, 1328, 1456,
+ 1584, 1712, 1831
+]
+
+class << self
+ attr_accessor :_content_location_indicies
+ private :_content_location_indicies, :_content_location_indicies=
+end
+self._content_location_indicies = [
+ 0, 1, 1, 1, 2, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 0,
+ 3, 4, 3, 3, 3, 3, 3, 5,
+ 1, 3, 3, 3, 3, 3, 1, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 1, 1, 1, 3, 1, 1, 1,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 1, 1, 1, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 1, 6,
+ 1, 0, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 1, 7, 1, 8, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 8, 1, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 1, 9,
+ 9, 10, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 11, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 12, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 1, 13, 1, 9,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 9, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 9, 14, 1, 15, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 15, 1, 16, 1, 1, 1,
+ 17, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 16, 18, 19, 18, 18,
+ 18, 18, 18, 20, 1, 18, 18, 18,
+ 18, 18, 1, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 1, 1, 1,
+ 18, 1, 1, 1, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 1, 1,
+ 1, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 1, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 1, 21, 21, 22,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 23, 24, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 25, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 1, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 1, 26, 26, 27,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 28, 29, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 30, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 1, 31, 1, 26, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 26, 1, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 1, 32,
+ 1, 1, 1, 33, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 32, 34,
+ 34, 34, 34, 34, 34, 34, 35, 1,
+ 34, 34, 34, 34, 34, 1, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 1, 1, 1, 34, 1, 1, 1, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 1, 1, 1, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 1, 8, 1,
+ 1, 1, 36, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 8, 1, 1,
+ 1, 1, 1, 1, 1, 37, 1, 38,
+ 1, 1, 1, 39, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 38, 1,
+ 1, 1, 1, 1, 1, 1, 40, 1,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 42, 1, 41, 41, 43, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 42,
+ 44, 45, 44, 44, 44, 44, 44, 46,
+ 41, 44, 44, 44, 44, 44, 41, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 41, 41, 41, 44, 41, 41, 41,
+ 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 41, 47, 41, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 44, 44,
+ 44, 44, 44, 44, 44, 44, 41, 1,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 15, 1, 9, 9, 48, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 15,
+ 9, 11, 9, 9, 9, 9, 9, 49,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 12, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 1,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 50, 1, 9, 9, 51, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 50,
+ 9, 11, 9, 9, 9, 9, 9, 52,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 12, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 1,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 53, 1, 9, 9, 54, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 53,
+ 55, 56, 55, 55, 55, 55, 55, 57,
+ 9, 55, 55, 55, 55, 55, 9, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 9, 9, 9, 55, 9, 9, 9,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 9, 12, 9, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 9, 1,
+ 32, 1, 1, 1, 33, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 32,
+ 34, 34, 34, 34, 34, 34, 34, 58,
+ 1, 34, 34, 34, 34, 34, 1, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 1, 1, 1, 34, 1, 1, 1,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 1, 1, 1, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 1, 1,
+ 0
+]
+
+class << self
+ attr_accessor :_content_location_trans_targs
+ private :_content_location_trans_targs, :_content_location_trans_targs=
+end
+self._content_location_trans_targs = [
+ 1, 0, 2, 18, 21, 12, 3, 5,
+ 19, 6, 7, 19, 9, 8, 11, 22,
+ 1, 2, 18, 21, 12, 14, 15, 14,
+ 26, 17, 14, 15, 14, 26, 17, 16,
+ 19, 4, 18, 20, 4, 20, 19, 4,
+ 20, 6, 22, 10, 24, 25, 23, 9,
+ 10, 23, 22, 10, 23, 22, 10, 24,
+ 25, 23, 20
+]
+
+class << self
+ attr_accessor :_content_location_trans_actions
+ private :_content_location_trans_actions, :_content_location_trans_actions=
+end
+self._content_location_trans_actions = [
+ 0, 0, 0, 1, 1, 2, 0, 0,
+ 0, 0, 0, 3, 0, 0, 0, 0,
+ 4, 4, 5, 5, 6, 7, 7, 8,
+ 9, 7, 0, 0, 2, 10, 0, 0,
+ 11, 11, 0, 12, 0, 2, 4, 4,
+ 6, 13, 14, 14, 13, 15, 16, 13,
+ 0, 2, 4, 4, 6, 11, 11, 0,
+ 3, 12, 17
+]
+
+class << self
+ attr_accessor :_content_location_eof_actions
+ private :_content_location_eof_actions, :_content_location_eof_actions=
+end
+self._content_location_eof_actions = [
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 11, 0, 4, 11, 0, 4,
+ 11, 11, 0
+]
+
+class << self
+ attr_accessor :content_location_start
+end
+self.content_location_start = 1;
+class << self
+ attr_accessor :content_location_first_final
+end
+self.content_location_first_final = 18;
+class << self
+ attr_accessor :content_location_error
+end
+self.content_location_error = 0;
+
+class << self
+ attr_accessor :content_location_en_comment_tail
+end
+self.content_location_en_comment_tail = 13;
+class << self
+ attr_accessor :content_location_en_main
+end
+self.content_location_en_main = 1;
+
+
+# line 17 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb.rl"
+
+ def self.parse(data)
+ p = 0
+ eof = data.length
+ stack = []
+
+ actions = []
+ data_unpacked = data.bytes.to_a
+
+# line 365 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb"
+begin
+ p ||= 0
+ pe ||= data.length
+ cs = content_location_start
+ top = 0
+end
+
+# line 26 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb.rl"
+
+# line 375 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb"
+begin
+ testEof = false
+ _slen, _trans, _keys, _inds, _acts, _nacts = nil
+ _goto_level = 0
+ _resume = 10
+ _eof_trans = 15
+ _again = 20
+ _test_eof = 30
+ _out = 40
+ while true
+ if _goto_level <= 0
+ if p == pe
+ _goto_level = _test_eof
+ next
+ end
+ if cs == 0
+ _goto_level = _out
+ next
+ end
+ end
+ if _goto_level <= _resume
+ _keys = cs << 1
+ _inds = _content_location_index_offsets[cs]
+ _slen = _content_location_key_spans[cs]
+ _trans = if ( _slen > 0 &&
+ _content_location_trans_keys[_keys] <= ( data_unpacked[p]) &&
+ ( data_unpacked[p]) <= _content_location_trans_keys[_keys + 1]
+ ) then
+ _content_location_indicies[ _inds + ( data_unpacked[p]) - _content_location_trans_keys[_keys] ]
+ else
+ _content_location_indicies[ _inds + _slen ]
+ end
+ cs = _content_location_trans_targs[_trans]
+ if _content_location_trans_actions[_trans] != 0
+ case _content_location_trans_actions[_trans]
+ when 4 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+ when 7 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+ when 3 then
+# line 41 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(38, p) end
+ when 13 then
+# line 42 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(39, p) end
+ when 11 then
+# line 49 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(46, p) end
+ when 1 then
+# line 50 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(47, p) end
+ when 2 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 13
+ _goto_level = _again
+ next
+ end
+ end
+ when 10 then
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ top -= 1
+ cs = stack[top]
+ _goto_level = _again
+ next
+ end
+ end
+ when 5 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 50 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(47, p) end
+ when 6 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 13
+ _goto_level = _again
+ next
+ end
+ end
+ when 8 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 13
+ _goto_level = _again
+ next
+ end
+ end
+ when 9 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ top -= 1
+ cs = stack[top]
+ _goto_level = _again
+ next
+ end
+ end
+ when 15 then
+# line 42 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(39, p) end
+# line 41 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(38, p) end
+ when 14 then
+# line 42 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(39, p) end
+# line 49 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(46, p) end
+ when 12 then
+# line 49 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(46, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 13
+ _goto_level = _again
+ next
+ end
+ end
+ when 17 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 13
+ _goto_level = _again
+ next
+ end
+ end
+# line 49 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(46, p) end
+ when 16 then
+# line 42 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(39, p) end
+# line 49 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(46, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 13
+ _goto_level = _again
+ next
+ end
+ end
+# line 563 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb"
+ end
+ end
+ end
+ if _goto_level <= _again
+ if cs == 0
+ _goto_level = _out
+ next
+ end
+ p += 1
+ if p != pe
+ _goto_level = _resume
+ next
+ end
+ end
+ if _goto_level <= _test_eof
+ if p == eof
+ case _content_location_eof_actions[cs]
+ when 4 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+ when 11 then
+# line 49 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(46, p) end
+# line 589 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb"
+ end
+ end
+
+ end
+ if _goto_level <= _out
+ break
+ end
+end
+ end
+
+# line 27 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb.rl"
+
+ if p == eof && cs >=
+# line 603 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb"
+18
+# line 28 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb.rl"
+
+ return actions, nil
+ else
+ return [], "Only able to parse up to #{data[0..p]}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb.rl b/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb.rl
new file mode 100644
index 0000000..9069285
--- /dev/null
+++ b/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb.rl
@@ -0,0 +1,37 @@
+%%{
+ machine content_location;
+
+ include rb_actions "rb_actions.rl";
+ include common "../../common.rl";
+
+ getkey data_unpacked[p];
+
+ main := content_location;
+}%%
+
+module Mail
+ module Parsers
+ module Ragel
+ module ContentLocationMachine
+ %%write data;
+
+ def self.parse(data)
+ p = 0
+ eof = data.length
+ stack = []
+
+ actions = []
+ data_unpacked = data.bytes.to_a
+ %%write init;
+ %%write exec;
+
+ if p == eof && cs >= %%{ write first_final; }%%
+ return actions, nil
+ else
+ return [], "Only able to parse up to #{data[0..p]}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb b/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb
new file mode 100644
index 0000000..bcb1c12
--- /dev/null
+++ b/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb
@@ -0,0 +1,447 @@
+
+# line 1 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb.rl"
+
+# line 10 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb.rl"
+
+
+module Mail
+ module Parsers
+ module Ragel
+ module ContentTransferEncodingMachine
+
+# line 13 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb"
+class << self
+ attr_accessor :_content_transfer_encoding_trans_keys
+ private :_content_transfer_encoding_trans_keys, :_content_transfer_encoding_trans_keys=
+end
+self._content_transfer_encoding_trans_keys = [
+ 0, 0, 9, 126, 10, 10,
+ 9, 32, 10, 10, 9,
+ 32, 10, 10, 9, 32,
+ 9, 126, 1, 127, 1, 127,
+ 10, 10, 9, 32, -128,
+ -1, 9, 126, 9, 59,
+ 9, 59, 9, 40, 9, 40,
+ 0, 0, 0
+]
+
+class << self
+ attr_accessor :_content_transfer_encoding_key_spans
+ private :_content_transfer_encoding_key_spans, :_content_transfer_encoding_key_spans=
+end
+self._content_transfer_encoding_key_spans = [
+ 0, 118, 1, 24, 1, 24, 1, 24,
+ 118, 127, 127, 1, 24, 128, 118, 51,
+ 51, 32, 32, 0
+]
+
+class << self
+ attr_accessor :_content_transfer_encoding_index_offsets
+ private :_content_transfer_encoding_index_offsets, :_content_transfer_encoding_index_offsets=
+end
+self._content_transfer_encoding_index_offsets = [
+ 0, 0, 119, 121, 146, 148, 173, 175,
+ 200, 319, 447, 575, 577, 602, 731, 850,
+ 902, 954, 987, 1020
+]
+
+class << self
+ attr_accessor :_content_transfer_encoding_indicies
+ private :_content_transfer_encoding_indicies, :_content_transfer_encoding_indicies=
+end
+self._content_transfer_encoding_indicies = [
+ 0, 1, 1, 1, 2, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 0,
+ 3, 3, 3, 3, 3, 3, 3, 4,
+ 1, 3, 3, 3, 3, 3, 1, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 1, 1, 1, 1, 1, 1, 1,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 1, 1, 1, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 1, 5,
+ 1, 0, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 1, 6, 1, 7, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 7, 1, 8, 1, 9,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 9, 1,
+ 10, 1, 1, 1, 11, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 10,
+ 12, 12, 12, 12, 12, 12, 12, 13,
+ 1, 12, 12, 12, 12, 12, 1, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 1, 1, 1, 1, 1, 1, 1,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 1, 1, 1, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 1, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 1, 14, 14, 15, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 16, 17,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 18, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 1, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 1, 19, 19, 20, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 21, 22,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 23, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 1, 24,
+ 1, 19, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 19, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 19, 25, 1, 1, 1, 26,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 25, 27, 27, 27, 27, 27,
+ 27, 27, 28, 1, 27, 27, 27, 27,
+ 27, 1, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 1, 29, 1, 1,
+ 1, 1, 1, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 1, 1, 1,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 1, 7, 1, 1, 1, 30, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 7, 1, 1, 1, 1, 1, 1,
+ 1, 31, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 9, 1, 32, 1,
+ 1, 1, 33, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 32, 1, 1,
+ 1, 1, 1, 1, 1, 34, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 35, 1, 9, 1, 1, 1, 36, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 9, 1, 1, 1, 1, 1, 1,
+ 1, 37, 1, 35, 1, 1, 1, 38,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 35, 1, 1, 1, 1, 1,
+ 1, 1, 39, 1, 1, 0
+]
+
+class << self
+ attr_accessor :_content_transfer_encoding_trans_targs
+ private :_content_transfer_encoding_trans_targs, :_content_transfer_encoding_trans_targs=
+end
+self._content_transfer_encoding_trans_targs = [
+ 1, 0, 2, 14, 8, 3, 5, 15,
+ 7, 17, 1, 2, 14, 8, 10, 11,
+ 10, 19, 13, 10, 11, 10, 19, 13,
+ 12, 15, 4, 14, 16, 17, 4, 16,
+ 15, 4, 16, 17, 6, 18, 6, 18
+]
+
+class << self
+ attr_accessor :_content_transfer_encoding_trans_actions
+ private :_content_transfer_encoding_trans_actions, :_content_transfer_encoding_trans_actions=
+end
+self._content_transfer_encoding_trans_actions = [
+ 0, 0, 0, 1, 2, 0, 0, 0,
+ 0, 0, 3, 3, 4, 5, 6, 6,
+ 7, 8, 6, 0, 0, 2, 9, 0,
+ 0, 10, 10, 0, 11, 10, 0, 2,
+ 3, 3, 5, 3, 0, 2, 3, 5
+]
+
+class << self
+ attr_accessor :_content_transfer_encoding_eof_actions
+ private :_content_transfer_encoding_eof_actions, :_content_transfer_encoding_eof_actions=
+end
+self._content_transfer_encoding_eof_actions = [
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 10, 0,
+ 3, 0, 3, 0
+]
+
+class << self
+ attr_accessor :content_transfer_encoding_start
+end
+self.content_transfer_encoding_start = 1;
+class << self
+ attr_accessor :content_transfer_encoding_first_final
+end
+self.content_transfer_encoding_first_final = 14;
+class << self
+ attr_accessor :content_transfer_encoding_error
+end
+self.content_transfer_encoding_error = 0;
+
+class << self
+ attr_accessor :content_transfer_encoding_en_comment_tail
+end
+self.content_transfer_encoding_en_comment_tail = 9;
+class << self
+ attr_accessor :content_transfer_encoding_en_main
+end
+self.content_transfer_encoding_en_main = 1;
+
+
+# line 17 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb.rl"
+
+ def self.parse(data)
+ p = 0
+ eof = data.length
+ stack = []
+
+ actions = []
+ data_unpacked = data.bytes.to_a
+
+# line 251 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb"
+begin
+ p ||= 0
+ pe ||= data.length
+ cs = content_transfer_encoding_start
+ top = 0
+end
+
+# line 26 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb.rl"
+
+# line 261 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb"
+begin
+ testEof = false
+ _slen, _trans, _keys, _inds, _acts, _nacts = nil
+ _goto_level = 0
+ _resume = 10
+ _eof_trans = 15
+ _again = 20
+ _test_eof = 30
+ _out = 40
+ while true
+ if _goto_level <= 0
+ if p == pe
+ _goto_level = _test_eof
+ next
+ end
+ if cs == 0
+ _goto_level = _out
+ next
+ end
+ end
+ if _goto_level <= _resume
+ _keys = cs << 1
+ _inds = _content_transfer_encoding_index_offsets[cs]
+ _slen = _content_transfer_encoding_key_spans[cs]
+ _trans = if ( _slen > 0 &&
+ _content_transfer_encoding_trans_keys[_keys] <= ( data_unpacked[p]) &&
+ ( data_unpacked[p]) <= _content_transfer_encoding_trans_keys[_keys + 1]
+ ) then
+ _content_transfer_encoding_indicies[ _inds + ( data_unpacked[p]) - _content_transfer_encoding_trans_keys[_keys] ]
+ else
+ _content_transfer_encoding_indicies[ _inds + _slen ]
+ end
+ cs = _content_transfer_encoding_trans_targs[_trans]
+ if _content_transfer_encoding_trans_actions[_trans] != 0
+ case _content_transfer_encoding_trans_actions[_trans]
+ when 3 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+ when 6 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+ when 10 then
+# line 17 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(14, p) end
+ when 1 then
+# line 18 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(15, p) end
+ when 2 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 9
+ _goto_level = _again
+ next
+ end
+ end
+ when 9 then
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ top -= 1
+ cs = stack[top]
+ _goto_level = _again
+ next
+ end
+ end
+ when 4 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 18 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(15, p) end
+ when 5 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 9
+ _goto_level = _again
+ next
+ end
+ end
+ when 7 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 9
+ _goto_level = _again
+ next
+ end
+ end
+ when 8 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ top -= 1
+ cs = stack[top]
+ _goto_level = _again
+ next
+ end
+ end
+ when 11 then
+# line 17 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(14, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 9
+ _goto_level = _again
+ next
+ end
+ end
+# line 396 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb"
+ end
+ end
+ end
+ if _goto_level <= _again
+ if cs == 0
+ _goto_level = _out
+ next
+ end
+ p += 1
+ if p != pe
+ _goto_level = _resume
+ next
+ end
+ end
+ if _goto_level <= _test_eof
+ if p == eof
+ case _content_transfer_encoding_eof_actions[cs]
+ when 3 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+ when 10 then
+# line 17 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(14, p) end
+# line 422 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb"
+ end
+ end
+
+ end
+ if _goto_level <= _out
+ break
+ end
+end
+ end
+
+# line 27 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb.rl"
+
+ if p == eof && cs >=
+# line 436 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb"
+14
+# line 28 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb.rl"
+
+ return actions, nil
+ else
+ return [], "Only able to parse up to #{data[0..p]}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb.rl b/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb.rl
new file mode 100644
index 0000000..a7e630b
--- /dev/null
+++ b/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb.rl
@@ -0,0 +1,37 @@
+%%{
+ machine content_transfer_encoding;
+
+ include rb_actions "rb_actions.rl";
+ include common "../../common.rl";
+
+ getkey data_unpacked[p];
+
+ main := content_transfer_encoding;
+}%%
+
+module Mail
+ module Parsers
+ module Ragel
+ module ContentTransferEncodingMachine
+ %%write data;
+
+ def self.parse(data)
+ p = 0
+ eof = data.length
+ stack = []
+
+ actions = []
+ data_unpacked = data.bytes.to_a
+ %%write init;
+ %%write exec;
+
+ if p == eof && cs >= %%{ write first_final; }%%
+ return actions, nil
+ else
+ return [], "Only able to parse up to #{data[0..p]}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb b/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb
new file mode 100644
index 0000000..d32846e
--- /dev/null
+++ b/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb
@@ -0,0 +1,825 @@
+
+# line 1 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb.rl"
+
+# line 10 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb.rl"
+
+
+module Mail
+ module Parsers
+ module Ragel
+ module ContentTypeMachine
+
+# line 13 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb"
+class << self
+ attr_accessor :_content_type_trans_keys
+ private :_content_type_trans_keys, :_content_type_trans_keys=
+end
+self._content_type_trans_keys = [
+ 0, 0, 33, 126, 33, 126,
+ 33, 126, 9, 126, 10,
+ 10, 9, 32, 33, 126,
+ 9, 126, 9, 40, 10, 10,
+ 9, 32, 1, 127, 1,
+ 127, 10, 10, 9, 32,
+ 10, 10, 9, 32, 9, 126,
+ 9, 126, 10, 10, 9,
+ 32, 9, 126, 0, 127,
+ 9, 40, 10, 10, 9, 32,
+ 9, 126, 1, 127, 1,
+ 127, 10, 10, 9, 32,
+ 0, 127, 9, 126, 9, 59,
+ 9, 126, 9, 126, 9,
+ 126, 9, 126, 9, 126,
+ 0, 0, 0
+]
+
+class << self
+ attr_accessor :_content_type_key_spans
+ private :_content_type_key_spans, :_content_type_key_spans=
+end
+self._content_type_key_spans = [
+ 0, 94, 94, 94, 118, 1, 24, 94,
+ 118, 32, 1, 24, 127, 127, 1, 24,
+ 1, 24, 118, 118, 1, 24, 118, 128,
+ 32, 1, 24, 118, 127, 127, 1, 24,
+ 128, 118, 51, 118, 118, 118, 118, 118,
+ 0
+]
+
+class << self
+ attr_accessor :_content_type_index_offsets
+ private :_content_type_index_offsets, :_content_type_index_offsets=
+end
+self._content_type_index_offsets = [
+ 0, 0, 95, 190, 285, 404, 406, 431,
+ 526, 645, 678, 680, 705, 833, 961, 963,
+ 988, 990, 1015, 1134, 1253, 1255, 1280, 1399,
+ 1528, 1561, 1563, 1588, 1707, 1835, 1963, 1965,
+ 1990, 2119, 2238, 2290, 2409, 2528, 2647, 2766,
+ 2885
+]
+
+class << self
+ attr_accessor :_content_type_indicies
+ private :_content_type_indicies, :_content_type_indicies=
+end
+self._content_type_indicies = [
+ 0, 0, 0, 0, 0, 0, 0, 1,
+ 1, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 1, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 2,
+ 2, 2, 2, 2, 2, 2, 1, 1,
+ 2, 2, 2, 2, 2, 3, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 1, 1, 1, 1, 1, 1, 1, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 1, 1, 1, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 1, 4, 4,
+ 4, 4, 4, 4, 4, 1, 1, 4,
+ 4, 4, 4, 4, 1, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 1,
+ 1, 1, 1, 1, 1, 1, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 1, 1, 1, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 1, 5, 1, 1,
+ 1, 6, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 5, 7, 7, 7,
+ 7, 7, 7, 7, 8, 1, 7, 7,
+ 7, 7, 7, 1, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 1, 9,
+ 1, 1, 1, 1, 1, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 1,
+ 1, 1, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 1, 10, 1, 5, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 5, 1, 11,
+ 11, 11, 11, 11, 11, 11, 1, 1,
+ 11, 11, 11, 11, 11, 1, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11,
+ 1, 1, 1, 12, 1, 1, 1, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 1, 1, 1, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 11, 11, 11,
+ 11, 11, 11, 11, 11, 1, 13, 1,
+ 1, 1, 14, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 13, 15, 16,
+ 15, 15, 15, 15, 15, 17, 1, 15,
+ 15, 15, 15, 15, 1, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 1,
+ 1, 1, 15, 1, 1, 1, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 1, 1, 1, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15,
+ 15, 15, 15, 15, 1, 18, 1, 1,
+ 1, 19, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 18, 1, 20, 1,
+ 1, 1, 1, 1, 21, 1, 22, 1,
+ 18, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 18,
+ 1, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 1, 23, 23, 24, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 25, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 26, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 1, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 1, 27, 27, 28, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 29, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 30, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 1, 31, 1, 27, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 27, 1, 32, 1, 33, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 33, 1, 34,
+ 1, 1, 1, 35, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 34, 7,
+ 7, 7, 7, 7, 7, 7, 36, 1,
+ 7, 7, 7, 7, 7, 1, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 1, 9, 1, 1, 1, 1, 1, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 1, 1, 1, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 1, 34, 1,
+ 1, 1, 35, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 34, 7, 7,
+ 7, 7, 7, 7, 7, 36, 1, 7,
+ 7, 7, 7, 7, 1, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 1,
+ 1, 1, 1, 1, 1, 1, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 1, 1, 1, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 1, 37, 1, 34,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 34, 1,
+ 38, 1, 1, 1, 39, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 38,
+ 40, 40, 40, 40, 40, 40, 40, 41,
+ 1, 40, 40, 40, 40, 40, 1, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 1, 1, 1, 1, 1, 1, 1,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 1, 1, 1, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 1, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 1,
+ 42, 1, 1, 1, 43, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 42,
+ 1, 44, 1, 1, 1, 1, 1, 45,
+ 1, 46, 1, 47, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 47, 1, 48, 1, 1, 1,
+ 49, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 48, 40, 40, 40, 40,
+ 40, 40, 40, 50, 1, 40, 40, 40,
+ 40, 40, 1, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 1, 51, 1,
+ 1, 1, 1, 1, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 1, 1,
+ 1, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 1, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 1, 52, 52, 53,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 54, 55, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 56, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52,
+ 52, 52, 1, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 1, 57, 57, 58,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 59, 60, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 61, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 1, 62, 1, 57, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 57, 1, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 57, 57, 1, 63,
+ 1, 1, 1, 64, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 63, 65,
+ 65, 65, 65, 65, 65, 65, 66, 1,
+ 65, 65, 65, 65, 65, 1, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 1, 67, 1, 1, 1, 1, 1, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 1, 1, 1, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 1, 68, 1,
+ 1, 1, 69, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 68, 1, 1,
+ 1, 1, 1, 1, 1, 70, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 71, 1, 68, 1, 1, 1, 69, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 68, 7, 7, 7, 7, 7, 7,
+ 7, 70, 1, 7, 7, 7, 7, 7,
+ 1, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 1, 71, 1, 1, 1,
+ 1, 1, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 1, 1, 1, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 1, 72, 1, 1, 1, 73, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 72, 40, 40, 40, 40, 40, 40, 40,
+ 74, 1, 40, 40, 40, 40, 40, 1,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 1, 75, 1, 1, 1, 1,
+ 1, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 1, 1, 1, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 1,
+ 76, 1, 1, 1, 77, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 76,
+ 78, 1, 78, 78, 78, 78, 78, 79,
+ 1, 78, 78, 78, 78, 78, 1, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 1, 71, 1, 78, 1, 1, 1,
+ 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 1, 1, 1, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 78, 78, 78, 78, 1, 47,
+ 1, 1, 1, 80, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 47, 7,
+ 7, 7, 7, 7, 7, 7, 81, 1,
+ 7, 7, 7, 7, 7, 1, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 1, 9, 1, 1, 1, 1, 1, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 1, 1, 1, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 1, 82, 1,
+ 1, 1, 83, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 82, 40, 40,
+ 40, 40, 40, 40, 40, 84, 1, 40,
+ 40, 40, 40, 40, 1, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 1,
+ 51, 1, 1, 1, 1, 1, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 1, 1, 1, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 1, 1, 0
+]
+
+class << self
+ attr_accessor :_content_type_trans_targs
+ private :_content_type_trans_targs, :_content_type_trans_targs=
+end
+self._content_type_trans_targs = [
+ 2, 0, 2, 3, 33, 4, 5, 7,
+ 27, 18, 6, 7, 8, 9, 10, 37,
+ 12, 24, 9, 10, 12, 24, 11, 13,
+ 14, 34, 23, 13, 14, 34, 23, 15,
+ 17, 35, 19, 20, 22, 21, 19, 20,
+ 7, 22, 9, 10, 12, 24, 26, 38,
+ 4, 5, 27, 18, 29, 30, 29, 40,
+ 32, 29, 30, 29, 40, 32, 31, 4,
+ 5, 33, 27, 18, 35, 16, 36, 18,
+ 35, 16, 36, 18, 38, 25, 37, 39,
+ 25, 39, 38, 25, 39
+]
+
+class << self
+ attr_accessor :_content_type_trans_actions
+ private :_content_type_trans_actions, :_content_type_trans_actions=
+end
+self._content_type_trans_actions = [
+ 1, 0, 0, 2, 3, 0, 0, 4,
+ 5, 0, 0, 0, 6, 7, 7, 7,
+ 7, 8, 0, 0, 0, 5, 0, 9,
+ 9, 10, 9, 0, 0, 11, 0, 0,
+ 0, 0, 0, 0, 5, 0, 12, 12,
+ 13, 14, 12, 12, 12, 14, 0, 0,
+ 12, 12, 14, 12, 15, 15, 16, 17,
+ 15, 0, 0, 5, 18, 0, 0, 19,
+ 19, 0, 20, 19, 21, 21, 22, 21,
+ 23, 23, 24, 23, 21, 21, 0, 25,
+ 0, 5, 12, 12, 14
+]
+
+class << self
+ attr_accessor :_content_type_eof_actions
+ private :_content_type_eof_actions, :_content_type_eof_actions=
+end
+self._content_type_eof_actions = [
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 19, 21, 21, 23, 21, 0, 12,
+ 0
+]
+
+class << self
+ attr_accessor :content_type_start
+end
+self.content_type_start = 1;
+class << self
+ attr_accessor :content_type_first_final
+end
+self.content_type_first_final = 33;
+class << self
+ attr_accessor :content_type_error
+end
+self.content_type_error = 0;
+
+class << self
+ attr_accessor :content_type_en_comment_tail
+end
+self.content_type_en_comment_tail = 28;
+class << self
+ attr_accessor :content_type_en_main
+end
+self.content_type_en_main = 1;
+
+
+# line 17 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb.rl"
+
+ def self.parse(data)
+ p = 0
+ eof = data.length
+ stack = []
+
+ actions = []
+ data_unpacked = data.bytes.to_a
+
+# line 513 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb"
+begin
+ p ||= 0
+ pe ||= data.length
+ cs = content_type_start
+ top = 0
+end
+
+# line 26 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb.rl"
+
+# line 523 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb"
+begin
+ testEof = false
+ _slen, _trans, _keys, _inds, _acts, _nacts = nil
+ _goto_level = 0
+ _resume = 10
+ _eof_trans = 15
+ _again = 20
+ _test_eof = 30
+ _out = 40
+ while true
+ if _goto_level <= 0
+ if p == pe
+ _goto_level = _test_eof
+ next
+ end
+ if cs == 0
+ _goto_level = _out
+ next
+ end
+ end
+ if _goto_level <= _resume
+ _keys = cs << 1
+ _inds = _content_type_index_offsets[cs]
+ _slen = _content_type_key_spans[cs]
+ _trans = if ( _slen > 0 &&
+ _content_type_trans_keys[_keys] <= ( data_unpacked[p]) &&
+ ( data_unpacked[p]) <= _content_type_trans_keys[_keys + 1]
+ ) then
+ _content_type_indicies[ _inds + ( data_unpacked[p]) - _content_type_trans_keys[_keys] ]
+ else
+ _content_type_indicies[ _inds + _slen ]
+ end
+ cs = _content_type_trans_targs[_trans]
+ if _content_type_trans_actions[_trans] != 0
+ case _content_type_trans_actions[_trans]
+ when 12 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+ when 15 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+ when 2 then
+# line 25 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(22, p) end
+ when 1 then
+# line 26 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(23, p) end
+ when 6 then
+# line 35 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(32, p) end
+ when 4 then
+# line 36 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(33, p) end
+ when 21 then
+# line 37 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(34, p) end
+ when 7 then
+# line 38 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(35, p) end
+ when 11 then
+# line 41 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(38, p) end
+ when 9 then
+# line 42 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(39, p) end
+ when 19 then
+# line 45 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(42, p) end
+ when 3 then
+# line 46 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(43, p) end
+ when 5 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 28
+ _goto_level = _again
+ next
+ end
+ end
+ when 18 then
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ top -= 1
+ cs = stack[top]
+ _goto_level = _again
+ next
+ end
+ end
+ when 13 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 36 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(33, p) end
+ when 23 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 37 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(34, p) end
+ when 14 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 28
+ _goto_level = _again
+ next
+ end
+ end
+ when 16 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 28
+ _goto_level = _again
+ next
+ end
+ end
+ when 17 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ top -= 1
+ cs = stack[top]
+ _goto_level = _again
+ next
+ end
+ end
+ when 25 then
+# line 37 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(34, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 28
+ _goto_level = _again
+ next
+ end
+ end
+ when 8 then
+# line 38 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(35, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 28
+ _goto_level = _again
+ next
+ end
+ end
+ when 10 then
+# line 42 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(39, p) end
+# line 41 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(38, p) end
+ when 20 then
+# line 45 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(42, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 28
+ _goto_level = _again
+ next
+ end
+ end
+ when 22 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 28
+ _goto_level = _again
+ next
+ end
+ end
+# line 37 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(34, p) end
+ when 24 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 28
+ _goto_level = _again
+ next
+ end
+ end
+# line 37 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(34, p) end
+# line 763 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb"
+ end
+ end
+ end
+ if _goto_level <= _again
+ if cs == 0
+ _goto_level = _out
+ next
+ end
+ p += 1
+ if p != pe
+ _goto_level = _resume
+ next
+ end
+ end
+ if _goto_level <= _test_eof
+ if p == eof
+ case _content_type_eof_actions[cs]
+ when 12 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+ when 21 then
+# line 37 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(34, p) end
+ when 19 then
+# line 45 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(42, p) end
+ when 23 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 37 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(34, p) end
+# line 800 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb"
+ end
+ end
+
+ end
+ if _goto_level <= _out
+ break
+ end
+end
+ end
+
+# line 27 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb.rl"
+
+ if p == eof && cs >=
+# line 814 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb"
+33
+# line 28 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb.rl"
+
+ return actions, nil
+ else
+ return [], "Only able to parse up to #{data[0..p]}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb.rl b/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb.rl
new file mode 100644
index 0000000..5d90095
--- /dev/null
+++ b/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb.rl
@@ -0,0 +1,37 @@
+%%{
+ machine content_type;
+
+ include rb_actions "rb_actions.rl";
+ include common "../../common.rl";
+
+ getkey data_unpacked[p];
+
+ main := content_type;
+}%%
+
+module Mail
+ module Parsers
+ module Ragel
+ module ContentTypeMachine
+ %%write data;
+
+ def self.parse(data)
+ p = 0
+ eof = data.length
+ stack = []
+
+ actions = []
+ data_unpacked = data.bytes.to_a
+ %%write init;
+ %%write exec;
+
+ if p == eof && cs >= %%{ write first_final; }%%
+ return actions, nil
+ else
+ return [], "Only able to parse up to #{data[0..p]}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb b/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb
new file mode 100644
index 0000000..f1f8fdc
--- /dev/null
+++ b/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb
@@ -0,0 +1,817 @@
+
+# line 1 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb.rl"
+
+# line 10 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb.rl"
+
+
+module Mail
+ module Parsers
+ module Ragel
+ module DateTimeMachine
+
+# line 13 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb"
+class << self
+ attr_accessor :_date_time_trans_keys
+ private :_date_time_trans_keys, :_date_time_trans_keys=
+end
+self._date_time_trans_keys = [
+ 0, 0, 9, 87, 9, 87,
+ 10, 10, 9, 32, 9,
+ 87, 9, 83, 9, 83,
+ 10, 10, 9, 32, 9, 83,
+ 112, 117, 114, 114, 9,
+ 57, 10, 10, 9, 32,
+ 9, 57, 48, 57, 9, 57,
+ 9, 57, 10, 10, 9,
+ 32, 9, 57, 48, 57,
+ 9, 58, 10, 10, 9, 32,
+ 9, 58, 9, 57, 10,
+ 10, 9, 32, 9, 57,
+ 48, 57, 9, 58, 9, 122,
+ 10, 10, 9, 32, 9,
+ 58, 9, 57, 10, 10,
+ 9, 32, 9, 57, 48, 57,
+ 9, 40, 9, 122, 10,
+ 10, 9, 32, 9, 40,
+ 48, 57, 48, 57, 48, 57,
+ 48, 57, 10, 10, 9,
+ 32, 84, 84, 103, 103,
+ 101, 101, 99, 99, 101, 101,
+ 98, 98, 97, 117, 110,
+ 110, 108, 110, 97, 97,
+ 114, 121, 111, 111, 118, 118,
+ 99, 99, 116, 116, 101,
+ 101, 112, 112, 114, 114,
+ 105, 105, 9, 44, 10, 10,
+ 9, 32, 9, 44, 9,
+ 57, 9, 57, 10, 10,
+ 9, 32, 9, 57, 111, 111,
+ 110, 110, 97, 117, 116,
+ 116, 104, 117, 117, 117,
+ 101, 101, 101, 101, 100, 100,
+ 1, 127, 1, 127, 10,
+ 10, 9, 32, 0, 127,
+ 9, 40, 9, 40, 9, 40,
+ 9, 83, 9, 77, 9,
+ 84, 0, 0, 0
+]
+
+class << self
+ attr_accessor :_date_time_key_spans
+ private :_date_time_key_spans, :_date_time_key_spans=
+end
+self._date_time_key_spans = [
+ 0, 79, 79, 1, 24, 79, 75, 75,
+ 1, 24, 75, 6, 1, 49, 1, 24,
+ 49, 10, 49, 49, 1, 24, 49, 10,
+ 50, 1, 24, 50, 49, 1, 24, 49,
+ 10, 50, 114, 1, 24, 50, 49, 1,
+ 24, 49, 10, 32, 114, 1, 24, 32,
+ 10, 10, 10, 10, 1, 24, 1, 1,
+ 1, 1, 1, 1, 21, 1, 3, 1,
+ 8, 1, 1, 1, 1, 1, 1, 1,
+ 1, 36, 1, 24, 36, 49, 49, 1,
+ 24, 49, 1, 1, 21, 1, 14, 1,
+ 1, 1, 1, 127, 127, 1, 24, 128,
+ 32, 32, 32, 75, 69, 76, 0
+]
+
+class << self
+ attr_accessor :_date_time_index_offsets
+ private :_date_time_index_offsets, :_date_time_index_offsets=
+end
+self._date_time_index_offsets = [
+ 0, 0, 80, 160, 162, 187, 267, 343,
+ 419, 421, 446, 522, 529, 531, 581, 583,
+ 608, 658, 669, 719, 769, 771, 796, 846,
+ 857, 908, 910, 935, 986, 1036, 1038, 1063,
+ 1113, 1124, 1175, 1290, 1292, 1317, 1368, 1418,
+ 1420, 1445, 1495, 1506, 1539, 1654, 1656, 1681,
+ 1714, 1725, 1736, 1747, 1758, 1760, 1785, 1787,
+ 1789, 1791, 1793, 1795, 1797, 1819, 1821, 1825,
+ 1827, 1836, 1838, 1840, 1842, 1844, 1846, 1848,
+ 1850, 1852, 1889, 1891, 1916, 1953, 2003, 2053,
+ 2055, 2080, 2130, 2132, 2134, 2156, 2158, 2173,
+ 2175, 2177, 2179, 2181, 2309, 2437, 2439, 2464,
+ 2593, 2626, 2659, 2692, 2768, 2838, 2915
+]
+
+class << self
+ attr_accessor :_date_time_indicies
+ private :_date_time_indicies, :_date_time_indicies=
+end
+self._date_time_indicies = [
+ 0, 1, 1, 1, 2, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 0,
+ 1, 1, 1, 1, 1, 1, 1, 3,
+ 1, 1, 1, 1, 1, 1, 1, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 5, 1, 1,
+ 1, 1, 1, 1, 6, 1, 1, 1,
+ 1, 1, 7, 8, 1, 1, 9, 1,
+ 10, 1, 1, 1, 11, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 10,
+ 1, 1, 1, 1, 1, 1, 1, 12,
+ 1, 1, 1, 1, 1, 1, 1, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 5, 1, 1,
+ 1, 1, 1, 1, 6, 1, 1, 1,
+ 1, 1, 7, 8, 1, 1, 9, 1,
+ 14, 1, 10, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 10, 1, 15, 1, 1, 1, 16,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 15, 1, 1, 1, 1, 1,
+ 1, 1, 17, 1, 1, 1, 1, 1,
+ 1, 1, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 19, 1, 1, 1, 1, 1, 1, 20,
+ 1, 1, 1, 1, 1, 21, 22, 1,
+ 1, 23, 1, 24, 1, 1, 1, 25,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 24, 1, 1, 1, 1, 1,
+ 1, 1, 26, 1, 1, 1, 1, 1,
+ 1, 1, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 1, 1, 1, 1,
+ 1, 1, 1, 27, 1, 1, 28, 1,
+ 29, 1, 1, 1, 30, 1, 1, 31,
+ 32, 33, 1, 1, 1, 34, 1, 24,
+ 1, 1, 1, 25, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 24, 1,
+ 1, 1, 1, 1, 1, 1, 26, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 27,
+ 1, 1, 28, 1, 29, 1, 1, 1,
+ 30, 1, 1, 31, 32, 33, 1, 1,
+ 1, 34, 1, 35, 1, 24, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 24, 1, 36, 1,
+ 1, 1, 37, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 36, 1, 1,
+ 1, 1, 1, 1, 1, 38, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 39, 1,
+ 1, 40, 1, 41, 1, 1, 1, 42,
+ 1, 1, 43, 44, 45, 1, 1, 1,
+ 46, 1, 47, 1, 1, 1, 1, 48,
+ 1, 49, 1, 49, 1, 1, 1, 50,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 49, 1, 1, 1, 1, 1,
+ 1, 1, 51, 1, 1, 1, 1, 1,
+ 1, 1, 52, 52, 52, 52, 52, 52,
+ 52, 52, 52, 52, 1, 53, 1, 49,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 49, 1,
+ 54, 1, 1, 1, 55, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 54,
+ 1, 1, 1, 1, 1, 1, 1, 56,
+ 1, 1, 1, 1, 1, 1, 1, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 1, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 1, 59, 1, 1,
+ 1, 60, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 59, 1, 1, 1,
+ 1, 1, 1, 1, 61, 1, 1, 1,
+ 1, 1, 1, 1, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 1, 59,
+ 1, 1, 1, 60, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 59, 1,
+ 1, 1, 1, 1, 1, 1, 61, 1,
+ 1, 1, 1, 1, 1, 1, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 1, 63, 1, 59, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 59, 1, 64, 1, 1, 1,
+ 65, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 64, 1, 1, 1, 1,
+ 1, 1, 1, 66, 1, 1, 1, 1,
+ 1, 1, 1, 67, 67, 67, 67, 67,
+ 67, 67, 67, 67, 67, 1, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 68,
+ 1, 68, 1, 1, 1, 69, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 68, 1, 1, 1, 1, 1, 1, 1,
+ 70, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 71, 1, 72, 1, 68, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 68, 1, 73,
+ 1, 1, 1, 74, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 73, 1,
+ 1, 1, 1, 1, 1, 1, 75, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 76, 1, 71, 1, 1, 1, 77, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 71, 1, 1, 1, 1, 1, 1,
+ 1, 78, 1, 1, 1, 1, 1, 1,
+ 1, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 1, 80, 1, 71, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 71, 1, 76,
+ 1, 1, 1, 81, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 76, 1,
+ 1, 1, 1, 1, 1, 1, 82, 1,
+ 1, 1, 1, 1, 1, 1, 83, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83,
+ 1, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 1, 85, 1, 1, 1,
+ 86, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 85, 1, 1, 1, 1,
+ 1, 1, 1, 87, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 88, 1, 85,
+ 1, 1, 1, 86, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 85, 1,
+ 1, 1, 1, 1, 1, 1, 87, 1,
+ 1, 89, 1, 89, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 88, 1, 1, 1, 1, 1, 1, 90,
+ 90, 91, 90, 91, 90, 92, 90, 90,
+ 1, 90, 90, 91, 90, 90, 91, 90,
+ 90, 90, 90, 93, 90, 90, 90, 90,
+ 90, 1, 1, 1, 1, 1, 1, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90,
+ 1, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 1, 94, 1, 85, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 85, 1, 95, 1, 1,
+ 1, 96, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 95, 1, 1, 1,
+ 1, 1, 1, 1, 97, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 98, 1,
+ 88, 1, 1, 1, 99, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 88,
+ 1, 1, 1, 1, 1, 1, 1, 100,
+ 1, 1, 1, 1, 1, 1, 1, 101,
+ 101, 101, 101, 101, 101, 101, 101, 101,
+ 101, 1, 102, 1, 88, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 88, 1, 98, 1, 1,
+ 1, 103, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 98, 1, 1, 1,
+ 1, 1, 1, 1, 104, 1, 1, 1,
+ 1, 1, 1, 1, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 1, 106,
+ 106, 106, 106, 106, 106, 106, 106, 106,
+ 106, 1, 107, 1, 1, 1, 108, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 107, 1, 1, 1, 1, 1, 1,
+ 1, 109, 1, 107, 1, 1, 1, 108,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 107, 1, 1, 1, 1, 1,
+ 1, 1, 109, 1, 1, 89, 1, 89,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 90, 90, 91, 90, 91,
+ 90, 92, 90, 90, 1, 90, 90, 91,
+ 90, 90, 91, 90, 90, 90, 90, 93,
+ 90, 90, 90, 90, 90, 1, 1, 1,
+ 1, 1, 1, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 1, 90, 90, 90,
+ 90, 90, 90, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 1, 110, 1,
+ 107, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 107,
+ 1, 111, 1, 1, 1, 112, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 111, 1, 1, 1, 1, 1, 1, 1,
+ 113, 1, 114, 114, 114, 114, 114, 114,
+ 114, 114, 114, 114, 1, 115, 115, 115,
+ 115, 115, 115, 115, 115, 115, 115, 1,
+ 116, 116, 116, 116, 116, 116, 116, 116,
+ 116, 116, 1, 90, 90, 90, 90, 90,
+ 90, 90, 90, 90, 90, 1, 117, 1,
+ 118, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 118,
+ 1, 90, 1, 49, 1, 119, 1, 49,
+ 1, 120, 1, 49, 1, 121, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 122, 1, 49, 1, 49, 1, 49,
+ 1, 123, 1, 49, 1, 1, 1, 1,
+ 1, 1, 49, 1, 124, 1, 49, 1,
+ 125, 1, 49, 1, 126, 1, 49, 1,
+ 127, 1, 128, 1, 128, 1, 1, 1,
+ 129, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 128, 1, 1, 1, 1,
+ 1, 1, 1, 130, 1, 1, 1, 131,
+ 1, 132, 1, 128, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 128, 1, 133, 1, 1, 1,
+ 134, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 133, 1, 1, 1, 1,
+ 1, 1, 1, 135, 1, 1, 1, 136,
+ 1, 137, 1, 1, 1, 138, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 137, 1, 1, 1, 1, 1, 1, 1,
+ 139, 1, 1, 1, 1, 1, 1, 1,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 1, 140, 1, 1, 1, 141,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 140, 1, 1, 1, 1, 1,
+ 1, 1, 142, 1, 1, 1, 1, 1,
+ 1, 1, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 1, 143, 1, 140,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 140, 1,
+ 144, 1, 1, 1, 145, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 144,
+ 1, 1, 1, 1, 1, 1, 1, 146,
+ 1, 1, 1, 1, 1, 1, 1, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 1, 147, 1, 128, 1, 148, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 147, 1, 128, 1, 149, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 150, 1, 128, 1, 128,
+ 1, 151, 1, 128, 1, 152, 152, 152,
+ 152, 152, 152, 152, 152, 152, 1, 152,
+ 152, 153, 152, 152, 152, 152, 152, 152,
+ 152, 152, 152, 152, 152, 152, 152, 152,
+ 152, 152, 152, 152, 152, 152, 152, 152,
+ 152, 152, 152, 152, 154, 155, 152, 152,
+ 152, 152, 152, 152, 152, 152, 152, 152,
+ 152, 152, 152, 152, 152, 152, 152, 152,
+ 152, 152, 152, 152, 152, 152, 152, 152,
+ 152, 152, 152, 152, 152, 152, 152, 152,
+ 152, 152, 152, 152, 152, 152, 152, 152,
+ 152, 152, 152, 152, 152, 152, 152, 152,
+ 156, 152, 152, 152, 152, 152, 152, 152,
+ 152, 152, 152, 152, 152, 152, 152, 152,
+ 152, 152, 152, 152, 152, 152, 152, 152,
+ 152, 152, 152, 152, 152, 152, 152, 152,
+ 152, 152, 152, 152, 1, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 1, 157,
+ 157, 158, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 159, 160, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 161, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 1, 162, 1, 157,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 157, 1,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157,
+ 1, 163, 1, 1, 1, 164, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 163, 1, 1, 1, 1, 1, 1, 1,
+ 165, 1, 118, 1, 1, 1, 166, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 118, 1, 1, 1, 1, 1, 1,
+ 1, 167, 1, 168, 1, 1, 1, 169,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 168, 1, 1, 1, 1, 1,
+ 1, 1, 170, 1, 163, 1, 1, 1,
+ 164, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 163, 1, 1, 1, 1,
+ 1, 1, 1, 165, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 171,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 171, 1,
+ 163, 1, 1, 1, 164, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 163,
+ 1, 1, 1, 1, 1, 1, 1, 165,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 171, 1, 163, 1,
+ 1, 1, 164, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 163, 1, 1,
+ 1, 1, 1, 1, 1, 165, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 90, 1, 1, 0
+]
+
+class << self
+ attr_accessor :_date_time_trans_targs
+ private :_date_time_trans_targs, :_date_time_trans_targs=
+end
+self._date_time_trans_targs = [
+ 2, 0, 3, 5, 6, 71, 82, 84,
+ 86, 89, 2, 3, 5, 6, 4, 2,
+ 3, 5, 6, 71, 82, 84, 86, 89,
+ 7, 8, 10, 11, 56, 58, 60, 63,
+ 65, 67, 69, 9, 7, 8, 10, 11,
+ 56, 58, 60, 63, 65, 67, 69, 12,
+ 55, 13, 14, 16, 17, 15, 13, 14,
+ 16, 17, 18, 19, 20, 22, 23, 21,
+ 19, 20, 22, 23, 24, 25, 27, 28,
+ 26, 24, 25, 27, 28, 29, 31, 32,
+ 30, 29, 31, 32, 33, 34, 35, 37,
+ 38, 48, 96, 99, 100, 101, 36, 34,
+ 35, 37, 38, 39, 41, 42, 40, 39,
+ 41, 42, 43, 44, 45, 47, 46, 44,
+ 45, 47, 49, 50, 51, 53, 97, 57,
+ 59, 61, 62, 64, 66, 68, 70, 72,
+ 73, 74, 76, 77, 75, 73, 74, 76,
+ 77, 78, 79, 81, 78, 79, 81, 80,
+ 78, 79, 81, 83, 85, 87, 88, 90,
+ 92, 93, 92, 102, 95, 92, 93, 92,
+ 102, 95, 94, 97, 52, 98, 52, 98,
+ 97, 52, 98, 54
+]
+
+class << self
+ attr_accessor :_date_time_trans_actions
+ private :_date_time_trans_actions, :_date_time_trans_actions=
+end
+self._date_time_trans_actions = [
+ 1, 0, 1, 2, 1, 0, 0, 0,
+ 0, 0, 0, 0, 3, 0, 0, 4,
+ 4, 5, 4, 4, 4, 4, 4, 4,
+ 0, 0, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4, 4, 5, 4,
+ 4, 4, 4, 4, 4, 4, 4, 0,
+ 0, 0, 0, 3, 0, 0, 4, 4,
+ 5, 4, 0, 0, 0, 3, 6, 0,
+ 4, 4, 5, 7, 0, 0, 3, 0,
+ 0, 4, 4, 5, 4, 0, 3, 0,
+ 0, 4, 5, 4, 0, 0, 0, 3,
+ 0, 0, 0, 0, 0, 0, 0, 4,
+ 4, 5, 4, 0, 3, 0, 0, 4,
+ 5, 4, 0, 0, 0, 3, 0, 4,
+ 4, 5, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 3, 0, 0, 4, 4, 5,
+ 4, 1, 1, 8, 0, 0, 3, 0,
+ 4, 4, 5, 0, 0, 0, 0, 0,
+ 9, 9, 10, 11, 9, 0, 0, 3,
+ 12, 0, 0, 13, 13, 14, 0, 3,
+ 4, 4, 5, 0
+]
+
+class << self
+ attr_accessor :_date_time_eof_actions
+ private :_date_time_eof_actions, :_date_time_eof_actions=
+end
+self._date_time_eof_actions = [
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 13, 0, 4, 13, 13, 13, 0
+]
+
+class << self
+ attr_accessor :date_time_start
+end
+self.date_time_start = 1;
+class << self
+ attr_accessor :date_time_first_final
+end
+self.date_time_first_final = 96;
+class << self
+ attr_accessor :date_time_error
+end
+self.date_time_error = 0;
+
+class << self
+ attr_accessor :date_time_en_comment_tail
+end
+self.date_time_en_comment_tail = 91;
+class << self
+ attr_accessor :date_time_en_main
+end
+self.date_time_en_main = 1;
+
+
+# line 17 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb.rl"
+
+ def self.parse(data)
+ p = 0
+ eof = data.length
+ stack = []
+
+ actions = []
+ data_unpacked = data.bytes.to_a
+
+# line 583 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb"
+begin
+ p ||= 0
+ pe ||= data.length
+ cs = date_time_start
+ top = 0
+end
+
+# line 26 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb.rl"
+
+# line 593 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb"
+begin
+ testEof = false
+ _slen, _trans, _keys, _inds, _acts, _nacts = nil
+ _goto_level = 0
+ _resume = 10
+ _eof_trans = 15
+ _again = 20
+ _test_eof = 30
+ _out = 40
+ while true
+ if _goto_level <= 0
+ if p == pe
+ _goto_level = _test_eof
+ next
+ end
+ if cs == 0
+ _goto_level = _out
+ next
+ end
+ end
+ if _goto_level <= _resume
+ _keys = cs << 1
+ _inds = _date_time_index_offsets[cs]
+ _slen = _date_time_key_spans[cs]
+ _trans = if ( _slen > 0 &&
+ _date_time_trans_keys[_keys] <= ( data_unpacked[p]) &&
+ ( data_unpacked[p]) <= _date_time_trans_keys[_keys + 1]
+ ) then
+ _date_time_indicies[ _inds + ( data_unpacked[p]) - _date_time_trans_keys[_keys] ]
+ else
+ _date_time_indicies[ _inds + _slen ]
+ end
+ cs = _date_time_trans_targs[_trans]
+ if _date_time_trans_actions[_trans] != 0
+ case _date_time_trans_actions[_trans]
+ when 4 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+ when 9 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+ when 1 then
+# line 12 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(9, p) end
+ when 13 then
+# line 47 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(44, p) end
+ when 3 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 91
+ _goto_level = _again
+ next
+ end
+ end
+ when 12 then
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ top -= 1
+ cs = stack[top]
+ _goto_level = _again
+ next
+ end
+ end
+ when 5 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 91
+ _goto_level = _again
+ next
+ end
+ end
+ when 10 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 91
+ _goto_level = _again
+ next
+ end
+ end
+ when 11 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ top -= 1
+ cs = stack[top]
+ _goto_level = _again
+ next
+ end
+ end
+ when 6 then
+# line 11 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(8, p) end
+# line 48 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(45, p) end
+ when 8 then
+# line 12 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(9, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 91
+ _goto_level = _again
+ next
+ end
+ end
+ when 14 then
+# line 47 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(44, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 91
+ _goto_level = _again
+ next
+ end
+ end
+ when 2 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 91
+ _goto_level = _again
+ next
+ end
+ end
+# line 12 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(9, p) end
+ when 7 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 11 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(8, p) end
+# line 48 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(45, p) end
+# line 766 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb"
+ end
+ end
+ end
+ if _goto_level <= _again
+ if cs == 0
+ _goto_level = _out
+ next
+ end
+ p += 1
+ if p != pe
+ _goto_level = _resume
+ next
+ end
+ end
+ if _goto_level <= _test_eof
+ if p == eof
+ case _date_time_eof_actions[cs]
+ when 4 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+ when 13 then
+# line 47 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(44, p) end
+# line 792 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb"
+ end
+ end
+
+ end
+ if _goto_level <= _out
+ break
+ end
+end
+ end
+
+# line 27 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb.rl"
+
+ if p == eof && cs >=
+# line 806 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb"
+96
+# line 28 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb.rl"
+
+ return actions, nil
+ else
+ return [], "Only able to parse up to #{data[0..p]}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb.rl b/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb.rl
new file mode 100644
index 0000000..6a15b3d
--- /dev/null
+++ b/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb.rl
@@ -0,0 +1,37 @@
+%%{
+ machine date_time;
+
+ include rb_actions "rb_actions.rl";
+ include common "../../common.rl";
+
+ getkey data_unpacked[p];
+
+ main := date_time;
+}%%
+
+module Mail
+ module Parsers
+ module Ragel
+ module DateTimeMachine
+ %%write data;
+
+ def self.parse(data)
+ p = 0
+ eof = data.length
+ stack = []
+
+ actions = []
+ data_unpacked = data.bytes.to_a
+ %%write init;
+ %%write exec;
+
+ if p == eof && cs >= %%{ write first_final; }%%
+ return actions, nil
+ else
+ return [], "Only able to parse up to #{data[0..p]}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb b/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb
new file mode 100644
index 0000000..3da3e46
--- /dev/null
+++ b/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb
@@ -0,0 +1,2129 @@
+
+# line 1 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb.rl"
+
+# line 10 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb.rl"
+
+
+module Mail
+ module Parsers
+ module Ragel
+ module EnvelopeFromMachine
+
+# line 13 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb"
+class << self
+ attr_accessor :_envelope_from_trans_keys
+ private :_envelope_from_trans_keys, :_envelope_from_trans_keys=
+end
+self._envelope_from_trans_keys = [
+ 0, 0, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9,
+ 126, 9, 64, 10, 10,
+ 9, 32, 9, 87, 9, 64,
+ 9, 126, 10, 10, 9,
+ 32, 9, 126, 9, 64,
+ 10, 10, 9, 32, 9, 87,
+ 9, 64, 9, 126, 9,
+ 126, 10, 10, 9, 32,
+ 9, 126, 9, 46, 10, 10,
+ 9, 32, 9, 87, 9,
+ 46, 9, 126, 10, 10,
+ 9, 32, 9, 126, 9, 126,
+ 114, 114, 105, 105, 32,
+ 32, 32, 83, 112, 117,
+ 114, 114, 32, 32, 9, 57,
+ 10, 10, 9, 32, 9,
+ 57, 9, 57, 9, 40,
+ 10, 10, 9, 32, 9, 57,
+ 10, 10, 9, 32, 9,
+ 57, 48, 57, 9, 58,
+ 10, 10, 9, 32, 9, 58,
+ 9, 57, 10, 10, 9,
+ 32, 9, 57, 48, 57,
+ 9, 58, 10, 10, 9, 32,
+ 9, 58, 10, 10, 9,
+ 32, 9, 58, 48, 57,
+ 10, 10, 9, 32, 9, 57,
+ 10, 10, 9, 32, 9,
+ 57, 48, 57, 9, 40,
+ 10, 10, 9, 32, 9, 57,
+ 10, 10, 9, 32, 9,
+ 57, 9, 40, 9, 58,
+ 9, 40, 103, 103, 101, 101,
+ 99, 99, 101, 101, 98,
+ 98, 97, 117, 110, 110,
+ 108, 110, 97, 97, 114, 121,
+ 111, 111, 118, 118, 99,
+ 99, 116, 116, 101, 101,
+ 112, 112, 111, 111, 110, 110,
+ 97, 117, 116, 116, 104,
+ 117, 117, 117, 101, 101,
+ 101, 101, 100, 100, 1, 127,
+ 1, 127, 10, 10, 9,
+ 32, 9, 126, 9, 40,
+ 10, 10, 9, 32, 9, 87,
+ 9, 40, 33, 126, -128,
+ -1, 10, 10, 9, 32,
+ 9, 126, 9, 126, 1, 127,
+ 10, 10, 9, 32, 0,
+ 127, 1, 127, 1, 127,
+ 10, 10, 9, 32, -128, -1,
+ 9, 126, 1, 127, 1,
+ 127, 10, 10, 9, 32,
+ 9, 126, 9, 64, 10, 10,
+ 9, 32, 9, 87, 9,
+ 64, -128, -1, 10, 10,
+ 9, 32, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9,
+ 126, 9, 126, 9, 126,
+ 9, 126, 9, 126, 9, 87,
+ 101, 114, 97, 111, 97,
+ 117, 9, 126, 9, 126,
+ 9, 126, 9, 126, 9, 126,
+ 9, 126, 9, 126, 9,
+ 126, 9, 126, 1, 127,
+ 1, 127, 10, 10, 9, 32,
+ 9, 126, -128, -1, 1,
+ 127, 10, 10, 9, 32,
+ 1, 127, 1, 127, 10, 10,
+ 9, 32, 9, 126, 9,
+ 64, 10, 10, 9, 32,
+ 9, 87, 9, 64, -128, -1,
+ 1, 127, 10, 10, 9,
+ 32, 9, 64, 10, 10,
+ 9, 32, 9, 87, 9, 64,
+ 9, 126, 33, 126, 1,
+ 127, 1, 127, 10, 10,
+ 9, 32, -128, -1, 9, 57,
+ 9, 40, 9, 40, 0,
+ 0, 0
+]
+
+class << self
+ attr_accessor :_envelope_from_key_spans
+ private :_envelope_from_key_spans, :_envelope_from_key_spans=
+end
+self._envelope_from_key_spans = [
+ 0, 118, 118, 1, 24, 118, 56, 1,
+ 24, 79, 56, 118, 1, 24, 118, 56,
+ 1, 24, 79, 56, 118, 118, 1, 24,
+ 118, 38, 1, 24, 79, 38, 118, 1,
+ 24, 118, 118, 1, 1, 1, 52, 6,
+ 1, 1, 49, 1, 24, 49, 49, 32,
+ 1, 24, 49, 1, 24, 49, 10, 50,
+ 1, 24, 50, 49, 1, 24, 49, 10,
+ 50, 1, 24, 50, 1, 24, 50, 10,
+ 1, 24, 49, 1, 24, 49, 10, 32,
+ 1, 24, 49, 1, 24, 49, 32, 50,
+ 32, 1, 1, 1, 1, 1, 21, 1,
+ 3, 1, 8, 1, 1, 1, 1, 1,
+ 1, 1, 1, 21, 1, 14, 1, 1,
+ 1, 1, 127, 127, 1, 24, 118, 32,
+ 1, 24, 79, 32, 94, 128, 1, 24,
+ 118, 118, 127, 1, 24, 128, 127, 127,
+ 1, 24, 128, 118, 127, 127, 1, 24,
+ 118, 56, 1, 24, 79, 56, 128, 1,
+ 24, 118, 118, 1, 24, 118, 118, 118,
+ 118, 118, 79, 14, 15, 21, 118, 118,
+ 118, 118, 118, 118, 118, 118, 118, 127,
+ 127, 1, 24, 118, 128, 127, 1, 24,
+ 127, 127, 1, 24, 118, 56, 1, 24,
+ 79, 56, 128, 127, 1, 24, 56, 1,
+ 24, 79, 56, 118, 94, 127, 127, 1,
+ 24, 128, 49, 32, 32, 0
+]
+
+class << self
+ attr_accessor :_envelope_from_index_offsets
+ private :_envelope_from_index_offsets, :_envelope_from_index_offsets=
+end
+self._envelope_from_index_offsets = [
+ 0, 0, 119, 238, 240, 265, 384, 441,
+ 443, 468, 548, 605, 724, 726, 751, 870,
+ 927, 929, 954, 1034, 1091, 1210, 1329, 1331,
+ 1356, 1475, 1514, 1516, 1541, 1621, 1660, 1779,
+ 1781, 1806, 1925, 2044, 2046, 2048, 2050, 2103,
+ 2110, 2112, 2114, 2164, 2166, 2191, 2241, 2291,
+ 2324, 2326, 2351, 2401, 2403, 2428, 2478, 2489,
+ 2540, 2542, 2567, 2618, 2668, 2670, 2695, 2745,
+ 2756, 2807, 2809, 2834, 2885, 2887, 2912, 2963,
+ 2974, 2976, 3001, 3051, 3053, 3078, 3128, 3139,
+ 3172, 3174, 3199, 3249, 3251, 3276, 3326, 3359,
+ 3410, 3443, 3445, 3447, 3449, 3451, 3453, 3475,
+ 3477, 3481, 3483, 3492, 3494, 3496, 3498, 3500,
+ 3502, 3504, 3506, 3508, 3530, 3532, 3547, 3549,
+ 3551, 3553, 3555, 3683, 3811, 3813, 3838, 3957,
+ 3990, 3992, 4017, 4097, 4130, 4225, 4354, 4356,
+ 4381, 4500, 4619, 4747, 4749, 4774, 4903, 5031,
+ 5159, 5161, 5186, 5315, 5434, 5562, 5690, 5692,
+ 5717, 5836, 5893, 5895, 5920, 6000, 6057, 6186,
+ 6188, 6213, 6332, 6451, 6453, 6478, 6597, 6716,
+ 6835, 6954, 7073, 7153, 7168, 7184, 7206, 7325,
+ 7444, 7563, 7682, 7801, 7920, 8039, 8158, 8277,
+ 8405, 8533, 8535, 8560, 8679, 8808, 8936, 8938,
+ 8963, 9091, 9219, 9221, 9246, 9365, 9422, 9424,
+ 9449, 9529, 9586, 9715, 9843, 9845, 9870, 9927,
+ 9929, 9954, 10034, 10091, 10210, 10305, 10433, 10561,
+ 10563, 10588, 10717, 10767, 10800, 10833
+]
+
+class << self
+ attr_accessor :_envelope_from_indicies
+ private :_envelope_from_indicies, :_envelope_from_indicies=
+end
+self._envelope_from_indicies = [
+ 0, 1, 1, 1, 2, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 0,
+ 3, 4, 3, 3, 3, 3, 3, 5,
+ 1, 3, 3, 1, 3, 6, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 1, 1, 1, 3, 1, 3, 1,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 1, 1, 1, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 1, 7,
+ 1, 1, 1, 8, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 7, 9,
+ 10, 9, 9, 9, 9, 9, 11, 1,
+ 9, 9, 1, 9, 12, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 1, 1, 1, 9, 1, 9, 1, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 1, 1, 1, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 1, 13, 1,
+ 7, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 7,
+ 1, 14, 1, 1, 1, 15, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 16, 17, 18, 17, 17, 17, 17, 17,
+ 19, 1, 17, 17, 1, 17, 20, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 1, 1, 1, 17, 1, 17,
+ 21, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 1, 1, 1, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 1,
+ 22, 1, 1, 1, 23, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 24,
+ 1, 1, 1, 1, 1, 1, 1, 25,
+ 1, 1, 1, 1, 1, 26, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 27,
+ 1, 28, 1, 22, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 22, 1, 22, 1, 1, 1,
+ 23, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 24, 1, 1, 1, 1,
+ 1, 1, 1, 25, 1, 1, 1, 1,
+ 1, 26, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 27, 1, 1, 1, 1,
+ 1, 29, 1, 1, 1, 1, 1, 1,
+ 30, 1, 1, 1, 1, 1, 31, 32,
+ 1, 1, 33, 1, 34, 1, 1, 1,
+ 35, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 36, 1, 1, 1, 1,
+ 1, 1, 1, 37, 1, 1, 1, 1,
+ 1, 38, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 39, 1, 26, 1, 1,
+ 1, 40, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 26, 41, 42, 41,
+ 41, 41, 41, 41, 43, 1, 41, 41,
+ 1, 41, 1, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 1, 1,
+ 1, 41, 1, 41, 1, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 1,
+ 1, 1, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 1, 44, 1, 26, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 26, 1, 45,
+ 1, 1, 1, 46, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 47, 41,
+ 1, 41, 41, 41, 41, 41, 48, 1,
+ 41, 41, 1, 41, 26, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 1, 1, 1, 41, 1, 41, 49, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 1, 1, 1, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 1, 45, 1,
+ 1, 1, 46, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 47, 1, 1,
+ 1, 1, 1, 1, 1, 48, 1, 1,
+ 1, 1, 1, 26, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 49, 1, 50,
+ 1, 45, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 45, 1, 45, 1, 1, 1, 46, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 47, 1, 1, 1, 1, 1, 1,
+ 1, 48, 1, 1, 1, 1, 1, 26,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 49, 1, 1, 1, 1, 1, 29,
+ 1, 1, 1, 1, 1, 1, 30, 1,
+ 1, 1, 1, 1, 31, 32, 1, 1,
+ 33, 1, 51, 1, 1, 1, 52, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 53, 1, 1, 1, 1, 1, 1,
+ 1, 54, 1, 1, 1, 1, 1, 38,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 55, 1, 56, 1, 1, 1, 57,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 56, 58, 59, 58, 58, 58,
+ 58, 58, 60, 1, 58, 58, 1, 58,
+ 61, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 1, 1, 1, 58,
+ 1, 58, 1, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 62, 1, 1,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 1, 63, 1, 1, 1, 64, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 63, 65, 66, 65, 65, 65, 65,
+ 65, 67, 1, 65, 65, 1, 65, 68,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 1, 1, 1, 65, 1,
+ 65, 1, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 69, 1, 1, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 1, 70, 1, 63, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 63, 1, 71, 1, 1, 1,
+ 72, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 73, 65, 66, 65, 65,
+ 65, 65, 65, 74, 1, 65, 65, 1,
+ 65, 75, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 1, 1, 1,
+ 65, 1, 65, 1, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 1, 1,
+ 1, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 1, 71, 1, 1, 1, 72,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 73, 1, 1, 1, 1, 1,
+ 1, 1, 74, 1, 1, 1, 1, 1,
+ 76, 1, 77, 1, 71, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 71, 1, 71, 1, 1,
+ 1, 72, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 73, 1, 1, 1,
+ 1, 1, 1, 1, 74, 1, 1, 1,
+ 1, 1, 76, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 29, 1, 1, 1, 1, 1,
+ 1, 30, 1, 1, 1, 1, 1, 31,
+ 32, 1, 1, 33, 1, 78, 1, 1,
+ 1, 79, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 80, 1, 1, 1,
+ 1, 1, 1, 1, 81, 1, 1, 1,
+ 1, 1, 82, 1, 76, 1, 1, 1,
+ 83, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 76, 84, 1, 84, 84,
+ 84, 84, 84, 85, 1, 84, 84, 1,
+ 84, 1, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 1, 1, 1,
+ 84, 1, 84, 1, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 1, 1,
+ 1, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 1, 86, 1, 76, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 76, 1, 71, 1,
+ 1, 1, 72, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 73, 84, 1,
+ 84, 84, 84, 84, 84, 74, 1, 84,
+ 84, 1, 84, 76, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 1,
+ 1, 1, 84, 1, 84, 1, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84,
+ 1, 1, 1, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 84, 84, 84, 84,
+ 84, 84, 84, 84, 1, 82, 1, 1,
+ 1, 87, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 82, 88, 1, 88,
+ 88, 88, 88, 88, 89, 1, 88, 88,
+ 1, 88, 1, 88, 88, 88, 88, 88,
+ 88, 88, 88, 88, 88, 88, 1, 1,
+ 1, 88, 1, 88, 1, 88, 88, 88,
+ 88, 88, 88, 88, 88, 88, 88, 88,
+ 88, 88, 88, 88, 88, 88, 88, 88,
+ 88, 88, 88, 88, 88, 88, 88, 1,
+ 1, 1, 88, 88, 88, 88, 88, 88,
+ 88, 88, 88, 88, 88, 88, 88, 88,
+ 88, 88, 88, 88, 88, 88, 88, 88,
+ 88, 88, 88, 88, 88, 88, 88, 88,
+ 88, 88, 88, 1, 90, 1, 91, 1,
+ 92, 1, 92, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 93, 1, 1, 94, 1,
+ 95, 1, 1, 1, 96, 1, 1, 97,
+ 98, 99, 1, 1, 1, 100, 1, 101,
+ 1, 1, 1, 1, 102, 1, 103, 1,
+ 104, 1, 104, 1, 1, 1, 105, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 104, 1, 1, 1, 1, 1, 1,
+ 1, 106, 1, 1, 1, 1, 1, 1,
+ 1, 107, 107, 107, 107, 107, 107, 107,
+ 107, 107, 107, 1, 108, 1, 104, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 104, 1, 109,
+ 1, 1, 1, 110, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 109, 1,
+ 1, 1, 1, 1, 1, 1, 111, 1,
+ 1, 1, 1, 1, 1, 1, 112, 112,
+ 112, 112, 112, 112, 112, 112, 112, 112,
+ 1, 113, 1, 1, 1, 114, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 115, 1, 1, 1, 1, 1, 1, 1,
+ 116, 1, 1, 1, 1, 1, 1, 1,
+ 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 1, 113, 1, 1, 1, 114,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 115, 1, 1, 1, 1, 1,
+ 1, 1, 116, 1, 117, 1, 113, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 113, 1, 115,
+ 1, 1, 1, 118, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 115, 1,
+ 1, 1, 1, 1, 1, 1, 119, 1,
+ 1, 1, 1, 1, 1, 1, 120, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120,
+ 1, 121, 1, 115, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 115, 1, 122, 1, 1, 1,
+ 123, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 122, 1, 1, 1, 1,
+ 1, 1, 1, 124, 1, 1, 1, 1,
+ 1, 1, 1, 125, 125, 125, 125, 125,
+ 125, 125, 125, 125, 125, 1, 126, 126,
+ 126, 126, 126, 126, 126, 126, 126, 126,
+ 1, 126, 1, 1, 1, 127, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 126, 1, 1, 1, 1, 1, 1, 1,
+ 128, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 129, 1, 130, 1, 126, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 126, 1, 131,
+ 1, 1, 1, 132, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 131, 1,
+ 1, 1, 1, 1, 1, 1, 133, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 134, 1, 129, 1, 1, 1, 135, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 129, 1, 1, 1, 1, 1, 1,
+ 1, 136, 1, 1, 1, 1, 1, 1,
+ 1, 137, 137, 137, 137, 137, 137, 137,
+ 137, 137, 137, 1, 138, 1, 129, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 129, 1, 134,
+ 1, 1, 1, 139, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 134, 1,
+ 1, 1, 1, 1, 1, 1, 140, 1,
+ 1, 1, 1, 1, 1, 1, 141, 141,
+ 141, 141, 141, 141, 141, 141, 141, 141,
+ 1, 142, 142, 142, 142, 142, 142, 142,
+ 142, 142, 142, 1, 142, 1, 1, 1,
+ 143, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 144, 1, 1, 1, 1,
+ 1, 1, 1, 145, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 146, 1, 147,
+ 1, 142, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 142, 1, 144, 1, 1, 1, 148, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 144, 1, 1, 1, 1, 1, 1,
+ 1, 149, 1, 1, 1, 1, 1, 1,
+ 1, 150, 150, 150, 150, 150, 150, 150,
+ 150, 150, 150, 146, 1, 151, 1, 144,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 144, 1,
+ 152, 1, 1, 1, 153, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 152,
+ 1, 1, 1, 1, 1, 1, 1, 154,
+ 1, 1, 1, 1, 1, 1, 1, 155,
+ 155, 155, 155, 155, 155, 155, 155, 155,
+ 155, 156, 1, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 1, 158, 1,
+ 159, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 159,
+ 1, 146, 1, 1, 1, 160, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 146, 1, 1, 1, 1, 1, 1, 1,
+ 161, 1, 1, 1, 1, 1, 1, 1,
+ 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 1, 163, 1, 146, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 146, 1, 156, 1,
+ 1, 1, 164, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 156, 1, 1,
+ 1, 1, 1, 1, 1, 165, 1, 1,
+ 1, 1, 1, 1, 1, 166, 166, 166,
+ 166, 166, 166, 166, 166, 166, 166, 1,
+ 167, 167, 167, 167, 167, 167, 167, 167,
+ 167, 167, 1, 167, 1, 1, 1, 168,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 169, 1, 1, 1, 1, 1,
+ 1, 1, 170, 1, 171, 1, 167, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 167, 1, 169,
+ 1, 1, 1, 172, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 169, 1,
+ 1, 1, 1, 1, 1, 1, 173, 1,
+ 1, 1, 1, 1, 1, 1, 150, 150,
+ 150, 150, 150, 150, 150, 150, 150, 150,
+ 1, 174, 1, 169, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 169, 1, 175, 1, 1, 1,
+ 176, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 175, 1, 1, 1, 1,
+ 1, 1, 1, 177, 1, 1, 1, 1,
+ 1, 1, 1, 155, 155, 155, 155, 155,
+ 155, 155, 155, 155, 155, 1, 178, 1,
+ 1, 1, 179, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 175, 1, 1,
+ 1, 1, 1, 1, 1, 180, 1, 181,
+ 1, 1, 1, 182, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 152, 1,
+ 1, 1, 1, 1, 1, 1, 183, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 156, 1, 184, 1, 1, 1, 185, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 122, 1, 1, 1, 1, 1, 1,
+ 1, 186, 1, 103, 1, 187, 1, 103,
+ 1, 188, 1, 103, 1, 189, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 190, 1, 103, 1, 103, 1, 103,
+ 1, 191, 1, 103, 1, 1, 1, 1,
+ 1, 1, 103, 1, 192, 1, 103, 1,
+ 193, 1, 103, 1, 194, 1, 103, 1,
+ 195, 1, 91, 1, 196, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 195, 1, 91, 1, 197, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 198, 1, 91, 1, 91, 1, 199,
+ 1, 91, 1, 200, 200, 200, 200, 200,
+ 200, 200, 200, 66, 1, 200, 200, 201,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 66, 200, 1, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 202, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 1, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 1, 200, 200, 203,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 204, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 202, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 1, 205, 1, 200, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 200, 1, 206, 1,
+ 1, 1, 207, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 208, 204, 66,
+ 204, 204, 204, 204, 204, 209, 1, 204,
+ 204, 1, 204, 68, 204, 204, 204, 204,
+ 204, 204, 204, 204, 204, 204, 204, 1,
+ 1, 1, 204, 1, 204, 1, 204, 204,
+ 204, 204, 204, 204, 204, 204, 204, 204,
+ 204, 204, 204, 204, 204, 204, 204, 204,
+ 204, 204, 204, 204, 204, 204, 204, 204,
+ 1, 1, 1, 204, 204, 204, 204, 204,
+ 204, 204, 204, 204, 204, 204, 204, 204,
+ 204, 204, 204, 204, 204, 204, 204, 204,
+ 204, 204, 204, 204, 204, 204, 204, 204,
+ 204, 204, 204, 204, 1, 206, 1, 1,
+ 1, 207, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 208, 1, 1, 1,
+ 1, 1, 1, 1, 209, 1, 210, 1,
+ 206, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 206,
+ 1, 206, 1, 1, 1, 207, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 208, 1, 1, 1, 1, 1, 1, 1,
+ 209, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 29, 1,
+ 1, 1, 1, 1, 1, 30, 1, 1,
+ 1, 1, 1, 31, 32, 1, 1, 33,
+ 1, 211, 1, 1, 1, 212, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 213, 1, 1, 1, 1, 1, 1, 1,
+ 214, 1, 204, 66, 204, 204, 204, 204,
+ 204, 1, 1, 204, 204, 1, 204, 68,
+ 204, 204, 204, 204, 204, 204, 204, 204,
+ 204, 204, 204, 1, 1, 1, 204, 1,
+ 204, 1, 204, 204, 204, 204, 204, 204,
+ 204, 204, 204, 204, 204, 204, 204, 204,
+ 204, 204, 204, 204, 204, 204, 204, 204,
+ 204, 204, 204, 204, 1, 1, 1, 204,
+ 204, 204, 204, 204, 204, 204, 204, 204,
+ 204, 204, 204, 204, 204, 204, 204, 204,
+ 204, 204, 204, 204, 204, 204, 204, 204,
+ 204, 204, 204, 204, 204, 204, 204, 204,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 200, 215, 1, 66, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 66, 1, 76, 1, 1,
+ 1, 83, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 76, 65, 66, 65,
+ 65, 65, 65, 65, 85, 1, 65, 65,
+ 1, 65, 68, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 1, 1,
+ 1, 65, 1, 65, 1, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 1,
+ 1, 1, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 1, 216, 1, 1, 1,
+ 217, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 216, 218, 219, 218, 218,
+ 218, 218, 218, 220, 1, 218, 218, 1,
+ 218, 221, 218, 218, 218, 218, 218, 218,
+ 218, 218, 218, 218, 218, 1, 1, 1,
+ 218, 1, 218, 1, 218, 218, 218, 218,
+ 218, 218, 218, 218, 218, 218, 218, 218,
+ 218, 218, 218, 218, 218, 218, 218, 218,
+ 218, 218, 218, 218, 218, 218, 222, 1,
+ 1, 218, 218, 218, 218, 218, 218, 218,
+ 218, 218, 218, 218, 218, 218, 218, 218,
+ 218, 218, 218, 218, 218, 218, 218, 218,
+ 218, 218, 218, 218, 218, 218, 218, 218,
+ 218, 218, 1, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 1, 69, 69, 223,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 1, 224, 206,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 1, 225, 1, 69, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 69, 1, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 69, 69, 69, 1, 226,
+ 226, 226, 226, 226, 226, 226, 226, 226,
+ 1, 226, 226, 227, 226, 226, 226, 226,
+ 226, 226, 226, 226, 226, 226, 226, 226,
+ 226, 226, 226, 226, 226, 226, 226, 226,
+ 228, 226, 226, 226, 226, 226, 226, 226,
+ 226, 226, 226, 226, 226, 226, 226, 226,
+ 226, 226, 226, 226, 226, 226, 226, 226,
+ 226, 226, 226, 226, 226, 226, 226, 226,
+ 226, 226, 226, 226, 226, 226, 226, 226,
+ 226, 226, 226, 226, 226, 226, 226, 226,
+ 226, 226, 226, 226, 226, 226, 226, 226,
+ 226, 226, 229, 226, 226, 226, 226, 226,
+ 226, 226, 226, 226, 226, 226, 226, 226,
+ 226, 226, 226, 226, 226, 226, 226, 226,
+ 226, 226, 226, 226, 226, 226, 226, 226,
+ 226, 226, 226, 226, 226, 226, 1, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 1, 230, 230, 231, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 232, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 233, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 1, 234,
+ 1, 230, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 230, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 230, 38, 1, 1, 1, 235,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 38, 236, 237, 236, 236, 236,
+ 236, 236, 238, 1, 236, 236, 1, 236,
+ 1, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 1, 1, 1, 236,
+ 1, 236, 1, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 1, 1, 1,
+ 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 1, 239, 239, 239, 239, 239, 239,
+ 239, 239, 18, 1, 239, 239, 240, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 18, 239, 1, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 241, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 1, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 1, 239, 239, 242, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 243, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 241, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 239, 239, 239, 239, 239, 239, 239,
+ 239, 1, 244, 1, 239, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 239, 1, 245, 1, 1,
+ 1, 246, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 247, 243, 18, 243,
+ 243, 243, 243, 243, 248, 1, 243, 243,
+ 1, 243, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 1, 1,
+ 1, 243, 1, 243, 21, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 1,
+ 1, 1, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 1, 249, 1, 1, 1,
+ 250, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 251, 1, 1, 1, 1,
+ 1, 1, 1, 252, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 27, 1, 253, 1, 249,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 249, 1,
+ 249, 1, 1, 1, 250, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 251,
+ 1, 1, 1, 1, 1, 1, 1, 252,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 27,
+ 1, 1, 1, 1, 1, 29, 1, 1,
+ 1, 1, 1, 1, 30, 1, 1, 1,
+ 1, 1, 31, 32, 1, 1, 33, 1,
+ 254, 1, 1, 1, 255, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 256,
+ 1, 1, 1, 1, 1, 1, 1, 257,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 39,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 239, 258, 1, 18, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 18, 1, 259, 1, 1,
+ 1, 260, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 261, 17, 262, 17,
+ 17, 17, 17, 17, 263, 1, 17, 17,
+ 1, 17, 243, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 1, 1,
+ 1, 17, 1, 17, 21, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 1,
+ 1, 1, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 1, 264, 1, 1, 1,
+ 265, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 266, 41, 42, 41, 41,
+ 41, 41, 41, 267, 1, 41, 41, 1,
+ 41, 1, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 1, 1, 1,
+ 41, 1, 41, 27, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 1, 1,
+ 1, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 1, 268, 1, 264, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 264, 1, 264, 1,
+ 1, 1, 265, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 266, 41, 42,
+ 41, 41, 41, 41, 41, 267, 1, 41,
+ 41, 1, 41, 1, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 1,
+ 1, 1, 41, 1, 41, 27, 41, 41,
+ 41, 41, 41, 269, 41, 41, 41, 41,
+ 41, 41, 270, 41, 41, 41, 41, 41,
+ 271, 272, 41, 41, 273, 41, 41, 41,
+ 1, 1, 1, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 1, 274, 1, 1,
+ 1, 275, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 276, 236, 237, 236,
+ 236, 236, 236, 236, 277, 1, 236, 236,
+ 1, 236, 1, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 1, 1,
+ 1, 236, 1, 236, 39, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 1,
+ 1, 1, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 236, 236, 236, 236, 236,
+ 236, 236, 236, 1, 45, 1, 1, 1,
+ 46, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 47, 41, 1, 41, 41,
+ 41, 41, 41, 48, 1, 41, 41, 1,
+ 41, 26, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 1, 1, 1,
+ 41, 1, 41, 49, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 1, 1,
+ 1, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 278, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 1, 45, 1, 1, 1, 46,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 47, 41, 1, 41, 41, 41,
+ 41, 41, 48, 1, 41, 41, 1, 41,
+ 26, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 1, 1, 1, 41,
+ 1, 41, 49, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 1, 1, 1,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 279, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 1, 45, 1, 1, 1, 46, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 280, 41, 1, 41, 41, 41, 41,
+ 41, 48, 1, 41, 41, 1, 41, 26,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 1, 1, 1, 41, 1,
+ 41, 49, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 1, 1, 1, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 1, 45, 1, 1, 1, 46, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 280, 1, 1, 1, 1, 1, 1, 1,
+ 48, 1, 1, 1, 1, 1, 26, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 49, 93, 1, 1, 94, 1, 281, 1,
+ 1, 1, 96, 1, 1, 282, 98, 99,
+ 1, 1, 1, 283, 32, 1, 1, 33,
+ 1, 188, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 90, 1,
+ 191, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 195, 1,
+ 196, 1, 1, 1, 194, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 195, 1, 45, 1,
+ 1, 1, 46, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 47, 41, 1,
+ 41, 41, 41, 41, 41, 48, 1, 41,
+ 41, 1, 41, 26, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 1,
+ 1, 1, 41, 1, 41, 49, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 1, 1, 1, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 284, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 1, 45, 1, 1,
+ 1, 46, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 47, 41, 1, 41,
+ 41, 41, 41, 41, 48, 1, 41, 41,
+ 1, 41, 26, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 1, 1,
+ 1, 41, 1, 41, 49, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 1,
+ 1, 1, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 279, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 1, 45, 1, 1, 1,
+ 46, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 47, 41, 1, 41, 41,
+ 41, 41, 41, 48, 1, 41, 41, 1,
+ 41, 26, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 1, 1, 1,
+ 41, 1, 41, 49, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 1, 1,
+ 1, 41, 41, 41, 285, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 284, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 1, 45, 1, 1, 1, 46,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 47, 41, 1, 41, 41, 41,
+ 41, 41, 48, 1, 41, 41, 1, 41,
+ 26, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 1, 1, 1, 41,
+ 1, 41, 49, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 1, 1, 1,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 279, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 1, 45, 1, 1, 1, 46, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 47, 41, 1, 41, 41, 41, 41,
+ 41, 48, 1, 41, 41, 1, 41, 26,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 1, 1, 1, 41, 1,
+ 41, 49, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 1, 1, 1, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 286, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 287, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 1, 45, 1, 1, 1, 46, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 47, 41, 1, 41, 41, 41, 41, 41,
+ 48, 1, 41, 41, 1, 41, 26, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 1, 1, 1, 41, 1, 41,
+ 49, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 1, 1, 1, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 279, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 1,
+ 45, 1, 1, 1, 46, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 47,
+ 41, 1, 41, 41, 41, 41, 41, 48,
+ 1, 41, 41, 1, 41, 26, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 1, 1, 1, 41, 1, 41, 49,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 1, 1, 1, 41, 41, 41,
+ 41, 41, 41, 41, 279, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 1, 45,
+ 1, 1, 1, 46, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 47, 41,
+ 1, 41, 41, 41, 41, 41, 48, 1,
+ 41, 41, 1, 41, 26, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 1, 1, 1, 41, 1, 41, 49, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 1, 1, 1, 41, 41, 41, 41,
+ 41, 41, 41, 288, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 1, 45, 1,
+ 1, 1, 46, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 47, 41, 1,
+ 41, 41, 41, 41, 41, 48, 1, 41,
+ 41, 1, 41, 26, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 1,
+ 1, 1, 41, 1, 41, 49, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 1, 1, 1, 41, 41, 41, 41, 41,
+ 41, 279, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 1, 289, 289, 289,
+ 289, 289, 289, 289, 289, 290, 1, 289,
+ 289, 291, 289, 289, 289, 289, 289, 289,
+ 289, 289, 289, 289, 289, 289, 289, 289,
+ 289, 289, 289, 289, 290, 289, 228, 289,
+ 289, 289, 289, 289, 289, 289, 289, 289,
+ 289, 289, 289, 289, 289, 289, 289, 289,
+ 289, 289, 289, 289, 289, 289, 289, 289,
+ 289, 289, 289, 289, 289, 289, 289, 289,
+ 289, 289, 289, 289, 289, 289, 289, 289,
+ 289, 289, 289, 289, 289, 289, 289, 289,
+ 289, 289, 289, 289, 289, 289, 289, 289,
+ 292, 289, 289, 289, 289, 289, 289, 289,
+ 289, 289, 289, 289, 289, 289, 289, 289,
+ 289, 289, 289, 289, 289, 289, 289, 289,
+ 289, 289, 289, 289, 289, 289, 289, 289,
+ 289, 289, 289, 289, 1, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 1, 293,
+ 293, 294, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 295, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293,
+ 296, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 1, 297, 1, 293,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 293, 1,
+ 14, 1, 1, 1, 15, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 16,
+ 243, 18, 243, 243, 243, 243, 243, 19,
+ 1, 243, 243, 1, 243, 20, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243,
+ 243, 1, 1, 1, 243, 1, 243, 21,
+ 243, 243, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243,
+ 243, 243, 1, 1, 1, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293,
+ 298, 1, 293, 293, 299, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 298,
+ 293, 232, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 296, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 293, 293, 293, 293, 1,
+ 300, 1, 298, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 298, 1, 301, 301, 301, 301, 301,
+ 301, 301, 301, 302, 1, 301, 301, 303,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 302, 301, 304, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 305, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 1, 306, 306, 306, 306, 306,
+ 306, 306, 306, 306, 1, 306, 306, 307,
+ 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 306, 306, 308, 306, 306, 306,
+ 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 306, 306, 306, 306, 309, 306,
+ 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 1, 310, 1, 306, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 306, 1, 311, 1,
+ 1, 1, 312, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 313, 243, 18,
+ 243, 243, 243, 243, 243, 314, 1, 243,
+ 243, 1, 243, 20, 243, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 1,
+ 1, 1, 243, 1, 243, 315, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243,
+ 1, 1, 1, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 1, 316, 1, 1,
+ 1, 317, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 318, 1, 1, 1,
+ 1, 1, 1, 1, 319, 1, 1, 1,
+ 1, 1, 26, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 320, 1, 321, 1,
+ 316, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 316,
+ 1, 316, 1, 1, 1, 317, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 318, 1, 1, 1, 1, 1, 1, 1,
+ 319, 1, 1, 1, 1, 1, 26, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 320, 1, 1, 1, 1, 1, 29, 1,
+ 1, 1, 1, 1, 1, 30, 1, 1,
+ 1, 1, 1, 31, 32, 1, 1, 33,
+ 1, 322, 1, 1, 1, 323, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 324, 1, 1, 1, 1, 1, 1, 1,
+ 325, 1, 1, 1, 1, 1, 38, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 326, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 306, 306, 306, 306, 306, 306,
+ 306, 306, 306, 327, 1, 306, 306, 328,
+ 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 327, 306, 329, 306, 306, 306,
+ 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 306, 306, 306, 306, 309, 306,
+ 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 306, 306, 306, 306, 306, 306,
+ 306, 306, 1, 330, 1, 327, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 327, 1, 331, 1,
+ 1, 1, 332, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 333, 1, 1,
+ 1, 1, 1, 1, 1, 334, 1, 1,
+ 1, 1, 1, 26, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 335, 1, 336,
+ 1, 331, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 331, 1, 331, 1, 1, 1, 332, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 333, 1, 1, 1, 1, 1, 1,
+ 1, 334, 1, 1, 1, 1, 1, 26,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 335, 1, 1, 1, 1, 1, 29,
+ 1, 1, 1, 1, 1, 1, 30, 1,
+ 1, 1, 1, 1, 31, 32, 1, 1,
+ 33, 1, 337, 1, 1, 1, 338, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 339, 1, 1, 1, 1, 1, 1,
+ 1, 340, 1, 1, 1, 1, 1, 38,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 341, 1, 342, 1, 1, 1, 343,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 342, 344, 345, 344, 344, 344,
+ 344, 344, 346, 1, 344, 344, 1, 344,
+ 347, 344, 344, 344, 344, 344, 344, 344,
+ 344, 344, 344, 344, 1, 1, 1, 344,
+ 1, 344, 1, 344, 344, 344, 344, 344,
+ 344, 344, 344, 344, 344, 344, 344, 344,
+ 344, 344, 344, 344, 344, 344, 344, 344,
+ 344, 344, 344, 344, 344, 1, 1, 1,
+ 344, 344, 344, 344, 344, 344, 344, 344,
+ 344, 344, 344, 344, 344, 344, 344, 344,
+ 344, 344, 344, 344, 344, 344, 344, 344,
+ 344, 344, 344, 344, 344, 344, 344, 344,
+ 344, 1, 243, 18, 243, 243, 243, 243,
+ 243, 1, 1, 243, 243, 1, 243, 348,
+ 243, 243, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 1, 1, 1, 243, 1,
+ 243, 1, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 1, 1, 1, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243,
+ 243, 243, 243, 243, 243, 243, 243, 243,
+ 1, 349, 349, 349, 349, 349, 349, 349,
+ 349, 349, 1, 349, 349, 350, 349, 349,
+ 349, 349, 349, 349, 349, 349, 349, 349,
+ 349, 349, 349, 349, 349, 349, 349, 349,
+ 349, 349, 349, 349, 349, 349, 349, 349,
+ 351, 352, 349, 349, 349, 349, 349, 349,
+ 349, 349, 349, 349, 349, 349, 349, 349,
+ 349, 349, 349, 349, 349, 349, 349, 349,
+ 349, 349, 349, 349, 349, 349, 349, 349,
+ 349, 349, 349, 349, 349, 349, 349, 349,
+ 349, 349, 349, 349, 349, 349, 349, 349,
+ 349, 349, 349, 349, 353, 349, 349, 349,
+ 349, 349, 349, 349, 349, 349, 349, 349,
+ 349, 349, 349, 349, 349, 349, 349, 349,
+ 349, 349, 349, 349, 349, 349, 349, 349,
+ 349, 349, 349, 349, 349, 349, 349, 349,
+ 1, 354, 354, 354, 354, 354, 354, 354,
+ 354, 354, 1, 354, 354, 355, 354, 354,
+ 354, 354, 354, 354, 354, 354, 354, 354,
+ 354, 354, 354, 354, 354, 354, 354, 354,
+ 354, 354, 354, 354, 354, 354, 354, 354,
+ 356, 357, 354, 354, 354, 354, 354, 354,
+ 354, 354, 354, 354, 354, 354, 354, 354,
+ 354, 354, 354, 354, 354, 354, 354, 354,
+ 354, 354, 354, 354, 354, 354, 354, 354,
+ 354, 354, 354, 354, 354, 354, 354, 354,
+ 354, 354, 354, 354, 354, 354, 354, 354,
+ 354, 354, 354, 354, 358, 354, 354, 354,
+ 354, 354, 354, 354, 354, 354, 354, 354,
+ 354, 354, 354, 354, 354, 354, 354, 354,
+ 354, 354, 354, 354, 354, 354, 354, 354,
+ 354, 354, 354, 354, 354, 354, 354, 354,
+ 1, 359, 1, 354, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 354, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 354, 159, 1, 1,
+ 1, 360, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 159, 1, 1, 1,
+ 1, 1, 1, 1, 361, 1, 1, 1,
+ 1, 1, 1, 1, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 1, 159,
+ 1, 1, 1, 360, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 159, 1,
+ 1, 1, 1, 1, 1, 1, 361, 1,
+ 362, 1, 1, 1, 363, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 362,
+ 1, 1, 1, 1, 1, 1, 1, 364,
+ 1, 1, 0
+]
+
+class << self
+ attr_accessor :_envelope_from_trans_targs
+ private :_envelope_from_trans_targs, :_envelope_from_trans_targs=
+end
+self._envelope_from_trans_targs = [
+ 2, 0, 3, 5, 184, 203, 204, 2,
+ 3, 5, 184, 203, 204, 4, 6, 7,
+ 9, 5, 140, 10, 153, 20, 6, 7,
+ 9, 10, 11, 20, 8, 35, 105, 107,
+ 109, 112, 6, 7, 9, 10, 11, 20,
+ 12, 14, 134, 139, 13, 15, 16, 18,
+ 19, 20, 17, 15, 16, 18, 19, 20,
+ 21, 22, 24, 114, 129, 124, 130, 21,
+ 22, 24, 114, 129, 124, 130, 23, 25,
+ 26, 28, 29, 128, 30, 27, 25, 26,
+ 28, 29, 30, 31, 33, 34, 32, 31,
+ 33, 34, 36, 37, 38, 39, 90, 92,
+ 94, 97, 99, 101, 103, 40, 89, 41,
+ 42, 43, 45, 46, 44, 42, 43, 45,
+ 46, 47, 48, 50, 88, 49, 51, 53,
+ 54, 52, 50, 51, 53, 54, 55, 56,
+ 58, 59, 57, 55, 56, 58, 59, 60,
+ 62, 63, 61, 60, 62, 63, 64, 65,
+ 67, 87, 74, 66, 68, 70, 71, 69,
+ 67, 68, 70, 71, 74, 210, 73, 211,
+ 75, 77, 78, 76, 75, 77, 78, 79,
+ 80, 82, 86, 81, 83, 85, 84, 82,
+ 83, 85, 79, 80, 86, 64, 65, 87,
+ 47, 48, 88, 91, 93, 95, 96, 98,
+ 100, 102, 104, 106, 108, 110, 111, 113,
+ 115, 126, 125, 116, 118, 117, 119, 120,
+ 122, 123, 121, 119, 120, 122, 123, 127,
+ 21, 22, 24, 114, 129, 124, 130, 131,
+ 133, 132, 135, 136, 15, 138, 135, 136,
+ 15, 138, 137, 12, 14, 134, 139, 141,
+ 151, 150, 142, 144, 143, 145, 146, 148,
+ 149, 145, 146, 148, 149, 147, 145, 146,
+ 148, 149, 152, 154, 155, 157, 175, 158,
+ 154, 155, 157, 158, 156, 159, 166, 168,
+ 170, 173, 154, 155, 157, 158, 160, 161,
+ 162, 163, 164, 165, 167, 169, 171, 172,
+ 174, 176, 181, 182, 180, 176, 177, 179,
+ 180, 178, 181, 182, 183, 185, 195, 196,
+ 198, 194, 185, 186, 188, 194, 187, 189,
+ 190, 192, 193, 20, 189, 190, 192, 193,
+ 20, 191, 189, 190, 192, 193, 20, 195,
+ 196, 198, 197, 198, 199, 201, 202, 20,
+ 200, 198, 199, 201, 202, 20, 2, 3,
+ 5, 184, 203, 204, 204, 206, 207, 206,
+ 213, 209, 206, 207, 206, 213, 209, 208,
+ 72, 212, 211, 72, 212
+]
+
+class << self
+ attr_accessor :_envelope_from_trans_actions
+ private :_envelope_from_trans_actions, :_envelope_from_trans_actions=
+end
+self._envelope_from_trans_actions = [
+ 1, 0, 1, 1, 1, 2, 1, 0,
+ 0, 3, 3, 4, 3, 0, 5, 5,
+ 6, 0, 0, 7, 0, 8, 0, 0,
+ 9, 4, 0, 10, 0, 11, 11, 11,
+ 11, 11, 12, 12, 13, 14, 12, 15,
+ 0, 0, 0, 4, 0, 0, 0, 16,
+ 4, 0, 0, 12, 12, 17, 14, 12,
+ 18, 18, 18, 18, 19, 18, 18, 0,
+ 0, 0, 0, 4, 0, 0, 0, 0,
+ 0, 20, 4, 0, 0, 0, 12, 12,
+ 21, 14, 12, 0, 0, 4, 0, 12,
+ 12, 14, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 4, 0, 0, 12, 12, 14,
+ 12, 0, 0, 0, 4, 0, 0, 4,
+ 0, 0, 12, 12, 14, 12, 0, 0,
+ 4, 0, 0, 12, 12, 14, 12, 0,
+ 4, 0, 0, 12, 14, 12, 0, 0,
+ 0, 4, 0, 0, 0, 4, 0, 0,
+ 12, 12, 14, 12, 12, 0, 0, 0,
+ 0, 4, 0, 0, 12, 14, 12, 0,
+ 0, 0, 4, 0, 0, 4, 0, 12,
+ 12, 14, 12, 12, 14, 12, 12, 14,
+ 12, 12, 14, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 20, 4, 0, 12, 12, 21, 14, 0,
+ 12, 12, 12, 12, 14, 12, 12, 0,
+ 0, 0, 22, 22, 23, 22, 0, 0,
+ 24, 0, 0, 12, 12, 12, 14, 0,
+ 0, 0, 0, 0, 0, 5, 5, 6,
+ 7, 0, 0, 9, 4, 0, 12, 12,
+ 13, 14, 0, 5, 5, 6, 0, 7,
+ 0, 0, 9, 4, 0, 11, 11, 11,
+ 11, 11, 12, 12, 13, 14, 0, 0,
+ 16, 11, 11, 11, 0, 0, 0, 0,
+ 0, 22, 22, 22, 22, 0, 0, 24,
+ 0, 0, 0, 0, 0, 22, 22, 22,
+ 23, 22, 0, 0, 24, 0, 0, 5,
+ 5, 25, 7, 26, 0, 0, 27, 4,
+ 28, 0, 12, 12, 29, 14, 30, 0,
+ 0, 24, 0, 0, 0, 31, 4, 32,
+ 0, 12, 12, 33, 14, 34, 12, 12,
+ 35, 35, 14, 35, 0, 36, 36, 37,
+ 38, 36, 0, 0, 4, 39, 0, 0,
+ 0, 4, 12, 12, 14
+]
+
+class << self
+ attr_accessor :_envelope_from_eof_actions
+ private :_envelope_from_eof_actions, :_envelope_from_eof_actions=
+end
+self._envelope_from_eof_actions = [
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 40, 40, 41, 0
+]
+
+class << self
+ attr_accessor :envelope_from_start
+end
+self.envelope_from_start = 1;
+class << self
+ attr_accessor :envelope_from_first_final
+end
+self.envelope_from_first_final = 210;
+class << self
+ attr_accessor :envelope_from_error
+end
+self.envelope_from_error = 0;
+
+class << self
+ attr_accessor :envelope_from_en_comment_tail
+end
+self.envelope_from_en_comment_tail = 205;
+class << self
+ attr_accessor :envelope_from_en_main
+end
+self.envelope_from_en_main = 1;
+
+
+# line 17 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb.rl"
+
+ def self.parse(data)
+ p = 0
+ eof = data.length
+ stack = []
+
+ actions = []
+ data_unpacked = data.bytes.to_a
+
+# line 1705 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb"
+begin
+ p ||= 0
+ pe ||= data.length
+ cs = envelope_from_start
+ top = 0
+end
+
+# line 26 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb.rl"
+
+# line 1715 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb"
+begin
+ testEof = false
+ _slen, _trans, _keys, _inds, _acts, _nacts = nil
+ _goto_level = 0
+ _resume = 10
+ _eof_trans = 15
+ _again = 20
+ _test_eof = 30
+ _out = 40
+ while true
+ if _goto_level <= 0
+ if p == pe
+ _goto_level = _test_eof
+ next
+ end
+ if cs == 0
+ _goto_level = _out
+ next
+ end
+ end
+ if _goto_level <= _resume
+ _keys = cs << 1
+ _inds = _envelope_from_index_offsets[cs]
+ _slen = _envelope_from_key_spans[cs]
+ _trans = if ( _slen > 0 &&
+ _envelope_from_trans_keys[_keys] <= ( data_unpacked[p]) &&
+ ( data_unpacked[p]) <= _envelope_from_trans_keys[_keys + 1]
+ ) then
+ _envelope_from_indicies[ _inds + ( data_unpacked[p]) - _envelope_from_trans_keys[_keys] ]
+ else
+ _envelope_from_indicies[ _inds + _slen ]
+ end
+ cs = _envelope_from_trans_targs[_trans]
+ if _envelope_from_trans_actions[_trans] != 0
+ case _envelope_from_trans_actions[_trans]
+ when 16 then
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 12 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+ when 36 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+ when 11 then
+# line 10 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(7, p) end
+ when 18 then
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 10 then
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+ when 5 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+ when 3 then
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+ when 32 then
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+ when 24 then
+# line 41 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(38, p) end
+ when 22 then
+# line 42 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(39, p) end
+ when 4 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 205
+ _goto_level = _again
+ next
+ end
+ end
+ when 39 then
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ top -= 1
+ cs = stack[top]
+ _goto_level = _again
+ next
+ end
+ end
+ when 1 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(2, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+ when 17 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 15 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+ when 35 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+ when 34 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+ when 14 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 205
+ _goto_level = _again
+ next
+ end
+ end
+ when 37 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 205
+ _goto_level = _again
+ next
+ end
+ end
+ when 38 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ top -= 1
+ cs = stack[top]
+ _goto_level = _again
+ next
+ end
+ end
+ when 20 then
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 19 then
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 205
+ _goto_level = _again
+ next
+ end
+ end
+ when 9 then
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 28 then
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+ when 8 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+ when 7 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 205
+ _goto_level = _again
+ next
+ end
+ end
+ when 31 then
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 23 then
+# line 42 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(39, p) end
+# line 41 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(38, p) end
+ when 2 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(2, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 205
+ _goto_level = _again
+ next
+ end
+ end
+ when 21 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 13 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 30 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+ when 33 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 27 then
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 6 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 26 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+ when 29 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+ when 25 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 4 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(1, p) end
+# line 2075 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb"
+ end
+ end
+ end
+ if _goto_level <= _again
+ if cs == 0
+ _goto_level = _out
+ next
+ end
+ p += 1
+ if p != pe
+ _goto_level = _resume
+ next
+ end
+ end
+ if _goto_level <= _test_eof
+ if p == eof
+ case _envelope_from_eof_actions[cs]
+ when 40 then
+# line 9 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(6, p) end
+ when 41 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 9 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(6, p) end
+# line 2104 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb"
+ end
+ end
+
+ end
+ if _goto_level <= _out
+ break
+ end
+end
+ end
+
+# line 27 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb.rl"
+
+ if p == eof && cs >=
+# line 2118 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb"
+210
+# line 28 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb.rl"
+
+ return actions, nil
+ else
+ return [], "Only able to parse up to #{data[0..p]}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb.rl b/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb.rl
new file mode 100644
index 0000000..223ae95
--- /dev/null
+++ b/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb.rl
@@ -0,0 +1,37 @@
+%%{
+ machine envelope_from;
+
+ include rb_actions "rb_actions.rl";
+ include common "../../common.rl";
+
+ getkey data_unpacked[p];
+
+ main := envelope_from;
+}%%
+
+module Mail
+ module Parsers
+ module Ragel
+ module EnvelopeFromMachine
+ %%write data;
+
+ def self.parse(data)
+ p = 0
+ eof = data.length
+ stack = []
+
+ actions = []
+ data_unpacked = data.bytes.to_a
+ %%write init;
+ %%write exec;
+
+ if p == eof && cs >= %%{ write first_final; }%%
+ return actions, nil
+ else
+ return [], "Only able to parse up to #{data[0..p]}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb b/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb
new file mode 100644
index 0000000..c539f73
--- /dev/null
+++ b/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb
@@ -0,0 +1,1570 @@
+
+# line 1 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb.rl"
+
+# line 10 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb.rl"
+
+
+module Mail
+ module Parsers
+ module Ragel
+ module MessageIdsMachine
+
+# line 13 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb"
+class << self
+ attr_accessor :_message_ids_trans_keys
+ private :_message_ids_trans_keys, :_message_ids_trans_keys=
+end
+self._message_ids_trans_keys = [
+ 0, 0, 9, 60, 10, 10,
+ 9, 32, 9, 60, 9,
+ 126, 9, 126, 10, 10,
+ 9, 32, 9, 126, 9, 64,
+ 10, 10, 9, 32, 9,
+ 64, 9, 126, 10, 10,
+ 9, 32, 9, 126, 9, 64,
+ 10, 10, 9, 32, 9,
+ 64, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9, 126,
+ 9, 62, 10, 10, 9,
+ 32, 9, 62, 9, 126,
+ 10, 10, 9, 32, 9, 126,
+ 10, 10, 9, 32, 9,
+ 126, 1, 127, 1, 127,
+ 10, 10, 9, 32, 9, 126,
+ 9, 62, 10, 10, 9,
+ 32, 9, 62, 33, 126,
+ -128, -1, 10, 10, 9, 32,
+ 9, 126, 9, 126, 1,
+ 127, 10, 10, 9, 32,
+ 0, 127, 9, 126, 9, 126,
+ 33, 126, 33, 126, 1,
+ 127, 1, 127, 10, 10,
+ 9, 32, -128, -1, 9, 126,
+ 1, 127, 1, 127, 10,
+ 10, 9, 32, 9, 126,
+ 9, 64, 10, 10, 9, 32,
+ 9, 64, -128, -1, 10,
+ 10, 9, 32, 9, 126,
+ 9, 126, 10, 10, 9, 32,
+ 9, 126, 1, 127, 1,
+ 127, 10, 10, 9, 32,
+ 9, 126, -128, -1, 1, 127,
+ 10, 10, 9, 32, 1,
+ 127, 1, 127, 10, 10,
+ 9, 32, 9, 126, 9, 64,
+ 10, 10, 9, 32, 9,
+ 64, -128, -1, 1, 127,
+ 10, 10, 9, 32, 9, 64,
+ 10, 10, 9, 32, 9,
+ 64, 9, 126, 33, 126,
+ 1, 127, 1, 127, 10, 10,
+ 9, 32, -128, -1, 9,
+ 60, 9, 60, 9, 60,
+ 0, 0, 0
+]
+
+class << self
+ attr_accessor :_message_ids_key_spans
+ private :_message_ids_key_spans, :_message_ids_key_spans=
+end
+self._message_ids_key_spans = [
+ 0, 52, 1, 24, 52, 118, 118, 1,
+ 24, 118, 56, 1, 24, 56, 118, 1,
+ 24, 118, 56, 1, 24, 56, 118, 118,
+ 1, 24, 118, 54, 1, 24, 54, 118,
+ 1, 24, 118, 1, 24, 118, 127, 127,
+ 1, 24, 118, 54, 1, 24, 54, 94,
+ 128, 1, 24, 118, 118, 127, 1, 24,
+ 128, 118, 118, 94, 94, 127, 127, 1,
+ 24, 128, 118, 127, 127, 1, 24, 118,
+ 56, 1, 24, 56, 128, 1, 24, 118,
+ 118, 1, 24, 118, 127, 127, 1, 24,
+ 118, 128, 127, 1, 24, 127, 127, 1,
+ 24, 118, 56, 1, 24, 56, 128, 127,
+ 1, 24, 56, 1, 24, 56, 118, 94,
+ 127, 127, 1, 24, 128, 52, 52, 52,
+ 0
+]
+
+class << self
+ attr_accessor :_message_ids_index_offsets
+ private :_message_ids_index_offsets, :_message_ids_index_offsets=
+end
+self._message_ids_index_offsets = [
+ 0, 0, 53, 55, 80, 133, 252, 371,
+ 373, 398, 517, 574, 576, 601, 658, 777,
+ 779, 804, 923, 980, 982, 1007, 1064, 1183,
+ 1302, 1304, 1329, 1448, 1503, 1505, 1530, 1585,
+ 1704, 1706, 1731, 1850, 1852, 1877, 1996, 2124,
+ 2252, 2254, 2279, 2398, 2453, 2455, 2480, 2535,
+ 2630, 2759, 2761, 2786, 2905, 3024, 3152, 3154,
+ 3179, 3308, 3427, 3546, 3641, 3736, 3864, 3992,
+ 3994, 4019, 4148, 4267, 4395, 4523, 4525, 4550,
+ 4669, 4726, 4728, 4753, 4810, 4939, 4941, 4966,
+ 5085, 5204, 5206, 5231, 5350, 5478, 5606, 5608,
+ 5633, 5752, 5881, 6009, 6011, 6036, 6164, 6292,
+ 6294, 6319, 6438, 6495, 6497, 6522, 6579, 6708,
+ 6836, 6838, 6863, 6920, 6922, 6947, 7004, 7123,
+ 7218, 7346, 7474, 7476, 7501, 7630, 7683, 7736,
+ 7789
+]
+
+class << self
+ attr_accessor :_message_ids_indicies
+ private :_message_ids_indicies, :_message_ids_indicies=
+end
+self._message_ids_indicies = [
+ 0, 1, 1, 1, 2, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 0,
+ 1, 1, 1, 1, 1, 1, 1, 3,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 4, 1, 5, 1, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 0, 1,
+ 6, 1, 1, 1, 7, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 6,
+ 1, 1, 1, 1, 1, 1, 1, 8,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 9, 1, 10, 1, 1,
+ 1, 11, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 10, 12, 13, 12,
+ 12, 12, 12, 12, 14, 1, 12, 12,
+ 1, 12, 15, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 1, 1,
+ 1, 12, 1, 12, 1, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 1,
+ 1, 1, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 1, 16, 1, 1, 1,
+ 17, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 16, 12, 13, 12, 12,
+ 12, 12, 12, 18, 1, 12, 12, 1,
+ 12, 15, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 1, 1, 1,
+ 12, 1, 12, 1, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 1, 1,
+ 1, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 1, 19, 1, 16, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 16, 1, 20, 1,
+ 1, 1, 21, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 20, 22, 23,
+ 22, 22, 22, 22, 22, 24, 1, 22,
+ 22, 1, 22, 25, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 1,
+ 1, 1, 22, 1, 22, 26, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 1, 1, 1, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 1, 27, 1, 1,
+ 1, 28, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 27, 1, 1, 1,
+ 1, 1, 1, 1, 29, 1, 1, 1,
+ 1, 1, 30, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 31, 1, 32, 1,
+ 27, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 27,
+ 1, 33, 1, 1, 1, 34, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 33, 1, 1, 1, 1, 1, 1, 1,
+ 35, 1, 1, 1, 1, 1, 36, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 37, 1, 30, 1, 1, 1, 38, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 30, 39, 40, 39, 39, 39, 39,
+ 39, 41, 1, 39, 39, 1, 39, 1,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 1, 1, 1, 39, 1,
+ 39, 1, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 1, 1, 1, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 1, 42, 1, 30, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 30, 1, 43, 1, 1, 1,
+ 44, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 43, 39, 1, 39, 39,
+ 39, 39, 39, 45, 1, 39, 39, 1,
+ 39, 30, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 1, 1, 1,
+ 39, 1, 39, 46, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 1, 1,
+ 1, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 1, 43, 1, 1, 1, 44,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 43, 1, 1, 1, 1, 1,
+ 1, 1, 45, 1, 1, 1, 1, 1,
+ 30, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 46, 1, 47, 1, 43, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 43, 1, 48,
+ 1, 1, 1, 49, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 48, 1,
+ 1, 1, 1, 1, 1, 1, 50, 1,
+ 1, 1, 1, 1, 36, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 51, 1,
+ 52, 1, 1, 1, 53, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 52,
+ 54, 55, 54, 54, 54, 54, 54, 56,
+ 1, 54, 54, 1, 54, 57, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 1, 1, 1, 54, 1, 54, 58,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 59, 1, 1, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 1, 60,
+ 1, 1, 1, 61, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 60, 62,
+ 63, 62, 62, 62, 62, 62, 64, 1,
+ 62, 62, 1, 62, 65, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 1, 1, 1, 62, 1, 62, 1, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 66, 1, 1, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 1, 67, 1,
+ 60, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 60,
+ 1, 68, 1, 1, 1, 69, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 68, 62, 63, 62, 62, 62, 62, 62,
+ 70, 1, 62, 62, 1, 62, 71, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 1, 1, 1, 62, 72, 62,
+ 1, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 1, 1, 1, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 1,
+ 68, 1, 1, 1, 69, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 68,
+ 1, 1, 1, 1, 1, 1, 1, 70,
+ 1, 1, 1, 1, 1, 73, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 72, 1, 74,
+ 1, 68, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 68, 1, 75, 1, 1, 1, 76, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 75, 1, 1, 1, 1, 1, 1,
+ 1, 77, 1, 1, 1, 1, 1, 78,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 79,
+ 1, 73, 1, 1, 1, 80, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 73, 81, 1, 81, 81, 81, 81, 81,
+ 82, 1, 81, 81, 1, 81, 1, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 1, 1, 1, 81, 1, 81,
+ 1, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 1, 1, 1, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 1,
+ 83, 1, 73, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 73, 1, 68, 1, 1, 1, 69,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 68, 81, 1, 81, 81, 81,
+ 81, 81, 70, 1, 81, 81, 1, 81,
+ 73, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 1, 1, 1, 81,
+ 72, 81, 1, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 1, 1, 1,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 81, 81, 81, 81, 81, 81, 81,
+ 81, 1, 84, 1, 85, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 85, 1, 78, 1, 1,
+ 1, 86, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 78, 87, 1, 87,
+ 87, 87, 87, 87, 88, 1, 87, 87,
+ 1, 87, 1, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 1, 1,
+ 1, 87, 1, 87, 1, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 1,
+ 1, 1, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 1, 89, 89, 89, 89,
+ 89, 89, 89, 89, 63, 1, 89, 89,
+ 90, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 63, 89, 1, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 91,
+ 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 1, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 1, 89, 89,
+ 92, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 93, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 91,
+ 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 89, 89, 89, 89, 89,
+ 89, 89, 89, 1, 94, 1, 89, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 89, 1, 95,
+ 1, 1, 1, 96, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 95, 93,
+ 63, 93, 93, 93, 93, 93, 97, 1,
+ 93, 93, 1, 93, 65, 93, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 1, 1, 1, 93, 72, 93, 1, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 93, 1, 1, 1, 93, 93, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 93, 93, 93, 93, 93, 1, 95, 1,
+ 1, 1, 96, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 95, 1, 1,
+ 1, 1, 1, 1, 1, 97, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 72, 1, 98, 1, 95,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 95, 1,
+ 99, 1, 1, 1, 100, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 99,
+ 1, 1, 1, 1, 1, 1, 1, 101,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 79, 1, 93,
+ 63, 93, 93, 93, 93, 93, 1, 1,
+ 93, 93, 1, 93, 65, 93, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 1, 1, 1, 93, 1, 93, 1, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 93, 1, 1, 1, 93, 93, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 93, 93, 93, 93, 93, 93, 93, 93,
+ 93, 93, 93, 93, 93, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 89, 102,
+ 1, 63, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 63, 1, 73, 1, 1, 1, 80, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 73, 62, 63, 62, 62, 62, 62,
+ 62, 82, 1, 62, 62, 1, 62, 65,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 1, 1, 1, 62, 1,
+ 62, 1, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 1, 1, 1, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 62, 62, 62, 62, 62, 62, 62, 62,
+ 1, 103, 1, 1, 1, 104, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 103, 105, 106, 105, 105, 105, 105, 105,
+ 107, 1, 105, 105, 1, 105, 108, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 1, 1, 1, 105, 1, 105,
+ 1, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 109, 1, 1, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 105,
+ 105, 105, 105, 105, 105, 105, 105, 1,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 1, 66, 66, 110, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 1, 111, 95, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 1,
+ 112, 1, 66, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 66, 1, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 66, 66, 66, 66, 66,
+ 66, 66, 66, 1, 68, 1, 1, 1,
+ 69, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 68, 113, 63, 113, 113,
+ 113, 113, 113, 70, 1, 113, 113, 1,
+ 113, 114, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 1, 1, 1,
+ 113, 72, 113, 58, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 1, 1,
+ 1, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 1, 73, 1, 1, 1, 80,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 73, 113, 63, 113, 113, 113,
+ 113, 113, 82, 1, 113, 113, 1, 113,
+ 65, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 1, 1, 1, 113,
+ 115, 113, 58, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 1, 1, 1,
+ 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 1, 58, 1, 58, 58, 58, 58,
+ 58, 1, 1, 58, 58, 1, 58, 116,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 1, 1, 1, 58, 115,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 1, 1, 1, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 1, 58, 1, 58, 58, 58, 58, 58,
+ 1, 1, 58, 58, 1, 58, 1, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 1, 1, 1, 58, 115, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 1, 1, 1, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 1,
+ 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 1, 117, 117, 118, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 119, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 120, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 117, 117, 117, 117, 117, 1,
+ 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 1, 121, 121, 122, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 123, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 124, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 121,
+ 121, 121, 121, 121, 121, 121, 121, 1,
+ 125, 1, 121, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 121, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 121, 36, 1, 1, 1,
+ 126, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 36, 127, 128, 127, 127,
+ 127, 127, 127, 129, 1, 127, 127, 1,
+ 127, 1, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 1, 1, 1,
+ 127, 1, 127, 1, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 1, 1,
+ 1, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 1, 130, 130, 130, 130, 130,
+ 130, 130, 130, 23, 1, 130, 130, 131,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 23, 130, 1, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 132, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 1, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 1, 130, 130, 133,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 134, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 132, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 1, 135, 1, 130, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 130, 1, 136, 1,
+ 1, 1, 137, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 136, 134, 23,
+ 134, 134, 134, 134, 134, 138, 1, 134,
+ 134, 1, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 1,
+ 1, 1, 134, 1, 134, 26, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134,
+ 1, 1, 1, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 1, 139, 1, 1,
+ 1, 140, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 139, 1, 1, 1,
+ 1, 1, 1, 1, 141, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 31, 1, 142, 1,
+ 139, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 139,
+ 1, 143, 1, 1, 1, 144, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 143, 1, 1, 1, 1, 1, 1, 1,
+ 145, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 37, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 130, 146, 1, 23, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 23, 1, 147, 1,
+ 1, 1, 148, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 147, 22, 149,
+ 22, 22, 22, 22, 22, 150, 1, 22,
+ 22, 1, 22, 134, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 1,
+ 1, 1, 22, 1, 22, 26, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 1, 1, 1, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 1, 151, 1, 1,
+ 1, 152, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 151, 39, 40, 39,
+ 39, 39, 39, 39, 153, 1, 39, 39,
+ 1, 39, 1, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 1, 1,
+ 1, 39, 1, 39, 31, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 1,
+ 1, 1, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 39, 39, 39, 39, 39,
+ 39, 39, 39, 1, 154, 1, 151, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 151, 1, 155,
+ 1, 1, 1, 156, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 155, 127,
+ 128, 127, 127, 127, 127, 127, 157, 1,
+ 127, 127, 1, 127, 1, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127,
+ 1, 1, 1, 127, 1, 127, 37, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 1, 1, 1, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 127, 127, 1, 158, 158,
+ 158, 158, 158, 158, 158, 158, 159, 1,
+ 158, 158, 160, 158, 158, 158, 158, 158,
+ 158, 158, 158, 158, 158, 158, 158, 158,
+ 158, 158, 158, 158, 158, 159, 158, 119,
+ 158, 158, 158, 158, 158, 158, 158, 158,
+ 158, 158, 158, 158, 158, 158, 158, 158,
+ 158, 158, 158, 158, 158, 158, 158, 158,
+ 158, 158, 158, 158, 158, 158, 158, 158,
+ 158, 158, 158, 158, 158, 158, 158, 158,
+ 158, 158, 158, 158, 158, 158, 158, 158,
+ 158, 158, 158, 158, 158, 158, 158, 158,
+ 158, 161, 158, 158, 158, 158, 158, 158,
+ 158, 158, 158, 158, 158, 158, 158, 158,
+ 158, 158, 158, 158, 158, 158, 158, 158,
+ 158, 158, 158, 158, 158, 158, 158, 158,
+ 158, 158, 158, 158, 158, 1, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 1,
+ 162, 162, 163, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 164,
+ 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 165, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 1, 166, 1,
+ 162, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 162,
+ 1, 20, 1, 1, 1, 21, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 20, 134, 23, 134, 134, 134, 134, 134,
+ 24, 1, 134, 134, 1, 134, 25, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 1, 1, 1, 134, 1, 134,
+ 26, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 1, 1, 1, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 167, 1, 162, 162, 168, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162,
+ 167, 162, 123, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 165, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162,
+ 162, 162, 162, 162, 162, 162, 162, 162,
+ 1, 169, 1, 167, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 167, 1, 170, 170, 170, 170,
+ 170, 170, 170, 170, 171, 1, 170, 170,
+ 172, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 171, 170, 173, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 174,
+ 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 170, 170, 170, 170, 170,
+ 170, 170, 170, 1, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 1, 175, 175,
+ 176, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 177, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 178,
+ 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 1, 179, 1, 175, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 175, 1, 180,
+ 1, 1, 1, 181, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 180, 134,
+ 23, 134, 134, 134, 134, 134, 182, 1,
+ 134, 134, 1, 134, 25, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134,
+ 1, 1, 1, 134, 1, 134, 183, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 1, 1, 1, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 1, 184, 1,
+ 1, 1, 185, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 184, 1, 1,
+ 1, 1, 1, 1, 1, 186, 1, 1,
+ 1, 1, 1, 30, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 187, 1, 188,
+ 1, 184, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 184, 1, 189, 1, 1, 1, 190, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 189, 1, 1, 1, 1, 1, 1,
+ 1, 191, 1, 1, 1, 1, 1, 36,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 192, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 193, 1, 175, 175,
+ 194, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 193, 175, 195, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 178,
+ 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 1, 196, 1, 193, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 193, 1, 197,
+ 1, 1, 1, 198, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 197, 1,
+ 1, 1, 1, 1, 1, 1, 199, 1,
+ 1, 1, 1, 1, 30, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 200, 1,
+ 201, 1, 197, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 197, 1, 202, 1, 1, 1, 203,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 202, 1, 1, 1, 1, 1,
+ 1, 1, 204, 1, 1, 1, 1, 1,
+ 36, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 205, 1, 206, 1, 1, 1,
+ 207, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 206, 208, 209, 208, 208,
+ 208, 208, 208, 210, 1, 208, 208, 1,
+ 208, 211, 208, 208, 208, 208, 208, 208,
+ 208, 208, 208, 208, 208, 1, 1, 1,
+ 208, 1, 208, 1, 208, 208, 208, 208,
+ 208, 208, 208, 208, 208, 208, 208, 208,
+ 208, 208, 208, 208, 208, 208, 208, 208,
+ 208, 208, 208, 208, 208, 208, 1, 1,
+ 1, 208, 208, 208, 208, 208, 208, 208,
+ 208, 208, 208, 208, 208, 208, 208, 208,
+ 208, 208, 208, 208, 208, 208, 208, 208,
+ 208, 208, 208, 208, 208, 208, 208, 208,
+ 208, 208, 1, 134, 23, 134, 134, 134,
+ 134, 134, 1, 1, 134, 134, 1, 134,
+ 212, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 1, 1, 1, 134,
+ 1, 134, 1, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 1, 1, 1,
+ 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 1, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 1, 213, 213, 214, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 215, 216, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 217, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 213, 213, 213, 213, 213, 213, 213,
+ 213, 1, 218, 218, 218, 218, 218, 218,
+ 218, 218, 218, 1, 218, 218, 219, 218,
+ 218, 218, 218, 218, 218, 218, 218, 218,
+ 218, 218, 218, 218, 218, 218, 218, 218,
+ 218, 218, 218, 218, 218, 218, 218, 218,
+ 218, 220, 221, 218, 218, 218, 218, 218,
+ 218, 218, 218, 218, 218, 218, 218, 218,
+ 218, 218, 218, 218, 218, 218, 218, 218,
+ 218, 218, 218, 218, 218, 218, 218, 218,
+ 218, 218, 218, 218, 218, 218, 218, 218,
+ 218, 218, 218, 218, 218, 218, 218, 218,
+ 218, 218, 218, 218, 218, 222, 218, 218,
+ 218, 218, 218, 218, 218, 218, 218, 218,
+ 218, 218, 218, 218, 218, 218, 218, 218,
+ 218, 218, 218, 218, 218, 218, 218, 218,
+ 218, 218, 218, 218, 218, 218, 218, 218,
+ 218, 1, 223, 1, 218, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 218, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 218, 224, 1,
+ 1, 1, 225, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 224, 1, 1,
+ 1, 1, 1, 1, 1, 226, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 227, 1, 85, 1, 1, 1, 228,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 85, 1, 1, 1, 1, 1,
+ 1, 1, 229, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 4, 1,
+ 230, 1, 1, 1, 231, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 230,
+ 1, 1, 1, 1, 1, 1, 1, 232,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 9, 1, 1, 0
+]
+
+class << self
+ attr_accessor :_message_ids_trans_targs
+ private :_message_ids_trans_targs, :_message_ids_trans_targs=
+end
+self._message_ids_trans_targs = [
+ 1, 0, 2, 4, 5, 3, 1, 2,
+ 4, 5, 6, 7, 9, 93, 110, 111,
+ 6, 7, 110, 8, 10, 11, 9, 67,
+ 13, 79, 22, 10, 11, 13, 14, 22,
+ 12, 10, 11, 13, 14, 22, 15, 17,
+ 61, 66, 16, 18, 19, 21, 22, 20,
+ 18, 19, 21, 22, 23, 24, 57, 38,
+ 52, 47, 59, 53, 23, 24, 26, 38,
+ 52, 47, 53, 25, 27, 28, 30, 51,
+ 117, 31, 29, 27, 28, 30, 31, 117,
+ 32, 34, 37, 33, 36, 118, 32, 34,
+ 37, 39, 49, 48, 40, 42, 41, 43,
+ 44, 46, 45, 43, 44, 46, 50, 23,
+ 24, 26, 38, 52, 47, 53, 54, 56,
+ 55, 57, 58, 117, 60, 62, 63, 18,
+ 65, 62, 63, 18, 65, 64, 15, 17,
+ 61, 66, 68, 77, 76, 69, 71, 70,
+ 72, 73, 75, 72, 73, 75, 74, 72,
+ 73, 75, 78, 80, 81, 84, 83, 80,
+ 81, 83, 82, 80, 81, 83, 85, 90,
+ 91, 89, 85, 86, 88, 89, 87, 90,
+ 91, 92, 94, 103, 104, 106, 102, 94,
+ 95, 97, 102, 96, 98, 99, 101, 22,
+ 98, 99, 101, 22, 100, 98, 99, 101,
+ 22, 103, 104, 106, 105, 106, 107, 109,
+ 22, 108, 106, 107, 109, 22, 6, 7,
+ 9, 93, 110, 111, 111, 113, 114, 113,
+ 120, 116, 113, 114, 113, 120, 116, 115,
+ 118, 35, 119, 5, 35, 119, 118, 35,
+ 119
+]
+
+class << self
+ attr_accessor :_message_ids_trans_actions
+ private :_message_ids_trans_actions, :_message_ids_trans_actions=
+end
+self._message_ids_trans_actions = [
+ 0, 0, 0, 1, 2, 0, 3, 3,
+ 4, 5, 6, 6, 6, 6, 7, 6,
+ 0, 0, 1, 0, 8, 8, 0, 0,
+ 9, 0, 10, 0, 0, 1, 0, 11,
+ 0, 3, 3, 4, 3, 12, 0, 0,
+ 0, 1, 0, 0, 0, 1, 0, 0,
+ 3, 3, 4, 3, 13, 13, 13, 13,
+ 14, 13, 0, 13, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 1, 0,
+ 15, 0, 0, 3, 3, 4, 3, 16,
+ 0, 0, 1, 0, 0, 0, 3, 3,
+ 4, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 0, 3, 3, 4, 0, 3,
+ 3, 3, 3, 4, 3, 3, 0, 0,
+ 0, 0, 0, 0, 0, 17, 17, 18,
+ 17, 0, 0, 19, 0, 0, 3, 3,
+ 3, 4, 0, 0, 0, 0, 0, 0,
+ 8, 8, 9, 0, 0, 1, 0, 3,
+ 3, 4, 0, 8, 8, 0, 9, 0,
+ 0, 1, 0, 3, 3, 4, 17, 17,
+ 17, 17, 0, 0, 19, 0, 0, 0,
+ 0, 0, 17, 17, 17, 18, 17, 0,
+ 0, 19, 0, 0, 8, 8, 9, 20,
+ 0, 0, 1, 21, 0, 3, 3, 4,
+ 22, 0, 0, 19, 0, 0, 0, 1,
+ 23, 0, 3, 3, 4, 24, 3, 3,
+ 25, 25, 4, 25, 0, 26, 26, 27,
+ 28, 26, 0, 0, 1, 29, 0, 0,
+ 30, 30, 31, 32, 0, 1, 3, 3,
+ 4
+]
+
+class << self
+ attr_accessor :_message_ids_eof_actions
+ private :_message_ids_eof_actions, :_message_ids_eof_actions=
+end
+self._message_ids_eof_actions = [
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 30, 0, 3,
+ 0
+]
+
+class << self
+ attr_accessor :message_ids_start
+end
+self.message_ids_start = 1;
+class << self
+ attr_accessor :message_ids_first_final
+end
+self.message_ids_first_final = 117;
+class << self
+ attr_accessor :message_ids_error
+end
+self.message_ids_error = 0;
+
+class << self
+ attr_accessor :message_ids_en_comment_tail
+end
+self.message_ids_en_comment_tail = 112;
+class << self
+ attr_accessor :message_ids_en_main
+end
+self.message_ids_en_main = 1;
+
+
+# line 17 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb.rl"
+
+ def self.parse(data)
+ p = 0
+ eof = data.length
+ stack = []
+
+ actions = []
+ data_unpacked = data.bytes.to_a
+
+# line 1224 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb"
+begin
+ p ||= 0
+ pe ||= data.length
+ cs = message_ids_start
+ top = 0
+end
+
+# line 26 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb.rl"
+
+# line 1234 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb"
+begin
+ testEof = false
+ _slen, _trans, _keys, _inds, _acts, _nacts = nil
+ _goto_level = 0
+ _resume = 10
+ _eof_trans = 15
+ _again = 20
+ _test_eof = 30
+ _out = 40
+ while true
+ if _goto_level <= 0
+ if p == pe
+ _goto_level = _test_eof
+ next
+ end
+ if cs == 0
+ _goto_level = _out
+ next
+ end
+ end
+ if _goto_level <= _resume
+ _keys = cs << 1
+ _inds = _message_ids_index_offsets[cs]
+ _slen = _message_ids_key_spans[cs]
+ _trans = if ( _slen > 0 &&
+ _message_ids_trans_keys[_keys] <= ( data_unpacked[p]) &&
+ ( data_unpacked[p]) <= _message_ids_trans_keys[_keys + 1]
+ ) then
+ _message_ids_indicies[ _inds + ( data_unpacked[p]) - _message_ids_trans_keys[_keys] ]
+ else
+ _message_ids_indicies[ _inds + _slen ]
+ end
+ cs = _message_ids_trans_targs[_trans]
+ if _message_ids_trans_actions[_trans] != 0
+ case _message_ids_trans_actions[_trans]
+ when 3 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+ when 26 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+ when 15 then
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+ when 13 then
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 11 then
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+ when 8 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+ when 6 then
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+ when 23 then
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+ when 30 then
+# line 31 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(28, p) end
+ when 2 then
+# line 32 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(29, p) end
+ when 19 then
+# line 41 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(38, p) end
+ when 17 then
+# line 42 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(39, p) end
+ when 1 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 112
+ _goto_level = _again
+ next
+ end
+ end
+ when 29 then
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ top -= 1
+ cs = stack[top]
+ _goto_level = _again
+ next
+ end
+ end
+ when 16 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+ when 12 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+ when 25 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+ when 24 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+ when 5 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 32 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(29, p) end
+ when 4 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 112
+ _goto_level = _again
+ next
+ end
+ end
+ when 27 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 112
+ _goto_level = _again
+ next
+ end
+ end
+ when 28 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ top -= 1
+ cs = stack[top]
+ _goto_level = _again
+ next
+ end
+ end
+ when 14 then
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 112
+ _goto_level = _again
+ next
+ end
+ end
+ when 21 then
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+ when 10 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+ when 9 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 112
+ _goto_level = _again
+ next
+ end
+ end
+ when 7 then
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 112
+ _goto_level = _again
+ next
+ end
+ end
+ when 32 then
+# line 31 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(28, p) end
+# line 32 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(29, p) end
+ when 31 then
+# line 31 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(28, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 112
+ _goto_level = _again
+ next
+ end
+ end
+ when 18 then
+# line 42 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(39, p) end
+# line 41 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(38, p) end
+ when 22 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+ when 20 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 1519 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb"
+ end
+ end
+ end
+ if _goto_level <= _again
+ if cs == 0
+ _goto_level = _out
+ next
+ end
+ p += 1
+ if p != pe
+ _goto_level = _resume
+ next
+ end
+ end
+ if _goto_level <= _test_eof
+ if p == eof
+ case _message_ids_eof_actions[cs]
+ when 3 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+ when 30 then
+# line 31 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(28, p) end
+# line 1545 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb"
+ end
+ end
+
+ end
+ if _goto_level <= _out
+ break
+ end
+end
+ end
+
+# line 27 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb.rl"
+
+ if p == eof && cs >=
+# line 1559 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb"
+117
+# line 28 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb.rl"
+
+ return actions, nil
+ else
+ return [], "Only able to parse up to #{data[0..p]}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb.rl b/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb.rl
new file mode 100644
index 0000000..7170576
--- /dev/null
+++ b/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb.rl
@@ -0,0 +1,37 @@
+%%{
+ machine message_ids;
+
+ include rb_actions "rb_actions.rl";
+ include common "../../common.rl";
+
+ getkey data_unpacked[p];
+
+ main := message_ids;
+}%%
+
+module Mail
+ module Parsers
+ module Ragel
+ module MessageIdsMachine
+ %%write data;
+
+ def self.parse(data)
+ p = 0
+ eof = data.length
+ stack = []
+
+ actions = []
+ data_unpacked = data.bytes.to_a
+ %%write init;
+ %%write exec;
+
+ if p == eof && cs >= %%{ write first_final; }%%
+ return actions, nil
+ else
+ return [], "Only able to parse up to #{data[0..p]}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb b/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb
new file mode 100644
index 0000000..5356eb5
--- /dev/null
+++ b/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb
@@ -0,0 +1,440 @@
+
+# line 1 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb.rl"
+
+# line 10 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb.rl"
+
+
+module Mail
+ module Parsers
+ module Ragel
+ module MimeVersionMachine
+
+# line 13 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb"
+class << self
+ attr_accessor :_mime_version_trans_keys
+ private :_mime_version_trans_keys, :_mime_version_trans_keys=
+end
+self._mime_version_trans_keys = [
+ 0, 0, 9, 57, 10, 10,
+ 9, 32, 9, 57, 40,
+ 57, 46, 46, 40, 57,
+ 48, 57, 10, 10, 9, 32,
+ 1, 127, 1, 127, 10,
+ 10, 9, 32, 0, 127,
+ 9, 57, 9, 40, 9, 40,
+ 0, 0, 0
+]
+
+class << self
+ attr_accessor :_mime_version_key_spans
+ private :_mime_version_key_spans, :_mime_version_key_spans=
+end
+self._mime_version_key_spans = [
+ 0, 49, 1, 24, 49, 18, 1, 18,
+ 10, 1, 24, 127, 127, 1, 24, 128,
+ 49, 32, 32, 0
+]
+
+class << self
+ attr_accessor :_mime_version_index_offsets
+ private :_mime_version_index_offsets, :_mime_version_index_offsets=
+end
+self._mime_version_index_offsets = [
+ 0, 0, 50, 52, 77, 127, 146, 148,
+ 167, 178, 180, 205, 333, 461, 463, 488,
+ 617, 667, 700, 733
+]
+
+class << self
+ attr_accessor :_mime_version_indicies
+ private :_mime_version_indicies, :_mime_version_indicies=
+end
+self._mime_version_indicies = [
+ 0, 1, 1, 1, 2, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 0,
+ 1, 1, 1, 1, 1, 1, 1, 3,
+ 1, 1, 1, 1, 1, 1, 1, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 1, 5, 1, 0, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 0, 1, 6, 1, 1,
+ 1, 7, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 6, 1, 1, 1,
+ 1, 1, 1, 1, 8, 1, 1, 1,
+ 1, 1, 1, 1, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 1, 10,
+ 1, 1, 1, 1, 1, 11, 1, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 1, 13, 1, 14, 1, 1, 1,
+ 1, 1, 1, 1, 15, 15, 15, 15,
+ 15, 15, 15, 15, 15, 15, 1, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 1, 17, 1, 18, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 18, 1, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 1, 19,
+ 19, 20, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 21, 22, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 23, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19,
+ 19, 19, 19, 19, 1, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 1, 24,
+ 24, 25, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 26, 27, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 28, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 1, 29, 1, 24,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 24, 1,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24,
+ 1, 30, 1, 1, 1, 31, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 30, 1, 1, 1, 1, 1, 1, 1,
+ 32, 1, 1, 1, 1, 1, 1, 1,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 1, 18, 1, 1, 1, 34,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 18, 1, 1, 1, 1, 1,
+ 1, 1, 35, 1, 36, 1, 1, 1,
+ 37, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 36, 1, 1, 1, 1,
+ 1, 1, 1, 38, 1, 1, 0
+]
+
+class << self
+ attr_accessor :_mime_version_trans_targs
+ private :_mime_version_trans_targs, :_mime_version_trans_targs=
+end
+self._mime_version_trans_targs = [
+ 1, 0, 2, 4, 5, 3, 1, 2,
+ 4, 5, 6, 7, 5, 7, 8, 16,
+ 16, 10, 17, 12, 13, 12, 19, 15,
+ 12, 13, 12, 19, 15, 14, 17, 9,
+ 18, 16, 9, 18, 17, 9, 18
+]
+
+class << self
+ attr_accessor :_mime_version_trans_actions
+ private :_mime_version_trans_actions, :_mime_version_trans_actions=
+end
+self._mime_version_trans_actions = [
+ 0, 0, 0, 1, 2, 0, 3, 3,
+ 4, 5, 6, 7, 0, 3, 1, 8,
+ 9, 0, 0, 10, 10, 11, 12, 10,
+ 0, 0, 1, 13, 0, 0, 14, 14,
+ 15, 0, 0, 1, 3, 3, 4
+]
+
+class << self
+ attr_accessor :_mime_version_eof_actions
+ private :_mime_version_eof_actions, :_mime_version_eof_actions=
+end
+self._mime_version_eof_actions = [
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 14, 0, 3, 0
+]
+
+class << self
+ attr_accessor :mime_version_start
+end
+self.mime_version_start = 1;
+class << self
+ attr_accessor :mime_version_first_final
+end
+self.mime_version_first_final = 16;
+class << self
+ attr_accessor :mime_version_error
+end
+self.mime_version_error = 0;
+
+class << self
+ attr_accessor :mime_version_en_comment_tail
+end
+self.mime_version_en_comment_tail = 11;
+class << self
+ attr_accessor :mime_version_en_main
+end
+self.mime_version_en_main = 1;
+
+
+# line 17 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb.rl"
+
+ def self.parse(data)
+ p = 0
+ eof = data.length
+ stack = []
+
+ actions = []
+ data_unpacked = data.bytes.to_a
+
+# line 215 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb"
+begin
+ p ||= 0
+ pe ||= data.length
+ cs = mime_version_start
+ top = 0
+end
+
+# line 26 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb.rl"
+
+# line 225 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb"
+begin
+ testEof = false
+ _slen, _trans, _keys, _inds, _acts, _nacts = nil
+ _goto_level = 0
+ _resume = 10
+ _eof_trans = 15
+ _again = 20
+ _test_eof = 30
+ _out = 40
+ while true
+ if _goto_level <= 0
+ if p == pe
+ _goto_level = _test_eof
+ next
+ end
+ if cs == 0
+ _goto_level = _out
+ next
+ end
+ end
+ if _goto_level <= _resume
+ _keys = cs << 1
+ _inds = _mime_version_index_offsets[cs]
+ _slen = _mime_version_key_spans[cs]
+ _trans = if ( _slen > 0 &&
+ _mime_version_trans_keys[_keys] <= ( data_unpacked[p]) &&
+ ( data_unpacked[p]) <= _mime_version_trans_keys[_keys + 1]
+ ) then
+ _mime_version_indicies[ _inds + ( data_unpacked[p]) - _mime_version_trans_keys[_keys] ]
+ else
+ _mime_version_indicies[ _inds + _slen ]
+ end
+ cs = _mime_version_trans_targs[_trans]
+ if _mime_version_trans_actions[_trans] != 0
+ case _mime_version_trans_actions[_trans]
+ when 3 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+ when 10 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+ when 7 then
+# line 27 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(24, p) end
+ when 2 then
+# line 28 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(25, p) end
+ when 14 then
+# line 29 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(26, p) end
+ when 8 then
+# line 30 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(27, p) end
+ when 1 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 11
+ _goto_level = _again
+ next
+ end
+ end
+ when 13 then
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ top -= 1
+ cs = stack[top]
+ _goto_level = _again
+ next
+ end
+ end
+ when 5 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 28 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(25, p) end
+ when 9 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 30 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(27, p) end
+ when 4 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 11
+ _goto_level = _again
+ next
+ end
+ end
+ when 11 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 11
+ _goto_level = _again
+ next
+ end
+ end
+ when 12 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ top -= 1
+ cs = stack[top]
+ _goto_level = _again
+ next
+ end
+ end
+ when 6 then
+# line 27 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(24, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 11
+ _goto_level = _again
+ next
+ end
+ end
+ when 15 then
+# line 29 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(26, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 11
+ _goto_level = _again
+ next
+ end
+ end
+# line 389 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb"
+ end
+ end
+ end
+ if _goto_level <= _again
+ if cs == 0
+ _goto_level = _out
+ next
+ end
+ p += 1
+ if p != pe
+ _goto_level = _resume
+ next
+ end
+ end
+ if _goto_level <= _test_eof
+ if p == eof
+ case _mime_version_eof_actions[cs]
+ when 3 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+ when 14 then
+# line 29 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(26, p) end
+# line 415 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb"
+ end
+ end
+
+ end
+ if _goto_level <= _out
+ break
+ end
+end
+ end
+
+# line 27 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb.rl"
+
+ if p == eof && cs >=
+# line 429 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb"
+16
+# line 28 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb.rl"
+
+ return actions, nil
+ else
+ return [], "Only able to parse up to #{data[0..p]}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb.rl b/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb.rl
new file mode 100644
index 0000000..881b29c
--- /dev/null
+++ b/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb.rl
@@ -0,0 +1,37 @@
+%%{
+ machine mime_version;
+
+ include rb_actions "rb_actions.rl";
+ include common "../../common.rl";
+
+ getkey data_unpacked[p];
+
+ main := mime_version;
+}%%
+
+module Mail
+ module Parsers
+ module Ragel
+ module MimeVersionMachine
+ %%write data;
+
+ def self.parse(data)
+ p = 0
+ eof = data.length
+ stack = []
+
+ actions = []
+ data_unpacked = data.bytes.to_a
+ %%write init;
+ %%write exec;
+
+ if p == eof && cs >= %%{ write first_final; }%%
+ return actions, nil
+ else
+ return [], "Only able to parse up to #{data[0..p]}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb b/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb
new file mode 100644
index 0000000..c9951b7
--- /dev/null
+++ b/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb
@@ -0,0 +1,564 @@
+
+# line 1 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb.rl"
+
+# line 10 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb.rl"
+
+
+module Mail
+ module Parsers
+ module Ragel
+ module PhraseListsMachine
+
+# line 13 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb"
+class << self
+ attr_accessor :_phrase_lists_trans_keys
+ private :_phrase_lists_trans_keys, :_phrase_lists_trans_keys=
+end
+self._phrase_lists_trans_keys = [
+ 0, 0, 9, 126, 9, 126,
+ 10, 10, 9, 32, 10,
+ 10, 9, 32, 1, 127,
+ 1, 127, 10, 10, 9, 32,
+ -128, -1, 9, 126, 10,
+ 10, 9, 32, 9, 126,
+ 1, 127, 1, 127, 10, 10,
+ 9, 32, -128, -1, 9,
+ 126, 9, 126, 9, 126,
+ 0, 0, 0
+]
+
+class << self
+ attr_accessor :_phrase_lists_key_spans
+ private :_phrase_lists_key_spans, :_phrase_lists_key_spans=
+end
+self._phrase_lists_key_spans = [
+ 0, 118, 118, 1, 24, 1, 24, 127,
+ 127, 1, 24, 128, 118, 1, 24, 118,
+ 127, 127, 1, 24, 128, 118, 118, 118,
+ 0
+]
+
+class << self
+ attr_accessor :_phrase_lists_index_offsets
+ private :_phrase_lists_index_offsets, :_phrase_lists_index_offsets=
+end
+self._phrase_lists_index_offsets = [
+ 0, 0, 119, 238, 240, 265, 267, 292,
+ 420, 548, 550, 575, 704, 823, 825, 850,
+ 969, 1097, 1225, 1227, 1252, 1381, 1500, 1619,
+ 1738
+]
+
+class << self
+ attr_accessor :_phrase_lists_indicies
+ private :_phrase_lists_indicies, :_phrase_lists_indicies=
+end
+self._phrase_lists_indicies = [
+ 0, 1, 1, 1, 2, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 0,
+ 3, 4, 3, 3, 3, 3, 3, 5,
+ 1, 3, 3, 1, 3, 6, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 1, 1, 1, 3, 1, 3, 6,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 1, 1, 1, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 1, 7,
+ 1, 1, 1, 8, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 7, 9,
+ 10, 9, 9, 9, 9, 9, 11, 1,
+ 9, 9, 1, 9, 1, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 1, 1, 1, 9, 1, 9, 1, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 1, 1, 1, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 1, 12, 1,
+ 7, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 7,
+ 1, 13, 1, 9, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 9, 1, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 1, 14, 14,
+ 15, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 16, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 17,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 1, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 1, 18, 18,
+ 19, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 20, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 21,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 18, 1, 22, 1, 18, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 18, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 18,
+ 23, 1, 1, 1, 24, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 23,
+ 3, 4, 3, 3, 3, 3, 3, 5,
+ 1, 3, 3, 1, 3, 6, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 1, 1, 1, 3, 1, 3, 6,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 1, 1, 1, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 1, 25,
+ 1, 26, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 26, 1, 27, 1, 1, 1, 28, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 27, 29, 30, 29, 29, 29, 29,
+ 29, 31, 1, 29, 29, 1, 29, 1,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 1, 1, 1, 29, 1,
+ 29, 1, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 1, 1, 1, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 1, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 1, 32, 32, 33, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 34, 35, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 36, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 1, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 1, 37, 37, 38, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37,
+ 39, 40, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 41, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 37, 37, 37, 37, 37, 37, 37,
+ 1, 42, 1, 37, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 37, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 37, 9, 1, 1,
+ 1, 43, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 9, 9, 10, 9,
+ 9, 9, 9, 9, 44, 1, 9, 9,
+ 45, 9, 46, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 1, 1,
+ 1, 9, 1, 9, 46, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 1,
+ 1, 1, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 1, 29, 1, 1, 1,
+ 47, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 29, 29, 30, 29, 29,
+ 29, 29, 29, 48, 1, 29, 29, 49,
+ 29, 50, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 1, 1, 1,
+ 29, 1, 29, 50, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 1, 1,
+ 1, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 1, 7, 1, 1, 1, 8,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 7, 9, 10, 9, 9, 9,
+ 9, 9, 11, 1, 9, 9, 45, 9,
+ 46, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 1, 1, 1, 9,
+ 1, 9, 46, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 1, 1, 1,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 1, 1, 0
+]
+
+class << self
+ attr_accessor :_phrase_lists_trans_targs
+ private :_phrase_lists_trans_targs, :_phrase_lists_trans_targs=
+end
+self._phrase_lists_trans_targs = [
+ 2, 0, 3, 21, 7, 15, 23, 2,
+ 3, 21, 7, 15, 4, 6, 8, 9,
+ 21, 11, 8, 9, 21, 11, 10, 12,
+ 13, 14, 12, 2, 3, 21, 7, 15,
+ 17, 18, 17, 24, 20, 17, 18, 17,
+ 24, 20, 19, 5, 22, 12, 23, 5,
+ 22, 12, 23
+]
+
+class << self
+ attr_accessor :_phrase_lists_trans_actions
+ private :_phrase_lists_trans_actions, :_phrase_lists_trans_actions=
+end
+self._phrase_lists_trans_actions = [
+ 1, 0, 1, 1, 1, 2, 1, 0,
+ 0, 0, 0, 3, 0, 0, 4, 4,
+ 5, 4, 0, 0, 6, 0, 0, 1,
+ 1, 0, 0, 7, 7, 7, 7, 8,
+ 9, 9, 10, 11, 9, 0, 0, 3,
+ 12, 0, 0, 0, 3, 13, 0, 7,
+ 8, 14, 7
+]
+
+class << self
+ attr_accessor :_phrase_lists_eof_actions
+ private :_phrase_lists_eof_actions, :_phrase_lists_eof_actions=
+end
+self._phrase_lists_eof_actions = [
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 13, 14, 13,
+ 0
+]
+
+class << self
+ attr_accessor :phrase_lists_start
+end
+self.phrase_lists_start = 1;
+class << self
+ attr_accessor :phrase_lists_first_final
+end
+self.phrase_lists_first_final = 21;
+class << self
+ attr_accessor :phrase_lists_error
+end
+self.phrase_lists_error = 0;
+
+class << self
+ attr_accessor :phrase_lists_en_comment_tail
+end
+self.phrase_lists_en_comment_tail = 16;
+class << self
+ attr_accessor :phrase_lists_en_main
+end
+self.phrase_lists_en_main = 1;
+
+
+# line 17 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb.rl"
+
+ def self.parse(data)
+ p = 0
+ eof = data.length
+ stack = []
+
+ actions = []
+ data_unpacked = data.bytes.to_a
+
+# line 350 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb"
+begin
+ p ||= 0
+ pe ||= data.length
+ cs = phrase_lists_start
+ top = 0
+end
+
+# line 26 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb.rl"
+
+# line 360 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb"
+begin
+ testEof = false
+ _slen, _trans, _keys, _inds, _acts, _nacts = nil
+ _goto_level = 0
+ _resume = 10
+ _eof_trans = 15
+ _again = 20
+ _test_eof = 30
+ _out = 40
+ while true
+ if _goto_level <= 0
+ if p == pe
+ _goto_level = _test_eof
+ next
+ end
+ if cs == 0
+ _goto_level = _out
+ next
+ end
+ end
+ if _goto_level <= _resume
+ _keys = cs << 1
+ _inds = _phrase_lists_index_offsets[cs]
+ _slen = _phrase_lists_key_spans[cs]
+ _trans = if ( _slen > 0 &&
+ _phrase_lists_trans_keys[_keys] <= ( data_unpacked[p]) &&
+ ( data_unpacked[p]) <= _phrase_lists_trans_keys[_keys + 1]
+ ) then
+ _phrase_lists_indicies[ _inds + ( data_unpacked[p]) - _phrase_lists_trans_keys[_keys] ]
+ else
+ _phrase_lists_indicies[ _inds + _slen ]
+ end
+ cs = _phrase_lists_trans_targs[_trans]
+ if _phrase_lists_trans_actions[_trans] != 0
+ case _phrase_lists_trans_actions[_trans]
+ when 7 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+ when 9 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+ when 13 then
+# line 39 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(36, p) end
+ when 1 then
+# line 40 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(37, p) end
+ when 6 then
+# line 41 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(38, p) end
+ when 4 then
+# line 42 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(39, p) end
+ when 3 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 16
+ _goto_level = _again
+ next
+ end
+ end
+ when 12 then
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ top -= 1
+ cs = stack[top]
+ _goto_level = _again
+ next
+ end
+ end
+ when 14 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 39 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(36, p) end
+ when 8 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 16
+ _goto_level = _again
+ next
+ end
+ end
+ when 10 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 16
+ _goto_level = _again
+ next
+ end
+ end
+ when 11 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ top -= 1
+ cs = stack[top]
+ _goto_level = _again
+ next
+ end
+ end
+ when 2 then
+# line 40 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(37, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 16
+ _goto_level = _again
+ next
+ end
+ end
+ when 5 then
+# line 42 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(39, p) end
+# line 41 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(38, p) end
+# line 510 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb"
+ end
+ end
+ end
+ if _goto_level <= _again
+ if cs == 0
+ _goto_level = _out
+ next
+ end
+ p += 1
+ if p != pe
+ _goto_level = _resume
+ next
+ end
+ end
+ if _goto_level <= _test_eof
+ if p == eof
+ case _phrase_lists_eof_actions[cs]
+ when 13 then
+# line 39 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(36, p) end
+ when 14 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 39 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(36, p) end
+# line 539 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb"
+ end
+ end
+
+ end
+ if _goto_level <= _out
+ break
+ end
+end
+ end
+
+# line 27 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb.rl"
+
+ if p == eof && cs >=
+# line 553 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb"
+21
+# line 28 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb.rl"
+
+ return actions, nil
+ else
+ return [], "Only able to parse up to #{data[0..p]}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb.rl b/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb.rl
new file mode 100644
index 0000000..7328b3d
--- /dev/null
+++ b/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb.rl
@@ -0,0 +1,37 @@
+%%{
+ machine phrase_lists;
+
+ include rb_actions "rb_actions.rl";
+ include common "../../common.rl";
+
+ getkey data_unpacked[p];
+
+ main := phrase_lists;
+}%%
+
+module Mail
+ module Parsers
+ module Ragel
+ module PhraseListsMachine
+ %%write data;
+
+ def self.parse(data)
+ p = 0
+ eof = data.length
+ stack = []
+
+ actions = []
+ data_unpacked = data.bytes.to_a
+ %%write init;
+ %%write exec;
+
+ if p == eof && cs >= %%{ write first_final; }%%
+ return actions, nil
+ else
+ return [], "Only able to parse up to #{data[0..p]}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl b/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl
new file mode 100644
index 0000000..dabeabf
--- /dev/null
+++ b/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl
@@ -0,0 +1,51 @@
+%%{
+machine rb_actions;
+action addr_spec { actions.push(0, p) }
+action address_e { actions.push(1, p) }
+action address_s { actions.push(2, p) }
+action angle_addr_s { actions.push(3, p) }
+action comment_e { actions.push(4, p) }
+action comment_s { actions.push(5, p) }
+action ctime_date_e { actions.push(6, p) }
+action ctime_date_s { actions.push(7, p) }
+action date_e { actions.push(8, p) }
+action date_s { actions.push(9, p) }
+action disp_type_e { actions.push(10, p) }
+action disp_type_s { actions.push(11, p) }
+action domain_e { actions.push(12, p) }
+action domain_s { actions.push(13, p) }
+action encoding_e { actions.push(14, p) }
+action encoding_s { actions.push(15, p) }
+action group_name_e { actions.push(16, p) }
+action group_name_s { actions.push(17, p) }
+action local_dot_atom_e { actions.push(18, p) }
+action local_dot_atom_pre_comment_e { actions.push(19, p) }
+action local_dot_atom_s { actions.push(20, p) }
+action local_quoted_string_e { actions.push(21, p) }
+action main_type_e { actions.push(22, p) }
+action main_type_s { actions.push(23, p) }
+action major_digits_e { actions.push(24, p) }
+action major_digits_s { actions.push(25, p) }
+action minor_digits_e { actions.push(26, p) }
+action minor_digits_s { actions.push(27, p) }
+action msg_id_e { actions.push(28, p) }
+action msg_id_s { actions.push(29, p) }
+action obs_domain_list_e { actions.push(30, p) }
+action obs_domain_list_s { actions.push(31, p) }
+action param_attr_e { actions.push(32, p) }
+action param_attr_s { actions.push(33, p) }
+action param_val_e { actions.push(34, p) }
+action param_val_s { actions.push(35, p) }
+action phrase_e { actions.push(36, p) }
+action phrase_s { actions.push(37, p) }
+action qstr_e { actions.push(38, p) }
+action qstr_s { actions.push(39, p) }
+action received_tokens_e { actions.push(40, p) }
+action received_tokens_s { actions.push(41, p) }
+action sub_type_e { actions.push(42, p) }
+action sub_type_s { actions.push(43, p) }
+action time_e { actions.push(44, p) }
+action time_s { actions.push(45, p) }
+action token_string_e { actions.push(46, p) }
+action token_string_s { actions.push(47, p) }
+}%%
\ No newline at end of file
diff --git a/lib/mail/parsers/ragel/ruby/machines/received_machine.rb b/lib/mail/parsers/ragel/ruby/machines/received_machine.rb
new file mode 100644
index 0000000..1453b6b
--- /dev/null
+++ b/lib/mail/parsers/ragel/ruby/machines/received_machine.rb
@@ -0,0 +1,5144 @@
+
+# line 1 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/received_machine.rb.rl"
+
+# line 10 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/received_machine.rb.rl"
+
+
+module Mail
+ module Parsers
+ module Ragel
+ module ReceivedMachine
+
+# line 13 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/received_machine.rb"
+class << self
+ attr_accessor :_received_trans_keys
+ private :_received_trans_keys, :_received_trans_keys=
+end
+self._received_trans_keys = [
+ 0, 0, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9,
+ 126, 9, 126, 10, 10,
+ 9, 32, 1, 127, 1, 127,
+ 10, 10, 9, 32, 9,
+ 126, 9, 126, 10, 10,
+ 9, 32, 9, 126, 9, 126,
+ 9, 126, 10, 10, 9,
+ 32, 9, 126, 10, 10,
+ 9, 32, 9, 126, 9, 87,
+ 9, 87, 10, 10, 9,
+ 32, 9, 87, 9, 83,
+ 9, 83, 10, 10, 9, 32,
+ 9, 83, 112, 117, 114,
+ 114, 9, 57, 10, 10,
+ 9, 32, 9, 57, 48, 57,
+ 9, 57, 9, 57, 10,
+ 10, 9, 32, 9, 57,
+ 48, 57, 9, 58, 10, 10,
+ 9, 32, 9, 58, 9,
+ 57, 10, 10, 9, 32,
+ 9, 57, 48, 57, 9, 58,
+ 9, 122, 10, 10, 9,
+ 32, 9, 58, 9, 57,
+ 10, 10, 9, 32, 9, 57,
+ 48, 57, 9, 40, 9,
+ 122, 10, 10, 9, 32,
+ 9, 40, 48, 57, 48, 57,
+ 48, 57, 48, 57, 10,
+ 10, 9, 32, 84, 84,
+ 103, 103, 101, 101, 99, 99,
+ 101, 101, 98, 98, 97,
+ 117, 110, 110, 108, 110,
+ 97, 97, 114, 121, 111, 111,
+ 118, 118, 99, 99, 116,
+ 116, 101, 101, 112, 112,
+ 114, 114, 105, 105, 9, 44,
+ 10, 10, 9, 32, 9,
+ 44, 9, 57, 9, 57,
+ 10, 10, 9, 32, 9, 57,
+ 111, 111, 110, 110, 97,
+ 117, 116, 116, 104, 117,
+ 117, 117, 101, 101, 101, 101,
+ 100, 100, 9, 126, 9,
+ 126, 10, 10, 9, 32,
+ 9, 126, 9, 64, 10, 10,
+ 9, 32, 9, 64, 9,
+ 126, 10, 10, 9, 32,
+ 9, 126, 9, 64, 10, 10,
+ 9, 32, 9, 64, 9,
+ 126, 9, 126, 10, 10,
+ 9, 32, 9, 126, 9, 62,
+ 10, 10, 9, 32, 9,
+ 62, 9, 126, 10, 10,
+ 9, 32, 9, 126, 9, 126,
+ 1, 127, 1, 127, 10,
+ 10, 9, 32, 9, 126,
+ 9, 62, 10, 10, 9, 32,
+ 9, 62, 33, 126, -128,
+ -1, 10, 10, 9, 32,
+ 9, 126, 9, 126, 1, 127,
+ 10, 10, 9, 32, -128,
+ -1, 1, 127, 1, 127,
+ 10, 10, 9, 32, 0, 127,
+ 9, 126, 1, 127, 1,
+ 127, 10, 10, 9, 32,
+ 9, 126, 9, 64, 10, 10,
+ 9, 32, 9, 64, 0,
+ 127, 10, 10, 9, 32,
+ 9, 126, 9, 126, 10, 10,
+ 9, 32, 9, 126, 1,
+ 127, 1, 127, 10, 10,
+ 9, 32, 9, 126, 0, 127,
+ 1, 127, 10, 10, 9,
+ 32, 1, 127, 1, 127,
+ 10, 10, 9, 32, 9, 126,
+ 9, 64, 10, 10, 9,
+ 32, 9, 64, 0, 127,
+ 1, 127, 10, 10, 9, 32,
+ 9, 64, 10, 10, 9,
+ 32, 9, 64, 9, 126,
+ 9, 64, 10, 10, 9, 32,
+ 9, 64, 9, 126, 9,
+ 126, 10, 10, 9, 32,
+ 9, 126, 9, 58, 10, 10,
+ 9, 32, 9, 58, 9,
+ 64, 10, 10, 9, 32,
+ 9, 64, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9,
+ 126, 33, 126, 9, 126,
+ 10, 10, 9, 32, 9, 126,
+ 9, 126, 1, 127, 1,
+ 127, 10, 10, 9, 32,
+ 9, 126, 9, 58, 10, 10,
+ 9, 32, 9, 58, 33,
+ 126, 0, 127, 10, 10,
+ 9, 32, 9, 126, 9, 126,
+ 1, 127, 10, 10, 9,
+ 32, 0, 127, 9, 126,
+ 9, 126, 10, 10, 9, 32,
+ 9, 126, 9, 126, 10,
+ 10, 9, 32, 9, 126,
+ 9, 126, 9, 126, 10, 10,
+ 9, 32, 9, 126, 9,
+ 126, 1, 127, 10, 10,
+ 9, 32, 0, 127, 9, 126,
+ 9, 126, 10, 10, 9,
+ 32, 9, 126, 33, 126,
+ 9, 126, 9, 126, 10, 10,
+ 9, 32, 9, 126, 9,
+ 126, 9, 126, 10, 10,
+ 9, 32, 9, 126, 1, 127,
+ 1, 127, 10, 10, 9,
+ 32, 0, 127, 10, 10,
+ 9, 32, 9, 126, 9, 126,
+ 1, 127, 1, 127, 10,
+ 10, 9, 32, 9, 126,
+ 9, 126, 33, 126, 1, 127,
+ 1, 127, 10, 10, 9,
+ 32, 0, 127, 10, 10,
+ 9, 32, -128, -1, 1, 127,
+ 10, 10, 9, 32, 9,
+ 126, 9, 126, 10, 10,
+ 9, 32, 9, 126, 9, 126,
+ 1, 127, 1, 127, 10,
+ 10, 9, 32, 9, 126,
+ 0, 127, 10, 10, 9, 32,
+ 9, 126, 33, 126, 1,
+ 127, 1, 127, 10, 10,
+ 9, 32, 0, 127, 9, 126,
+ 9, 126, 9, 126, 10,
+ 10, 9, 32, 9, 126,
+ 1, 127, 1, 127, 10, 10,
+ 9, 32, -128, -1, 1,
+ 127, 10, 10, 9, 32,
+ 0, 127, 1, 127, 10, 10,
+ 9, 32, 9, 126, 9,
+ 126, 9, 126, 10, 10,
+ 9, 32, 9, 126, 9, 126,
+ 10, 10, 9, 32, 9,
+ 126, 9, 126, 9, 126,
+ 9, 126, 1, 127, 1, 127,
+ 10, 10, 9, 32, 0,
+ 127, 9, 40, 9, 40,
+ 9, 40, 9, 83, 9, 77,
+ 9, 84, 0, 0, 0
+]
+
+class << self
+ attr_accessor :_received_key_spans
+ private :_received_key_spans, :_received_key_spans=
+end
+self._received_key_spans = [
+ 0, 118, 118, 1, 24, 118, 118, 1,
+ 24, 127, 127, 1, 24, 118, 118, 1,
+ 24, 118, 118, 118, 1, 24, 118, 1,
+ 24, 118, 79, 79, 1, 24, 79, 75,
+ 75, 1, 24, 75, 6, 1, 49, 1,
+ 24, 49, 10, 49, 49, 1, 24, 49,
+ 10, 50, 1, 24, 50, 49, 1, 24,
+ 49, 10, 50, 114, 1, 24, 50, 49,
+ 1, 24, 49, 10, 32, 114, 1, 24,
+ 32, 10, 10, 10, 10, 1, 24, 1,
+ 1, 1, 1, 1, 1, 21, 1, 3,
+ 1, 8, 1, 1, 1, 1, 1, 1,
+ 1, 1, 36, 1, 24, 36, 49, 49,
+ 1, 24, 49, 1, 1, 21, 1, 14,
+ 1, 1, 1, 1, 118, 118, 1, 24,
+ 118, 56, 1, 24, 56, 118, 1, 24,
+ 118, 56, 1, 24, 56, 118, 118, 1,
+ 24, 118, 54, 1, 24, 54, 118, 1,
+ 24, 118, 118, 127, 127, 1, 24, 118,
+ 54, 1, 24, 54, 94, 128, 1, 24,
+ 118, 118, 127, 1, 24, 128, 127, 127,
+ 1, 24, 128, 118, 127, 127, 1, 24,
+ 118, 56, 1, 24, 56, 128, 1, 24,
+ 118, 118, 1, 24, 118, 127, 127, 1,
+ 24, 118, 128, 127, 1, 24, 127, 127,
+ 1, 24, 118, 56, 1, 24, 56, 128,
+ 127, 1, 24, 56, 1, 24, 56, 118,
+ 56, 1, 24, 56, 118, 118, 1, 24,
+ 118, 50, 1, 24, 50, 56, 1, 24,
+ 56, 118, 118, 1, 24, 118, 94, 118,
+ 1, 24, 118, 118, 127, 127, 1, 24,
+ 118, 50, 1, 24, 50, 94, 128, 1,
+ 24, 118, 118, 127, 1, 24, 128, 118,
+ 118, 1, 24, 118, 118, 1, 24, 118,
+ 118, 118, 1, 24, 118, 118, 127, 1,
+ 24, 128, 118, 118, 1, 24, 118, 94,
+ 118, 118, 1, 24, 118, 118, 118, 1,
+ 24, 118, 127, 127, 1, 24, 128, 1,
+ 24, 118, 118, 127, 127, 1, 24, 118,
+ 118, 94, 127, 127, 1, 24, 128, 1,
+ 24, 128, 127, 1, 24, 118, 118, 1,
+ 24, 118, 118, 127, 127, 1, 24, 118,
+ 128, 1, 24, 118, 94, 127, 127, 1,
+ 24, 128, 118, 118, 118, 1, 24, 118,
+ 127, 127, 1, 24, 128, 127, 1, 24,
+ 128, 127, 1, 24, 118, 118, 118, 1,
+ 24, 118, 118, 1, 24, 118, 118, 118,
+ 118, 127, 127, 1, 24, 128, 32, 32,
+ 32, 75, 69, 76, 0
+]
+
+class << self
+ attr_accessor :_received_index_offsets
+ private :_received_index_offsets, :_received_index_offsets=
+end
+self._received_index_offsets = [
+ 0, 0, 119, 238, 240, 265, 384, 503,
+ 505, 530, 658, 786, 788, 813, 932, 1051,
+ 1053, 1078, 1197, 1316, 1435, 1437, 1462, 1581,
+ 1583, 1608, 1727, 1807, 1887, 1889, 1914, 1994,
+ 2070, 2146, 2148, 2173, 2249, 2256, 2258, 2308,
+ 2310, 2335, 2385, 2396, 2446, 2496, 2498, 2523,
+ 2573, 2584, 2635, 2637, 2662, 2713, 2763, 2765,
+ 2790, 2840, 2851, 2902, 3017, 3019, 3044, 3095,
+ 3145, 3147, 3172, 3222, 3233, 3266, 3381, 3383,
+ 3408, 3441, 3452, 3463, 3474, 3485, 3487, 3512,
+ 3514, 3516, 3518, 3520, 3522, 3524, 3546, 3548,
+ 3552, 3554, 3563, 3565, 3567, 3569, 3571, 3573,
+ 3575, 3577, 3579, 3616, 3618, 3643, 3680, 3730,
+ 3780, 3782, 3807, 3857, 3859, 3861, 3883, 3885,
+ 3900, 3902, 3904, 3906, 3908, 4027, 4146, 4148,
+ 4173, 4292, 4349, 4351, 4376, 4433, 4552, 4554,
+ 4579, 4698, 4755, 4757, 4782, 4839, 4958, 5077,
+ 5079, 5104, 5223, 5278, 5280, 5305, 5360, 5479,
+ 5481, 5506, 5625, 5744, 5872, 6000, 6002, 6027,
+ 6146, 6201, 6203, 6228, 6283, 6378, 6507, 6509,
+ 6534, 6653, 6772, 6900, 6902, 6927, 7056, 7184,
+ 7312, 7314, 7339, 7468, 7587, 7715, 7843, 7845,
+ 7870, 7989, 8046, 8048, 8073, 8130, 8259, 8261,
+ 8286, 8405, 8524, 8526, 8551, 8670, 8798, 8926,
+ 8928, 8953, 9072, 9201, 9329, 9331, 9356, 9484,
+ 9612, 9614, 9639, 9758, 9815, 9817, 9842, 9899,
+ 10028, 10156, 10158, 10183, 10240, 10242, 10267, 10324,
+ 10443, 10500, 10502, 10527, 10584, 10703, 10822, 10824,
+ 10849, 10968, 11019, 11021, 11046, 11097, 11154, 11156,
+ 11181, 11238, 11357, 11476, 11478, 11503, 11622, 11717,
+ 11836, 11838, 11863, 11982, 12101, 12229, 12357, 12359,
+ 12384, 12503, 12554, 12556, 12581, 12632, 12727, 12856,
+ 12858, 12883, 13002, 13121, 13249, 13251, 13276, 13405,
+ 13524, 13643, 13645, 13670, 13789, 13908, 13910, 13935,
+ 14054, 14173, 14292, 14294, 14319, 14438, 14557, 14685,
+ 14687, 14712, 14841, 14960, 15079, 15081, 15106, 15225,
+ 15320, 15439, 15558, 15560, 15585, 15704, 15823, 15942,
+ 15944, 15969, 16088, 16216, 16344, 16346, 16371, 16500,
+ 16502, 16527, 16646, 16765, 16893, 17021, 17023, 17048,
+ 17167, 17286, 17381, 17509, 17637, 17639, 17664, 17793,
+ 17795, 17820, 17949, 18077, 18079, 18104, 18223, 18342,
+ 18344, 18369, 18488, 18607, 18735, 18863, 18865, 18890,
+ 19009, 19138, 19140, 19165, 19284, 19379, 19507, 19635,
+ 19637, 19662, 19791, 19910, 20029, 20148, 20150, 20175,
+ 20294, 20422, 20550, 20552, 20577, 20706, 20834, 20836,
+ 20861, 20990, 21118, 21120, 21145, 21264, 21383, 21502,
+ 21504, 21529, 21648, 21767, 21769, 21794, 21913, 22032,
+ 22151, 22270, 22398, 22526, 22528, 22553, 22682, 22715,
+ 22748, 22781, 22857, 22927, 23004
+]
+
+class << self
+ attr_accessor :_received_indicies
+ private :_received_indicies, :_received_indicies=
+end
+self._received_indicies = [
+ 0, 1, 1, 1, 2, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 0,
+ 3, 4, 3, 3, 3, 3, 3, 5,
+ 1, 3, 3, 1, 3, 6, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 1, 7, 8, 3, 1, 3, 1,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 9, 1, 1, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 1, 10,
+ 1, 1, 1, 11, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 10, 12,
+ 13, 12, 12, 12, 12, 12, 14, 1,
+ 12, 12, 1, 12, 15, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 1, 16, 17, 12, 1, 12, 1, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 18, 1, 1, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 1, 19, 1,
+ 20, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 20,
+ 1, 21, 1, 1, 1, 22, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 21, 23, 24, 23, 23, 23, 23, 23,
+ 25, 1, 23, 23, 1, 23, 26, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 1, 27, 28, 23, 1, 23,
+ 29, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 30, 1, 1, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 1,
+ 31, 1, 1, 1, 32, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 31,
+ 33, 34, 33, 33, 33, 33, 33, 35,
+ 1, 33, 33, 1, 33, 36, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 1, 37, 38, 33, 1, 33, 39,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 40, 1, 1, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 1, 41,
+ 1, 42, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 42, 1, 43, 43, 43, 43, 43, 43,
+ 43, 43, 44, 1, 43, 43, 45, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 44, 43, 46, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 47, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 1, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 1, 48, 48, 49, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 50, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 51, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 1, 52, 1, 48, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 48, 1, 53, 1, 1,
+ 1, 54, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 53, 55, 56, 55,
+ 55, 55, 55, 55, 57, 1, 55, 55,
+ 1, 55, 58, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 1, 59,
+ 60, 55, 1, 55, 61, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 62,
+ 1, 1, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 1, 63, 1, 1, 1,
+ 64, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 63, 65, 66, 65, 65,
+ 65, 65, 65, 67, 1, 65, 65, 1,
+ 65, 68, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 1, 69, 70,
+ 65, 1, 65, 71, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 72, 1,
+ 1, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 65, 65, 65,
+ 65, 65, 1, 73, 1, 74, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 74, 1, 75, 1,
+ 1, 1, 76, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 75, 77, 78,
+ 77, 77, 77, 77, 77, 79, 1, 77,
+ 77, 1, 77, 80, 77, 77, 77, 77,
+ 77, 77, 77, 77, 77, 77, 77, 1,
+ 81, 82, 77, 1, 77, 83, 77, 77,
+ 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 77, 77, 77, 77, 77, 77,
+ 84, 1, 1, 77, 77, 77, 77, 77,
+ 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 77, 77, 77, 77, 77, 77,
+ 77, 77, 77, 77, 1, 85, 1, 1,
+ 1, 86, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 85, 87, 88, 87,
+ 87, 87, 87, 87, 89, 1, 87, 87,
+ 1, 87, 90, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 1, 1,
+ 1, 87, 1, 87, 1, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 1,
+ 1, 1, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 1, 85, 1, 1, 1,
+ 86, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 85, 91, 92, 91, 91,
+ 91, 91, 91, 89, 1, 91, 91, 1,
+ 91, 1, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 1, 1, 1,
+ 91, 1, 91, 1, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 1, 1,
+ 1, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91,
+ 91, 91, 1, 93, 1, 85, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 85, 1, 94, 1,
+ 1, 1, 95, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 94, 12, 13,
+ 12, 12, 12, 12, 12, 96, 1, 12,
+ 12, 1, 12, 97, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 1,
+ 16, 17, 12, 1, 12, 98, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 18, 1, 1, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ 12, 12, 12, 12, 1, 99, 1, 91,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 91, 1,
+ 100, 1, 1, 1, 101, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 100,
+ 102, 103, 102, 102, 102, 102, 102, 104,
+ 1, 102, 102, 1, 102, 105, 102, 102,
+ 102, 102, 102, 102, 102, 102, 102, 102,
+ 102, 1, 106, 107, 102, 1, 102, 108,
+ 102, 102, 102, 102, 102, 102, 102, 102,
+ 102, 102, 102, 102, 102, 102, 102, 102,
+ 102, 102, 102, 102, 102, 102, 102, 102,
+ 102, 102, 109, 1, 1, 102, 102, 102,
+ 102, 102, 102, 102, 102, 102, 102, 102,
+ 102, 102, 102, 102, 102, 102, 102, 102,
+ 102, 102, 102, 102, 102, 102, 102, 102,
+ 102, 102, 102, 102, 102, 102, 1, 110,
+ 1, 1, 1, 111, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 110, 1,
+ 1, 1, 1, 1, 1, 1, 112, 1,
+ 1, 1, 1, 1, 1, 1, 113, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 114, 1, 1, 1,
+ 1, 1, 1, 115, 1, 1, 1, 1,
+ 1, 116, 117, 1, 1, 118, 1, 119,
+ 1, 1, 1, 120, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 119, 1,
+ 1, 1, 1, 1, 1, 1, 121, 1,
+ 1, 1, 1, 1, 1, 1, 122, 122,
+ 122, 122, 122, 122, 122, 122, 122, 122,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 114, 1, 1, 1,
+ 1, 1, 1, 115, 1, 1, 1, 1,
+ 1, 116, 117, 1, 1, 118, 1, 123,
+ 1, 119, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 119, 1, 124, 1, 1, 1, 125, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 124, 1, 1, 1, 1, 1, 1,
+ 1, 126, 1, 1, 1, 1, 1, 1,
+ 1, 127, 127, 127, 127, 127, 127, 127,
+ 127, 127, 127, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 128,
+ 1, 1, 1, 1, 1, 1, 129, 1,
+ 1, 1, 1, 1, 130, 131, 1, 1,
+ 132, 1, 133, 1, 1, 1, 134, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 133, 1, 1, 1, 1, 1, 1,
+ 1, 135, 1, 1, 1, 1, 1, 1,
+ 1, 133, 133, 133, 133, 133, 133, 133,
+ 133, 133, 133, 1, 1, 1, 1, 1,
+ 1, 1, 136, 1, 1, 137, 1, 138,
+ 1, 1, 1, 139, 1, 1, 140, 141,
+ 142, 1, 1, 1, 143, 1, 133, 1,
+ 1, 1, 134, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 133, 1, 1,
+ 1, 1, 1, 1, 1, 135, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 136, 1,
+ 1, 137, 1, 138, 1, 1, 1, 139,
+ 1, 1, 140, 141, 142, 1, 1, 1,
+ 143, 1, 144, 1, 133, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 133, 1, 145, 1, 1,
+ 1, 146, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 145, 1, 1, 1,
+ 1, 1, 1, 1, 147, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 148, 1, 1,
+ 149, 1, 150, 1, 1, 1, 151, 1,
+ 1, 152, 153, 154, 1, 1, 1, 155,
+ 1, 156, 1, 1, 1, 1, 157, 1,
+ 158, 1, 158, 1, 1, 1, 159, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 158, 1, 1, 1, 1, 1, 1,
+ 1, 160, 1, 1, 1, 1, 1, 1,
+ 1, 161, 161, 161, 161, 161, 161, 161,
+ 161, 161, 161, 1, 162, 1, 158, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 158, 1, 163,
+ 1, 1, 1, 164, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 163, 1,
+ 1, 1, 1, 1, 1, 1, 165, 1,
+ 1, 1, 1, 1, 1, 1, 166, 166,
+ 166, 166, 166, 166, 166, 166, 166, 166,
+ 1, 167, 167, 167, 167, 167, 167, 167,
+ 167, 167, 167, 1, 168, 1, 1, 1,
+ 169, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 168, 1, 1, 1, 1,
+ 1, 1, 1, 170, 1, 1, 1, 1,
+ 1, 1, 1, 167, 167, 167, 167, 167,
+ 167, 167, 167, 167, 167, 1, 168, 1,
+ 1, 1, 169, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 168, 1, 1,
+ 1, 1, 1, 1, 1, 170, 1, 1,
+ 1, 1, 1, 1, 1, 171, 171, 171,
+ 171, 171, 171, 171, 171, 171, 171, 1,
+ 172, 1, 168, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 168, 1, 173, 1, 1, 1, 174,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 173, 1, 1, 1, 1, 1,
+ 1, 1, 175, 1, 1, 1, 1, 1,
+ 1, 1, 176, 176, 176, 176, 176, 176,
+ 176, 176, 176, 176, 1, 177, 177, 177,
+ 177, 177, 177, 177, 177, 177, 177, 1,
+ 177, 1, 1, 1, 178, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 177,
+ 1, 1, 1, 1, 1, 1, 1, 179,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 180, 1, 181, 1, 177, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 177, 1, 182, 1,
+ 1, 1, 183, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 182, 1, 1,
+ 1, 1, 1, 1, 1, 184, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 185,
+ 1, 180, 1, 1, 1, 186, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 180, 1, 1, 1, 1, 1, 1, 1,
+ 187, 1, 1, 1, 1, 1, 1, 1,
+ 188, 188, 188, 188, 188, 188, 188, 188,
+ 188, 188, 1, 189, 1, 180, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 180, 1, 185, 1,
+ 1, 1, 190, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 185, 1, 1,
+ 1, 1, 1, 1, 1, 191, 1, 1,
+ 1, 1, 1, 1, 1, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 1,
+ 193, 193, 193, 193, 193, 193, 193, 193,
+ 193, 193, 1, 194, 1, 1, 1, 195,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 194, 1, 1, 1, 1, 1,
+ 1, 1, 196, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 197, 1, 194, 1,
+ 1, 1, 195, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 194, 1, 1,
+ 1, 1, 1, 1, 1, 196, 1, 1,
+ 198, 1, 198, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 197,
+ 1, 1, 1, 1, 1, 1, 199, 199,
+ 200, 199, 200, 199, 201, 199, 199, 1,
+ 199, 199, 200, 199, 199, 200, 199, 199,
+ 199, 199, 202, 199, 199, 199, 199, 199,
+ 1, 1, 1, 1, 1, 1, 199, 199,
+ 199, 199, 199, 199, 199, 199, 199, 1,
+ 199, 199, 199, 199, 199, 199, 199, 199,
+ 199, 199, 199, 199, 199, 199, 199, 199,
+ 1, 203, 1, 194, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 194, 1, 204, 1, 1, 1,
+ 205, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 204, 1, 1, 1, 1,
+ 1, 1, 1, 206, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 207, 1, 197,
+ 1, 1, 1, 208, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 197, 1,
+ 1, 1, 1, 1, 1, 1, 209, 1,
+ 1, 1, 1, 1, 1, 1, 210, 210,
+ 210, 210, 210, 210, 210, 210, 210, 210,
+ 1, 211, 1, 197, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 197, 1, 207, 1, 1, 1,
+ 212, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 207, 1, 1, 1, 1,
+ 1, 1, 1, 213, 1, 1, 1, 1,
+ 1, 1, 1, 214, 214, 214, 214, 214,
+ 214, 214, 214, 214, 214, 1, 215, 215,
+ 215, 215, 215, 215, 215, 215, 215, 215,
+ 1, 216, 1, 1, 1, 217, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 216, 1, 1, 1, 1, 1, 1, 1,
+ 218, 1, 216, 1, 1, 1, 217, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 216, 1, 1, 1, 1, 1, 1,
+ 1, 218, 1, 1, 198, 1, 198, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 199, 199, 200, 199, 200, 199,
+ 201, 199, 199, 1, 199, 199, 200, 199,
+ 199, 200, 199, 199, 199, 199, 202, 199,
+ 199, 199, 199, 199, 1, 1, 1, 1,
+ 1, 1, 199, 199, 199, 199, 199, 199,
+ 199, 199, 199, 1, 199, 199, 199, 199,
+ 199, 199, 199, 199, 199, 199, 199, 199,
+ 199, 199, 199, 199, 1, 219, 1, 216,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 216, 1,
+ 220, 1, 1, 1, 221, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 220,
+ 1, 1, 1, 1, 1, 1, 1, 222,
+ 1, 223, 223, 223, 223, 223, 223, 223,
+ 223, 223, 223, 1, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 1, 225,
+ 225, 225, 225, 225, 225, 225, 225, 225,
+ 225, 1, 199, 199, 199, 199, 199, 199,
+ 199, 199, 199, 199, 1, 226, 1, 227,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 227, 1,
+ 199, 1, 158, 1, 228, 1, 158, 1,
+ 229, 1, 158, 1, 230, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 231, 1, 158, 1, 158, 1, 158, 1,
+ 232, 1, 158, 1, 1, 1, 1, 1,
+ 1, 158, 1, 233, 1, 158, 1, 234,
+ 1, 158, 1, 235, 1, 158, 1, 236,
+ 1, 237, 1, 237, 1, 1, 1, 238,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 237, 1, 1, 1, 1, 1,
+ 1, 1, 239, 1, 1, 1, 240, 1,
+ 241, 1, 237, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 237, 1, 242, 1, 1, 1, 243,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 242, 1, 1, 1, 1, 1,
+ 1, 1, 244, 1, 1, 1, 245, 1,
+ 246, 1, 1, 1, 247, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 246,
+ 1, 1, 1, 1, 1, 1, 1, 248,
+ 1, 1, 1, 1, 1, 1, 1, 113,
+ 113, 113, 113, 113, 113, 113, 113, 113,
+ 113, 1, 249, 1, 1, 1, 250, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 249, 1, 1, 1, 1, 1, 1,
+ 1, 251, 1, 1, 1, 1, 1, 1,
+ 1, 122, 122, 122, 122, 122, 122, 122,
+ 122, 122, 122, 1, 252, 1, 249, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 249, 1, 253,
+ 1, 1, 1, 254, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 253, 1,
+ 1, 1, 1, 1, 1, 1, 255, 1,
+ 1, 1, 1, 1, 1, 1, 127, 127,
+ 127, 127, 127, 127, 127, 127, 127, 127,
+ 1, 256, 1, 237, 1, 257, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 256, 1, 237, 1, 258, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 259, 1, 237, 1, 237, 1,
+ 260, 1, 237, 1, 261, 1, 1, 1,
+ 262, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 261, 263, 264, 263, 263,
+ 263, 263, 263, 265, 1, 263, 263, 266,
+ 263, 267, 263, 263, 263, 263, 263, 263,
+ 263, 263, 263, 263, 263, 1, 1, 1,
+ 263, 1, 263, 268, 263, 263, 263, 263,
+ 263, 263, 263, 263, 263, 263, 263, 263,
+ 263, 263, 263, 263, 263, 263, 263, 263,
+ 263, 263, 263, 263, 263, 263, 1, 1,
+ 1, 263, 263, 263, 263, 263, 263, 263,
+ 263, 263, 263, 263, 263, 263, 263, 263,
+ 263, 263, 263, 263, 263, 263, 263, 263,
+ 263, 263, 263, 263, 263, 263, 263, 263,
+ 263, 263, 1, 269, 1, 1, 1, 270,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 269, 263, 264, 263, 263, 263,
+ 263, 263, 271, 1, 263, 263, 272, 263,
+ 267, 263, 263, 263, 263, 263, 263, 263,
+ 263, 263, 263, 263, 1, 1, 1, 263,
+ 1, 263, 273, 263, 263, 263, 263, 263,
+ 263, 263, 263, 263, 263, 263, 263, 263,
+ 263, 263, 263, 263, 263, 263, 263, 263,
+ 263, 263, 263, 263, 263, 1, 1, 1,
+ 263, 263, 263, 263, 263, 263, 263, 263,
+ 263, 263, 263, 263, 263, 263, 263, 263,
+ 263, 263, 263, 263, 263, 263, 263, 263,
+ 263, 263, 263, 263, 263, 263, 263, 263,
+ 263, 1, 274, 1, 269, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 269, 1, 275, 1, 1,
+ 1, 276, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 275, 277, 278, 277,
+ 277, 277, 277, 277, 279, 1, 277, 277,
+ 1, 277, 280, 277, 277, 277, 277, 277,
+ 277, 277, 277, 277, 277, 277, 1, 1,
+ 1, 277, 281, 277, 282, 277, 277, 277,
+ 277, 277, 277, 277, 277, 277, 277, 277,
+ 277, 277, 277, 277, 277, 277, 277, 277,
+ 277, 277, 277, 277, 277, 277, 277, 1,
+ 1, 1, 277, 277, 277, 277, 277, 277,
+ 277, 277, 277, 277, 277, 277, 277, 277,
+ 277, 277, 277, 277, 277, 277, 277, 277,
+ 277, 277, 277, 277, 277, 277, 277, 277,
+ 277, 277, 277, 1, 283, 1, 1, 1,
+ 284, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 283, 1, 1, 1, 1,
+ 1, 1, 1, 285, 1, 1, 1, 1,
+ 1, 286, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 20, 1, 287, 1, 288, 1, 283,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 283, 1,
+ 289, 1, 1, 1, 290, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 289,
+ 1, 1, 1, 1, 1, 1, 1, 291,
+ 1, 1, 1, 1, 1, 292, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 293, 1, 294,
+ 1, 286, 1, 1, 1, 295, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 286, 296, 297, 296, 296, 296, 296, 296,
+ 298, 1, 296, 296, 1, 296, 1, 296,
+ 296, 296, 296, 296, 296, 296, 296, 296,
+ 296, 296, 1, 1, 1, 296, 1, 296,
+ 1, 296, 296, 296, 296, 296, 296, 296,
+ 296, 296, 296, 296, 296, 296, 296, 296,
+ 296, 296, 296, 296, 296, 296, 296, 296,
+ 296, 296, 296, 1, 1, 1, 296, 296,
+ 296, 296, 296, 296, 296, 296, 296, 296,
+ 296, 296, 296, 296, 296, 296, 296, 296,
+ 296, 296, 296, 296, 296, 296, 296, 296,
+ 296, 296, 296, 296, 296, 296, 296, 1,
+ 299, 1, 286, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 286, 1, 300, 1, 1, 1, 301,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 300, 296, 1, 296, 296, 296,
+ 296, 296, 302, 1, 296, 296, 1, 296,
+ 286, 296, 296, 296, 296, 296, 296, 296,
+ 296, 296, 296, 296, 1, 1, 1, 296,
+ 20, 296, 303, 296, 296, 296, 296, 296,
+ 296, 296, 296, 296, 296, 296, 296, 296,
+ 296, 296, 296, 296, 296, 296, 296, 296,
+ 296, 296, 296, 296, 296, 1, 1, 1,
+ 296, 296, 296, 296, 296, 296, 296, 296,
+ 296, 296, 296, 296, 296, 296, 296, 296,
+ 296, 296, 296, 296, 296, 296, 296, 296,
+ 296, 296, 296, 296, 296, 296, 296, 296,
+ 296, 1, 300, 1, 1, 1, 301, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 300, 1, 1, 1, 1, 1, 1,
+ 1, 302, 1, 1, 1, 1, 1, 286,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 20,
+ 1, 303, 1, 304, 1, 300, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 300, 1, 305, 1,
+ 1, 1, 306, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 305, 1, 1,
+ 1, 1, 1, 1, 1, 307, 1, 1,
+ 1, 1, 1, 292, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 293, 1, 308, 1, 309,
+ 1, 1, 1, 310, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 309, 311,
+ 312, 311, 311, 311, 311, 311, 313, 1,
+ 311, 311, 1, 311, 314, 311, 311, 311,
+ 311, 311, 311, 311, 311, 311, 311, 311,
+ 1, 1, 1, 311, 1, 311, 1, 311,
+ 311, 311, 311, 311, 311, 311, 311, 311,
+ 311, 311, 311, 311, 311, 311, 311, 311,
+ 311, 311, 311, 311, 311, 311, 311, 311,
+ 311, 315, 1, 1, 311, 311, 311, 311,
+ 311, 311, 311, 311, 311, 311, 311, 311,
+ 311, 311, 311, 311, 311, 311, 311, 311,
+ 311, 311, 311, 311, 311, 311, 311, 311,
+ 311, 311, 311, 311, 311, 1, 316, 1,
+ 1, 1, 317, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 316, 318, 319,
+ 318, 318, 318, 318, 318, 320, 1, 318,
+ 318, 1, 318, 321, 318, 318, 318, 318,
+ 318, 318, 318, 318, 318, 318, 318, 1,
+ 1, 1, 318, 1, 318, 1, 318, 318,
+ 318, 318, 318, 318, 318, 318, 318, 318,
+ 318, 318, 318, 318, 318, 318, 318, 318,
+ 318, 318, 318, 318, 318, 318, 318, 318,
+ 322, 1, 1, 318, 318, 318, 318, 318,
+ 318, 318, 318, 318, 318, 318, 318, 318,
+ 318, 318, 318, 318, 318, 318, 318, 318,
+ 318, 318, 318, 318, 318, 318, 318, 318,
+ 318, 318, 318, 318, 1, 323, 1, 316,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 316, 1,
+ 324, 1, 1, 1, 325, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 324,
+ 318, 319, 318, 318, 318, 318, 318, 326,
+ 1, 318, 318, 1, 318, 327, 318, 318,
+ 318, 318, 318, 318, 318, 318, 318, 318,
+ 318, 1, 1, 1, 318, 328, 318, 1,
+ 318, 318, 318, 318, 318, 318, 318, 318,
+ 318, 318, 318, 318, 318, 318, 318, 318,
+ 318, 318, 318, 318, 318, 318, 318, 318,
+ 318, 318, 1, 1, 1, 318, 318, 318,
+ 318, 318, 318, 318, 318, 318, 318, 318,
+ 318, 318, 318, 318, 318, 318, 318, 318,
+ 318, 318, 318, 318, 318, 318, 318, 318,
+ 318, 318, 318, 318, 318, 318, 1, 324,
+ 1, 1, 1, 325, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 324, 1,
+ 1, 1, 1, 1, 1, 1, 326, 1,
+ 1, 1, 1, 1, 329, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 328, 1, 330, 1,
+ 324, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 324,
+ 1, 331, 1, 1, 1, 332, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 331, 1, 1, 1, 1, 1, 1, 1,
+ 333, 1, 1, 1, 1, 1, 334, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 335, 1,
+ 329, 1, 1, 1, 336, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 329,
+ 337, 1, 337, 337, 337, 337, 337, 338,
+ 1, 337, 337, 1, 337, 1, 337, 337,
+ 337, 337, 337, 337, 337, 337, 337, 337,
+ 337, 1, 1, 1, 337, 1, 337, 1,
+ 337, 337, 337, 337, 337, 337, 337, 337,
+ 337, 337, 337, 337, 337, 337, 337, 337,
+ 337, 337, 337, 337, 337, 337, 337, 337,
+ 337, 337, 1, 1, 1, 337, 337, 337,
+ 337, 337, 337, 337, 337, 337, 337, 337,
+ 337, 337, 337, 337, 337, 337, 337, 337,
+ 337, 337, 337, 337, 337, 337, 337, 337,
+ 337, 337, 337, 337, 337, 337, 1, 339,
+ 1, 329, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 329, 1, 324, 1, 1, 1, 325, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 324, 337, 1, 337, 337, 337, 337,
+ 337, 326, 1, 337, 337, 1, 337, 329,
+ 337, 337, 337, 337, 337, 337, 337, 337,
+ 337, 337, 337, 1, 1, 1, 337, 328,
+ 337, 1, 337, 337, 337, 337, 337, 337,
+ 337, 337, 337, 337, 337, 337, 337, 337,
+ 337, 337, 337, 337, 337, 337, 337, 337,
+ 337, 337, 337, 337, 1, 1, 1, 337,
+ 337, 337, 337, 337, 337, 337, 337, 337,
+ 337, 337, 337, 337, 337, 337, 337, 337,
+ 337, 337, 337, 337, 337, 337, 337, 337,
+ 337, 337, 337, 337, 337, 337, 337, 337,
+ 1, 334, 1, 1, 1, 340, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 334, 341, 1, 341, 341, 341, 341, 341,
+ 342, 1, 341, 341, 1, 341, 1, 341,
+ 341, 341, 341, 341, 341, 341, 341, 341,
+ 341, 341, 1, 1, 1, 341, 1, 341,
+ 1, 341, 341, 341, 341, 341, 341, 341,
+ 341, 341, 341, 341, 341, 341, 341, 341,
+ 341, 341, 341, 341, 341, 341, 341, 341,
+ 341, 341, 341, 1, 1, 1, 341, 341,
+ 341, 341, 341, 341, 341, 341, 341, 341,
+ 341, 341, 341, 341, 341, 341, 341, 341,
+ 341, 341, 341, 341, 341, 341, 341, 341,
+ 341, 341, 341, 341, 341, 341, 341, 1,
+ 343, 343, 343, 343, 343, 343, 343, 343,
+ 319, 1, 343, 343, 344, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 319,
+ 343, 1, 343, 343, 343, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 343, 345, 343, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 1,
+ 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 1, 343, 343, 346, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 347, 343, 343, 343, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 343, 345, 343, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 1,
+ 348, 1, 343, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 343, 1, 349, 1, 1, 1, 350,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 349, 347, 319, 347, 347, 347,
+ 347, 347, 351, 1, 347, 347, 1, 347,
+ 321, 347, 347, 347, 347, 347, 347, 347,
+ 347, 347, 347, 347, 1, 1, 1, 347,
+ 328, 347, 1, 347, 347, 347, 347, 347,
+ 347, 347, 347, 347, 347, 347, 347, 347,
+ 347, 347, 347, 347, 347, 347, 347, 347,
+ 347, 347, 347, 347, 347, 1, 1, 1,
+ 347, 347, 347, 347, 347, 347, 347, 347,
+ 347, 347, 347, 347, 347, 347, 347, 347,
+ 347, 347, 347, 347, 347, 347, 347, 347,
+ 347, 347, 347, 347, 347, 347, 347, 347,
+ 347, 1, 349, 1, 1, 1, 350, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 349, 1, 1, 1, 1, 1, 1,
+ 1, 351, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 328,
+ 1, 352, 1, 349, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 349, 1, 353, 1, 1, 1,
+ 354, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 353, 1, 1, 1, 1,
+ 1, 1, 1, 355, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 335, 1, 347, 319, 347, 347, 347,
+ 347, 347, 1, 1, 347, 347, 1, 347,
+ 321, 347, 347, 347, 347, 347, 347, 347,
+ 347, 347, 347, 347, 1, 1, 1, 347,
+ 1, 347, 1, 347, 347, 347, 347, 347,
+ 347, 347, 347, 347, 347, 347, 347, 347,
+ 347, 347, 347, 347, 347, 347, 347, 347,
+ 347, 347, 347, 347, 347, 1, 1, 1,
+ 347, 347, 347, 347, 347, 347, 347, 347,
+ 347, 347, 347, 347, 347, 347, 347, 347,
+ 347, 347, 347, 347, 347, 347, 347, 347,
+ 347, 347, 347, 347, 347, 347, 347, 347,
+ 347, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 343, 356, 1, 319, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 319, 1, 329, 1,
+ 1, 1, 336, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 329, 318, 319,
+ 318, 318, 318, 318, 318, 338, 1, 318,
+ 318, 1, 318, 321, 318, 318, 318, 318,
+ 318, 318, 318, 318, 318, 318, 318, 1,
+ 1, 1, 318, 1, 318, 1, 318, 318,
+ 318, 318, 318, 318, 318, 318, 318, 318,
+ 318, 318, 318, 318, 318, 318, 318, 318,
+ 318, 318, 318, 318, 318, 318, 318, 318,
+ 1, 1, 1, 318, 318, 318, 318, 318,
+ 318, 318, 318, 318, 318, 318, 318, 318,
+ 318, 318, 318, 318, 318, 318, 318, 318,
+ 318, 318, 318, 318, 318, 318, 318, 318,
+ 318, 318, 318, 318, 1, 357, 1, 1,
+ 1, 358, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 357, 359, 360, 359,
+ 359, 359, 359, 359, 361, 1, 359, 359,
+ 1, 359, 362, 359, 359, 359, 359, 359,
+ 359, 359, 359, 359, 359, 359, 1, 1,
+ 1, 359, 1, 359, 1, 359, 359, 359,
+ 359, 359, 359, 359, 359, 359, 359, 359,
+ 359, 359, 359, 359, 359, 359, 359, 359,
+ 359, 359, 359, 359, 359, 359, 359, 363,
+ 1, 1, 359, 359, 359, 359, 359, 359,
+ 359, 359, 359, 359, 359, 359, 359, 359,
+ 359, 359, 359, 359, 359, 359, 359, 359,
+ 359, 359, 359, 359, 359, 359, 359, 359,
+ 359, 359, 359, 1, 322, 322, 322, 322,
+ 322, 322, 322, 322, 322, 1, 322, 322,
+ 364, 322, 322, 322, 322, 322, 322, 322,
+ 322, 322, 322, 322, 322, 322, 322, 322,
+ 322, 322, 322, 322, 322, 322, 322, 322,
+ 322, 322, 322, 322, 322, 322, 322, 322,
+ 322, 322, 322, 322, 322, 322, 322, 322,
+ 322, 322, 322, 322, 322, 322, 322, 322,
+ 322, 322, 322, 322, 322, 322, 322, 322,
+ 322, 322, 322, 322, 322, 322, 322, 322,
+ 322, 322, 322, 322, 322, 322, 322, 322,
+ 322, 322, 322, 322, 322, 322, 1, 365,
+ 349, 322, 322, 322, 322, 322, 322, 322,
+ 322, 322, 322, 322, 322, 322, 322, 322,
+ 322, 322, 322, 322, 322, 322, 322, 322,
+ 322, 322, 322, 322, 322, 322, 322, 322,
+ 322, 322, 322, 1, 366, 1, 322, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 322, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 322,
+ 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 1, 367, 367, 368, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 369, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 370, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 367, 367, 367, 1,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 1, 371, 371, 372, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 373, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 374, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 1,
+ 375, 1, 371, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 371, 1, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 371, 371, 371, 371, 371,
+ 371, 371, 371, 1, 292, 1, 1, 1,
+ 376, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 292, 377, 378, 377, 377,
+ 377, 377, 377, 379, 1, 377, 377, 1,
+ 377, 1, 377, 377, 377, 377, 377, 377,
+ 377, 377, 377, 377, 377, 1, 1, 1,
+ 377, 1, 377, 1, 377, 377, 377, 377,
+ 377, 377, 377, 377, 377, 377, 377, 377,
+ 377, 377, 377, 377, 377, 377, 377, 377,
+ 377, 377, 377, 377, 377, 377, 1, 1,
+ 1, 377, 377, 377, 377, 377, 377, 377,
+ 377, 377, 377, 377, 377, 377, 377, 377,
+ 377, 377, 377, 377, 377, 377, 377, 377,
+ 377, 377, 377, 377, 377, 377, 377, 377,
+ 377, 377, 1, 380, 380, 380, 380, 380,
+ 380, 380, 380, 278, 1, 380, 380, 381,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 278, 380, 1, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 382, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 1, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 1, 380, 380, 383,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 384, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 382, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 1, 385, 1, 380, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 380, 1, 386, 1,
+ 1, 1, 387, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 386, 384, 278,
+ 384, 384, 384, 384, 384, 388, 1, 384,
+ 384, 1, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 1,
+ 1, 1, 384, 281, 384, 282, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384,
+ 1, 1, 1, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 1, 389, 1, 1,
+ 1, 390, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 389, 1, 1, 1,
+ 1, 1, 1, 1, 391, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 20, 1, 287, 1, 392, 1,
+ 389, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 389,
+ 1, 393, 1, 1, 1, 394, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 393, 1, 1, 1, 1, 1, 1, 1,
+ 395, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 293, 1,
+ 294, 1, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 1, 396, 1, 278, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 278, 1, 397, 1,
+ 1, 1, 398, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 397, 277, 399,
+ 277, 277, 277, 277, 277, 400, 1, 277,
+ 277, 1, 277, 384, 277, 277, 277, 277,
+ 277, 277, 277, 277, 277, 277, 277, 1,
+ 1, 1, 277, 281, 277, 282, 277, 277,
+ 277, 277, 277, 277, 277, 277, 277, 277,
+ 277, 277, 277, 277, 277, 277, 277, 277,
+ 277, 277, 277, 277, 277, 277, 277, 277,
+ 1, 1, 1, 277, 277, 277, 277, 277,
+ 277, 277, 277, 277, 277, 277, 277, 277,
+ 277, 277, 277, 277, 277, 277, 277, 277,
+ 277, 277, 277, 277, 277, 277, 277, 277,
+ 277, 277, 277, 277, 1, 401, 1, 1,
+ 1, 402, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 401, 296, 297, 296,
+ 296, 296, 296, 296, 403, 1, 296, 296,
+ 1, 296, 1, 296, 296, 296, 296, 296,
+ 296, 296, 296, 296, 296, 296, 1, 1,
+ 1, 296, 20, 296, 287, 296, 296, 296,
+ 296, 296, 296, 296, 296, 296, 296, 296,
+ 296, 296, 296, 296, 296, 296, 296, 296,
+ 296, 296, 296, 296, 296, 296, 296, 1,
+ 1, 1, 296, 296, 296, 296, 296, 296,
+ 296, 296, 296, 296, 296, 296, 296, 296,
+ 296, 296, 296, 296, 296, 296, 296, 296,
+ 296, 296, 296, 296, 296, 296, 296, 296,
+ 296, 296, 296, 1, 404, 1, 401, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 401, 1, 405,
+ 1, 1, 1, 406, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 405, 377,
+ 378, 377, 377, 377, 377, 377, 407, 1,
+ 377, 377, 1, 377, 1, 377, 377, 377,
+ 377, 377, 377, 377, 377, 377, 377, 377,
+ 1, 1, 1, 377, 293, 377, 294, 377,
+ 377, 377, 377, 377, 377, 377, 377, 377,
+ 377, 377, 377, 377, 377, 377, 377, 377,
+ 377, 377, 377, 377, 377, 377, 377, 377,
+ 377, 1, 1, 1, 377, 377, 377, 377,
+ 377, 377, 377, 377, 377, 377, 377, 377,
+ 377, 377, 377, 377, 377, 377, 377, 377,
+ 377, 377, 377, 377, 377, 377, 377, 377,
+ 377, 377, 377, 377, 377, 1, 408, 408,
+ 408, 408, 408, 408, 408, 408, 409, 1,
+ 408, 408, 410, 408, 408, 408, 408, 408,
+ 408, 408, 408, 408, 408, 408, 408, 408,
+ 408, 408, 408, 408, 408, 409, 408, 369,
+ 408, 408, 408, 408, 408, 408, 408, 408,
+ 408, 408, 408, 408, 408, 408, 408, 408,
+ 408, 408, 408, 408, 408, 408, 408, 408,
+ 408, 408, 408, 408, 408, 408, 408, 408,
+ 408, 408, 408, 408, 408, 408, 408, 408,
+ 408, 408, 408, 408, 408, 408, 408, 408,
+ 408, 408, 408, 408, 408, 408, 408, 408,
+ 408, 411, 408, 408, 408, 408, 408, 408,
+ 408, 408, 408, 408, 408, 408, 408, 408,
+ 408, 408, 408, 408, 408, 408, 408, 408,
+ 408, 408, 408, 408, 408, 408, 408, 408,
+ 408, 408, 408, 408, 408, 1, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 1,
+ 412, 412, 413, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 414,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 415, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 1, 416, 1,
+ 412, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 412,
+ 1, 275, 1, 1, 1, 276, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 275, 384, 278, 384, 384, 384, 384, 384,
+ 279, 1, 384, 384, 1, 384, 280, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 1, 1, 1, 384, 281, 384,
+ 282, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 1, 1, 1, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 1,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 1, 412, 412, 412, 412, 412, 412, 412,
+ 412, 417, 1, 412, 412, 418, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 417, 412, 373, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 415, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 412, 412, 412, 412, 412, 412, 412, 412,
+ 1, 419, 1, 417, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 417, 1, 420, 420, 420, 420,
+ 420, 420, 420, 420, 421, 1, 420, 420,
+ 422, 420, 420, 420, 420, 420, 420, 420,
+ 420, 420, 420, 420, 420, 420, 420, 420,
+ 420, 420, 420, 421, 420, 423, 420, 420,
+ 420, 420, 420, 420, 420, 420, 420, 420,
+ 420, 420, 420, 420, 420, 420, 420, 420,
+ 420, 420, 420, 420, 420, 420, 420, 420,
+ 420, 420, 420, 420, 420, 420, 420, 420,
+ 420, 420, 420, 420, 420, 420, 420, 420,
+ 420, 420, 420, 420, 420, 420, 420, 420,
+ 420, 420, 420, 420, 420, 420, 420, 424,
+ 420, 420, 420, 420, 420, 420, 420, 420,
+ 420, 420, 420, 420, 420, 420, 420, 420,
+ 420, 420, 420, 420, 420, 420, 420, 420,
+ 420, 420, 420, 420, 420, 420, 420, 420,
+ 420, 420, 420, 1, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 1, 425, 425,
+ 426, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 427, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 428,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 1, 429, 1, 425, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 425, 1, 430,
+ 1, 1, 1, 431, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 430, 384,
+ 278, 384, 384, 384, 384, 384, 432, 1,
+ 384, 384, 1, 384, 280, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384,
+ 1, 1, 1, 384, 281, 384, 433, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 1, 1, 1, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 1, 434, 1,
+ 1, 1, 435, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 434, 1, 1,
+ 1, 1, 1, 1, 1, 436, 1, 1,
+ 1, 1, 1, 286, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 20, 1, 437, 1, 438,
+ 1, 434, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 434, 1, 439, 1, 1, 1, 440, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 439, 1, 1, 1, 1, 1, 1,
+ 1, 441, 1, 1, 1, 1, 1, 292,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 293,
+ 1, 442, 1, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 1, 425, 425, 425, 425,
+ 425, 425, 425, 425, 443, 1, 425, 425,
+ 444, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 443, 425, 445, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 428,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 425, 425, 425, 425, 425,
+ 425, 425, 425, 1, 446, 1, 443, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 443, 1, 447,
+ 1, 1, 1, 448, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 447, 1,
+ 1, 1, 1, 1, 1, 1, 449, 1,
+ 1, 1, 1, 1, 286, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 20, 1, 450, 1,
+ 451, 1, 447, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 447, 1, 452, 1, 1, 1, 453,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 452, 1, 1, 1, 1, 1,
+ 1, 1, 454, 1, 1, 1, 1, 1,
+ 292, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 293, 1, 455, 1, 456, 1, 1, 1,
+ 457, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 456, 458, 459, 458, 458,
+ 458, 458, 458, 460, 1, 458, 458, 461,
+ 458, 462, 458, 458, 458, 458, 458, 458,
+ 458, 458, 458, 458, 458, 1, 1, 1,
+ 458, 1, 458, 463, 458, 458, 458, 458,
+ 458, 458, 458, 458, 458, 458, 458, 458,
+ 458, 458, 458, 458, 458, 458, 458, 458,
+ 458, 458, 458, 458, 458, 458, 1, 1,
+ 1, 458, 458, 458, 458, 458, 458, 458,
+ 458, 458, 458, 458, 458, 458, 458, 458,
+ 458, 458, 458, 458, 458, 458, 458, 458,
+ 458, 458, 458, 458, 458, 458, 458, 458,
+ 458, 458, 1, 272, 1, 1, 1, 464,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 272, 1, 1, 1, 1, 1,
+ 1, 1, 465, 1, 1, 1, 272, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 273, 1, 466, 1, 272, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 272, 1, 461,
+ 1, 1, 1, 467, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 461, 1,
+ 1, 1, 1, 1, 1, 1, 468, 1,
+ 1, 1, 461, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 463, 1,
+ 469, 1, 1, 1, 470, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 469,
+ 471, 472, 471, 471, 471, 471, 471, 473,
+ 1, 471, 471, 1, 471, 474, 471, 471,
+ 471, 471, 471, 471, 471, 471, 471, 471,
+ 471, 1, 1, 1, 471, 1, 471, 1,
+ 471, 471, 471, 471, 471, 471, 471, 471,
+ 471, 471, 471, 471, 471, 471, 471, 471,
+ 471, 471, 471, 471, 471, 471, 471, 471,
+ 471, 471, 475, 1, 1, 471, 471, 471,
+ 471, 471, 471, 471, 471, 471, 471, 471,
+ 471, 471, 471, 471, 471, 471, 471, 471,
+ 471, 471, 471, 471, 471, 471, 471, 471,
+ 471, 471, 471, 471, 471, 471, 1, 476,
+ 1, 1, 1, 477, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 476, 478,
+ 479, 478, 478, 478, 478, 478, 480, 1,
+ 478, 478, 1, 478, 481, 478, 478, 478,
+ 478, 478, 478, 478, 478, 478, 478, 478,
+ 1, 1, 1, 478, 1, 478, 1, 478,
+ 478, 478, 478, 478, 478, 478, 478, 478,
+ 478, 478, 478, 478, 478, 478, 478, 478,
+ 478, 478, 478, 478, 478, 478, 478, 478,
+ 478, 482, 1, 1, 478, 478, 478, 478,
+ 478, 478, 478, 478, 478, 478, 478, 478,
+ 478, 478, 478, 478, 478, 478, 478, 478,
+ 478, 478, 478, 478, 478, 478, 478, 478,
+ 478, 478, 478, 478, 478, 1, 483, 1,
+ 476, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 476,
+ 1, 484, 1, 1, 1, 485, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 484, 478, 479, 478, 478, 478, 478, 478,
+ 486, 1, 478, 478, 487, 478, 488, 478,
+ 478, 478, 478, 478, 478, 478, 478, 478,
+ 478, 478, 489, 1, 1, 478, 1, 478,
+ 1, 478, 478, 478, 478, 478, 478, 478,
+ 478, 478, 478, 478, 478, 478, 478, 478,
+ 478, 478, 478, 478, 478, 478, 478, 478,
+ 478, 478, 478, 1, 1, 1, 478, 478,
+ 478, 478, 478, 478, 478, 478, 478, 478,
+ 478, 478, 478, 478, 478, 478, 478, 478,
+ 478, 478, 478, 478, 478, 478, 478, 478,
+ 478, 478, 478, 478, 478, 478, 478, 1,
+ 484, 1, 1, 1, 485, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 484,
+ 1, 1, 1, 1, 1, 1, 1, 486,
+ 1, 1, 1, 487, 1, 490, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 489, 1, 491, 1, 484, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 484, 1, 492, 1,
+ 1, 1, 493, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 492, 1, 1,
+ 1, 1, 1, 1, 1, 494, 1, 1,
+ 1, 495, 1, 496, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 497,
+ 1, 498, 1, 1, 1, 499, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 498, 1, 1, 1, 1, 1, 1, 1,
+ 500, 1, 1, 1, 498, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 501, 1, 1, 1, 1, 1,
+ 273, 1, 502, 1, 498, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 498, 1, 503, 1, 1,
+ 1, 504, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 503, 1, 1, 1,
+ 1, 1, 1, 1, 505, 1, 1, 1,
+ 503, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 506, 1,
+ 1, 1, 1, 1, 463, 1, 507, 1,
+ 1, 1, 508, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 507, 509, 510,
+ 509, 509, 509, 509, 509, 511, 1, 509,
+ 509, 1, 509, 512, 509, 509, 509, 509,
+ 509, 509, 509, 509, 509, 509, 509, 1,
+ 1, 1, 509, 1, 509, 1, 509, 509,
+ 509, 509, 509, 509, 509, 509, 509, 509,
+ 509, 509, 509, 509, 509, 509, 509, 509,
+ 509, 509, 509, 509, 509, 509, 509, 509,
+ 1, 1, 1, 509, 509, 509, 509, 509,
+ 509, 509, 509, 509, 509, 509, 509, 509,
+ 509, 509, 509, 509, 509, 509, 509, 509,
+ 509, 509, 509, 509, 509, 509, 509, 509,
+ 509, 509, 509, 509, 1, 513, 1, 1,
+ 1, 514, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 513, 263, 264, 263,
+ 263, 263, 263, 263, 515, 1, 263, 263,
+ 1, 263, 267, 263, 263, 263, 263, 263,
+ 263, 263, 263, 263, 263, 263, 1, 1,
+ 1, 263, 1, 263, 1, 263, 263, 263,
+ 263, 263, 263, 263, 263, 263, 263, 263,
+ 263, 263, 263, 263, 263, 263, 263, 263,
+ 263, 263, 263, 263, 263, 263, 263, 1,
+ 1, 1, 263, 263, 263, 263, 263, 263,
+ 263, 263, 263, 263, 263, 263, 263, 263,
+ 263, 263, 263, 263, 263, 263, 263, 263,
+ 263, 263, 263, 263, 263, 263, 263, 263,
+ 263, 263, 263, 1, 516, 1, 513, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 513, 1, 517,
+ 1, 1, 1, 518, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 517, 458,
+ 459, 458, 458, 458, 458, 458, 519, 1,
+ 458, 458, 1, 458, 462, 458, 458, 458,
+ 458, 458, 458, 458, 458, 458, 458, 458,
+ 1, 1, 1, 458, 1, 458, 1, 458,
+ 458, 458, 458, 458, 458, 458, 458, 458,
+ 458, 458, 458, 458, 458, 458, 458, 458,
+ 458, 458, 458, 458, 458, 458, 458, 458,
+ 458, 1, 1, 1, 458, 458, 458, 458,
+ 458, 458, 458, 458, 458, 458, 458, 458,
+ 458, 458, 458, 458, 458, 458, 458, 458,
+ 458, 458, 458, 458, 458, 458, 458, 458,
+ 458, 458, 458, 458, 458, 1, 384, 278,
+ 384, 384, 384, 384, 384, 1, 1, 384,
+ 384, 1, 384, 520, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 1,
+ 1, 1, 384, 1, 384, 1, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384,
+ 1, 1, 1, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 1, 490, 1, 1,
+ 1, 521, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 490, 522, 1, 522,
+ 522, 522, 522, 522, 523, 1, 522, 522,
+ 1, 522, 1, 522, 522, 522, 522, 522,
+ 522, 522, 522, 522, 522, 522, 1, 1,
+ 1, 522, 1, 522, 1, 522, 522, 522,
+ 522, 522, 522, 522, 522, 522, 522, 522,
+ 522, 522, 522, 522, 522, 522, 522, 522,
+ 522, 522, 522, 522, 522, 522, 522, 1,
+ 1, 1, 522, 522, 522, 522, 522, 522,
+ 522, 522, 522, 522, 522, 522, 522, 522,
+ 522, 522, 522, 522, 522, 522, 522, 522,
+ 522, 522, 522, 522, 522, 522, 522, 522,
+ 522, 522, 522, 1, 524, 1, 490, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 490, 1, 484,
+ 1, 1, 1, 485, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 484, 522,
+ 1, 522, 522, 522, 522, 522, 486, 1,
+ 522, 522, 487, 522, 490, 522, 522, 522,
+ 522, 522, 522, 522, 522, 522, 522, 522,
+ 489, 1, 1, 522, 1, 522, 1, 522,
+ 522, 522, 522, 522, 522, 522, 522, 522,
+ 522, 522, 522, 522, 522, 522, 522, 522,
+ 522, 522, 522, 522, 522, 522, 522, 522,
+ 522, 1, 1, 1, 522, 522, 522, 522,
+ 522, 522, 522, 522, 522, 522, 522, 522,
+ 522, 522, 522, 522, 522, 522, 522, 522,
+ 522, 522, 522, 522, 522, 522, 522, 522,
+ 522, 522, 522, 522, 522, 1, 496, 1,
+ 1, 1, 525, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 496, 526, 1,
+ 526, 526, 526, 526, 526, 527, 1, 526,
+ 526, 1, 526, 1, 526, 526, 526, 526,
+ 526, 526, 526, 526, 526, 526, 526, 1,
+ 1, 1, 526, 1, 526, 1, 526, 526,
+ 526, 526, 526, 526, 526, 526, 526, 526,
+ 526, 526, 526, 526, 526, 526, 526, 526,
+ 526, 526, 526, 526, 526, 526, 526, 526,
+ 1, 1, 1, 526, 526, 526, 526, 526,
+ 526, 526, 526, 526, 526, 526, 526, 526,
+ 526, 526, 526, 526, 526, 526, 526, 526,
+ 526, 526, 526, 526, 526, 526, 526, 526,
+ 526, 526, 526, 526, 1, 528, 528, 528,
+ 528, 528, 528, 528, 528, 479, 1, 528,
+ 528, 529, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 479, 528, 1, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 530, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 1, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 1, 528,
+ 528, 531, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 532, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 530, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 1, 533, 1, 528,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 528, 1,
+ 534, 1, 1, 1, 535, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 534,
+ 532, 479, 532, 532, 532, 532, 532, 536,
+ 1, 532, 532, 487, 532, 481, 532, 532,
+ 532, 532, 532, 532, 532, 532, 532, 532,
+ 532, 489, 1, 1, 532, 1, 532, 1,
+ 532, 532, 532, 532, 532, 532, 532, 532,
+ 532, 532, 532, 532, 532, 532, 532, 532,
+ 532, 532, 532, 532, 532, 532, 532, 532,
+ 532, 532, 1, 1, 1, 532, 532, 532,
+ 532, 532, 532, 532, 532, 532, 532, 532,
+ 532, 532, 532, 532, 532, 532, 532, 532,
+ 532, 532, 532, 532, 532, 532, 532, 532,
+ 532, 532, 532, 532, 532, 532, 1, 534,
+ 1, 1, 1, 535, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 534, 1,
+ 1, 1, 1, 1, 1, 1, 536, 1,
+ 1, 1, 487, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 489, 1, 537, 1, 534, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 534, 1, 538, 1, 1,
+ 1, 539, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 538, 1, 1, 1,
+ 1, 1, 1, 1, 540, 1, 1, 1,
+ 495, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 497, 1,
+ 532, 479, 532, 532, 532, 532, 532, 1,
+ 1, 532, 532, 1, 532, 481, 532, 532,
+ 532, 532, 532, 532, 532, 532, 532, 532,
+ 532, 1, 1, 1, 532, 1, 532, 1,
+ 532, 532, 532, 532, 532, 532, 532, 532,
+ 532, 532, 532, 532, 532, 532, 532, 532,
+ 532, 532, 532, 532, 532, 532, 532, 532,
+ 532, 532, 1, 1, 1, 532, 532, 532,
+ 532, 532, 532, 532, 532, 532, 532, 532,
+ 532, 532, 532, 532, 532, 532, 532, 532,
+ 532, 532, 532, 532, 532, 532, 532, 532,
+ 532, 532, 532, 532, 532, 532, 1, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 1,
+ 541, 1, 479, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 479, 1, 490, 1, 1, 1, 521,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 490, 478, 479, 478, 478, 478,
+ 478, 478, 523, 1, 478, 478, 1, 478,
+ 481, 478, 478, 478, 478, 478, 478, 478,
+ 478, 478, 478, 478, 1, 1, 1, 478,
+ 1, 478, 1, 478, 478, 478, 478, 478,
+ 478, 478, 478, 478, 478, 478, 478, 478,
+ 478, 478, 478, 478, 478, 478, 478, 478,
+ 478, 478, 478, 478, 478, 1, 1, 1,
+ 478, 478, 478, 478, 478, 478, 478, 478,
+ 478, 478, 478, 478, 478, 478, 478, 478,
+ 478, 478, 478, 478, 478, 478, 478, 478,
+ 478, 478, 478, 478, 478, 478, 478, 478,
+ 478, 1, 542, 1, 1, 1, 543, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 542, 544, 545, 544, 544, 544, 544,
+ 544, 546, 1, 544, 544, 1, 544, 547,
+ 544, 544, 544, 544, 544, 544, 544, 544,
+ 544, 544, 544, 1, 1, 1, 544, 1,
+ 544, 1, 544, 544, 544, 544, 544, 544,
+ 544, 544, 544, 544, 544, 544, 544, 544,
+ 544, 544, 544, 544, 544, 544, 544, 544,
+ 544, 544, 544, 544, 548, 1, 1, 544,
+ 544, 544, 544, 544, 544, 544, 544, 544,
+ 544, 544, 544, 544, 544, 544, 544, 544,
+ 544, 544, 544, 544, 544, 544, 544, 544,
+ 544, 544, 544, 544, 544, 544, 544, 544,
+ 1, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 1, 482, 482, 549, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 1, 550, 534, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 1, 551, 1, 482, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 482, 1, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 482, 482, 482, 482,
+ 482, 482, 482, 482, 1, 552, 1, 1,
+ 1, 553, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 552, 554, 555, 554,
+ 554, 554, 554, 554, 556, 1, 554, 554,
+ 1, 554, 557, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 1, 1,
+ 1, 554, 1, 554, 1, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 18,
+ 1, 1, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 554, 554, 554, 554, 554,
+ 554, 554, 554, 1, 558, 1, 1, 1,
+ 559, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 558, 560, 561, 560, 560,
+ 560, 560, 560, 562, 1, 560, 560, 1,
+ 560, 563, 560, 560, 560, 560, 560, 560,
+ 560, 560, 560, 560, 560, 1, 1, 1,
+ 560, 1, 560, 1, 560, 560, 560, 560,
+ 560, 560, 560, 560, 560, 560, 560, 560,
+ 560, 560, 560, 560, 560, 560, 560, 560,
+ 560, 560, 560, 560, 560, 560, 564, 1,
+ 1, 560, 560, 560, 560, 560, 560, 560,
+ 560, 560, 560, 560, 560, 560, 560, 560,
+ 560, 560, 560, 560, 560, 560, 560, 560,
+ 560, 560, 560, 560, 560, 560, 560, 560,
+ 560, 560, 1, 565, 1, 558, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 558, 1, 566, 1,
+ 1, 1, 567, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 566, 568, 569,
+ 568, 568, 568, 568, 568, 570, 1, 568,
+ 568, 1, 568, 571, 568, 568, 568, 568,
+ 568, 568, 568, 568, 568, 568, 568, 1,
+ 572, 573, 568, 1, 568, 1, 568, 568,
+ 568, 568, 568, 568, 568, 568, 568, 568,
+ 568, 568, 568, 568, 568, 568, 568, 568,
+ 568, 568, 568, 568, 568, 568, 568, 568,
+ 574, 1, 1, 568, 568, 568, 568, 568,
+ 568, 568, 568, 568, 568, 568, 568, 568,
+ 568, 568, 568, 568, 568, 568, 568, 568,
+ 568, 568, 568, 568, 568, 568, 568, 568,
+ 568, 568, 568, 568, 1, 566, 1, 1,
+ 1, 567, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 566, 575, 576, 575,
+ 575, 575, 575, 575, 570, 1, 575, 575,
+ 1, 575, 577, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 1, 572,
+ 578, 575, 1, 575, 1, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 574,
+ 1, 1, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 1, 579, 1, 580, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 580, 1, 581,
+ 1, 1, 1, 582, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 581, 583,
+ 584, 583, 583, 583, 583, 583, 585, 1,
+ 583, 583, 1, 583, 586, 583, 583, 583,
+ 583, 583, 583, 583, 583, 583, 583, 583,
+ 1, 587, 588, 583, 1, 583, 1, 583,
+ 583, 583, 583, 583, 583, 583, 583, 583,
+ 583, 583, 583, 583, 583, 583, 583, 583,
+ 583, 583, 583, 583, 583, 583, 583, 583,
+ 583, 589, 1, 1, 583, 583, 583, 583,
+ 583, 583, 583, 583, 583, 583, 583, 583,
+ 583, 583, 583, 583, 583, 583, 583, 583,
+ 583, 583, 583, 583, 583, 583, 583, 583,
+ 583, 583, 583, 583, 583, 1, 590, 1,
+ 1, 1, 591, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 590, 592, 593,
+ 592, 592, 592, 592, 592, 594, 1, 592,
+ 592, 1, 592, 90, 592, 592, 592, 592,
+ 592, 592, 592, 592, 592, 592, 592, 1,
+ 1, 1, 592, 1, 592, 1, 592, 592,
+ 592, 592, 592, 592, 592, 592, 592, 592,
+ 592, 592, 592, 592, 592, 592, 592, 592,
+ 592, 592, 592, 592, 592, 592, 592, 592,
+ 1, 1, 1, 592, 592, 592, 592, 592,
+ 592, 592, 592, 592, 592, 592, 592, 592,
+ 592, 592, 592, 592, 592, 592, 592, 592,
+ 592, 592, 592, 592, 592, 592, 592, 592,
+ 592, 592, 592, 592, 1, 590, 1, 1,
+ 1, 591, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 590, 595, 1, 595,
+ 595, 595, 595, 595, 594, 1, 595, 595,
+ 1, 595, 1, 595, 595, 595, 595, 595,
+ 595, 595, 595, 595, 595, 595, 1, 1,
+ 1, 595, 1, 595, 1, 595, 595, 595,
+ 595, 595, 595, 595, 595, 595, 595, 595,
+ 595, 595, 595, 595, 595, 595, 595, 595,
+ 595, 595, 595, 595, 595, 595, 595, 1,
+ 1, 1, 595, 595, 595, 595, 595, 595,
+ 595, 595, 595, 595, 595, 595, 595, 595,
+ 595, 595, 595, 595, 595, 595, 595, 595,
+ 595, 595, 595, 595, 595, 595, 595, 595,
+ 595, 595, 595, 1, 596, 1, 590, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 590, 1, 566,
+ 1, 1, 1, 567, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 566, 597,
+ 598, 597, 597, 597, 597, 597, 570, 1,
+ 597, 597, 1, 597, 599, 597, 597, 597,
+ 597, 597, 597, 597, 597, 597, 597, 597,
+ 1, 572, 573, 597, 1, 597, 1, 597,
+ 597, 597, 597, 597, 597, 597, 597, 597,
+ 597, 597, 597, 597, 597, 597, 597, 597,
+ 597, 597, 597, 597, 597, 597, 597, 597,
+ 597, 574, 1, 1, 597, 597, 597, 597,
+ 597, 597, 597, 597, 597, 597, 597, 597,
+ 597, 597, 597, 597, 597, 597, 597, 597,
+ 597, 597, 597, 597, 597, 597, 597, 597,
+ 597, 597, 597, 597, 597, 1, 566, 1,
+ 1, 1, 567, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 566, 597, 598,
+ 597, 597, 597, 597, 597, 570, 1, 597,
+ 597, 1, 597, 599, 597, 597, 597, 597,
+ 597, 597, 597, 597, 597, 597, 597, 1,
+ 600, 573, 597, 1, 597, 29, 597, 597,
+ 597, 597, 597, 597, 597, 597, 597, 597,
+ 597, 597, 597, 597, 597, 597, 597, 597,
+ 597, 597, 597, 597, 597, 597, 597, 597,
+ 574, 1, 1, 597, 597, 597, 597, 597,
+ 597, 597, 597, 597, 597, 597, 597, 597,
+ 597, 597, 597, 597, 597, 597, 597, 597,
+ 597, 597, 597, 597, 597, 597, 597, 597,
+ 597, 597, 597, 597, 1, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 1, 564,
+ 564, 601, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 1,
+ 602, 603, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 1, 604, 1, 564,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 564, 1,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 564, 564, 564, 564, 564, 564, 564, 564,
+ 1, 605, 1, 1, 1, 606, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 605, 607, 598, 607, 607, 607, 607, 607,
+ 608, 1, 607, 607, 1, 607, 609, 607,
+ 607, 607, 607, 607, 607, 607, 607, 607,
+ 607, 607, 1, 572, 573, 607, 1, 607,
+ 1, 607, 607, 607, 607, 607, 607, 607,
+ 607, 607, 607, 607, 607, 607, 607, 607,
+ 607, 607, 607, 607, 607, 607, 607, 607,
+ 607, 607, 607, 574, 1, 1, 607, 607,
+ 607, 607, 607, 607, 607, 607, 607, 607,
+ 607, 607, 607, 607, 607, 607, 607, 607,
+ 607, 607, 607, 607, 607, 607, 607, 607,
+ 607, 607, 607, 607, 607, 607, 607, 1,
+ 605, 1, 1, 1, 606, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 605,
+ 575, 576, 575, 575, 575, 575, 575, 608,
+ 1, 575, 575, 1, 575, 610, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 1, 572, 578, 575, 1, 575, 1,
+ 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 574, 1, 1, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 1, 611,
+ 1, 612, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 612, 1, 613, 1, 1, 1, 614, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 613, 583, 584, 583, 583, 583, 583,
+ 583, 615, 1, 583, 583, 1, 583, 616,
+ 583, 583, 583, 583, 583, 583, 583, 583,
+ 583, 583, 583, 1, 587, 588, 583, 1,
+ 583, 1, 583, 583, 583, 583, 583, 583,
+ 583, 583, 583, 583, 583, 583, 583, 583,
+ 583, 583, 583, 583, 583, 583, 583, 583,
+ 583, 583, 583, 583, 589, 1, 1, 583,
+ 583, 583, 583, 583, 583, 583, 583, 583,
+ 583, 583, 583, 583, 583, 583, 583, 583,
+ 583, 583, 583, 583, 583, 583, 583, 583,
+ 583, 583, 583, 583, 583, 583, 583, 583,
+ 1, 617, 593, 617, 617, 617, 617, 617,
+ 1, 1, 617, 617, 1, 617, 90, 617,
+ 617, 617, 617, 617, 617, 617, 617, 617,
+ 617, 617, 1, 1, 1, 617, 1, 617,
+ 1, 617, 617, 617, 617, 617, 617, 617,
+ 617, 617, 617, 617, 617, 617, 617, 617,
+ 617, 617, 617, 617, 617, 617, 617, 617,
+ 617, 617, 617, 1, 1, 1, 617, 617,
+ 617, 617, 617, 617, 617, 617, 617, 617,
+ 617, 617, 617, 617, 617, 617, 617, 617,
+ 617, 617, 617, 617, 617, 617, 617, 617,
+ 617, 617, 617, 617, 617, 617, 617, 1,
+ 618, 1, 1, 1, 619, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 618,
+ 23, 24, 23, 23, 23, 23, 23, 620,
+ 1, 23, 23, 1, 23, 26, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 1, 27, 28, 23, 1, 23, 29,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 30, 1, 1, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 1, 621,
+ 1, 1, 1, 622, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 621, 33,
+ 34, 33, 33, 33, 33, 33, 623, 1,
+ 33, 33, 1, 33, 624, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 1, 37, 38, 33, 1, 33, 39, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 40, 1, 1, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 1, 625, 1,
+ 626, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 626,
+ 1, 627, 1, 1, 1, 628, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 627, 629, 630, 629, 629, 629, 629, 629,
+ 631, 1, 629, 629, 1, 629, 632, 629,
+ 629, 629, 629, 629, 629, 629, 629, 629,
+ 629, 629, 1, 633, 634, 629, 1, 629,
+ 635, 629, 629, 629, 629, 629, 629, 629,
+ 629, 629, 629, 629, 629, 629, 629, 629,
+ 629, 629, 629, 629, 629, 629, 629, 629,
+ 629, 629, 629, 636, 1, 1, 629, 629,
+ 629, 629, 629, 629, 629, 629, 629, 629,
+ 629, 629, 629, 629, 629, 629, 629, 629,
+ 629, 629, 629, 629, 629, 629, 629, 629,
+ 629, 629, 629, 629, 629, 629, 629, 1,
+ 637, 1, 1, 1, 638, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 637,
+ 639, 640, 639, 639, 639, 639, 639, 641,
+ 1, 639, 639, 1, 639, 642, 639, 639,
+ 639, 639, 639, 639, 639, 639, 639, 639,
+ 639, 1, 643, 644, 639, 1, 639, 29,
+ 639, 639, 639, 639, 639, 639, 639, 639,
+ 639, 639, 639, 639, 639, 639, 639, 639,
+ 639, 639, 639, 639, 639, 639, 639, 639,
+ 639, 639, 645, 1, 1, 639, 639, 639,
+ 639, 639, 639, 639, 639, 639, 639, 639,
+ 639, 639, 639, 639, 639, 639, 639, 639,
+ 639, 639, 639, 639, 639, 639, 639, 639,
+ 639, 639, 639, 639, 639, 639, 1, 646,
+ 1, 1, 1, 647, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 646, 648,
+ 649, 648, 648, 648, 648, 648, 650, 1,
+ 648, 648, 1, 648, 651, 648, 648, 648,
+ 648, 648, 648, 648, 648, 648, 648, 648,
+ 1, 652, 653, 648, 1, 648, 39, 648,
+ 648, 648, 648, 648, 648, 648, 648, 648,
+ 648, 648, 648, 648, 648, 648, 648, 648,
+ 648, 648, 648, 648, 648, 648, 648, 648,
+ 648, 654, 1, 1, 648, 648, 648, 648,
+ 648, 648, 648, 648, 648, 648, 648, 648,
+ 648, 648, 648, 648, 648, 648, 648, 648,
+ 648, 648, 648, 648, 648, 648, 648, 648,
+ 648, 648, 648, 648, 648, 1, 655, 1,
+ 656, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 656,
+ 1, 657, 1, 1, 1, 658, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 657, 659, 660, 659, 659, 659, 659, 659,
+ 661, 1, 659, 659, 1, 659, 662, 659,
+ 659, 659, 659, 659, 659, 659, 659, 659,
+ 659, 659, 1, 663, 664, 659, 1, 659,
+ 635, 659, 659, 659, 659, 659, 659, 659,
+ 659, 659, 659, 659, 659, 659, 659, 659,
+ 659, 659, 659, 659, 659, 659, 659, 659,
+ 659, 659, 659, 665, 1, 1, 659, 659,
+ 659, 659, 659, 659, 659, 659, 659, 659,
+ 659, 659, 659, 659, 659, 659, 659, 659,
+ 659, 659, 659, 659, 659, 659, 659, 659,
+ 659, 659, 659, 659, 659, 659, 659, 1,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 593, 1, 666, 666, 667, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 593,
+ 666, 1, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 668, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 1,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 1, 666, 666, 669, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 617, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 668, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 1,
+ 670, 1, 666, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 666, 1, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666,
+ 666, 666, 666, 1, 671, 1, 593, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 593, 1, 672,
+ 1, 1, 1, 673, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 672, 674,
+ 1, 674, 674, 674, 674, 674, 675, 1,
+ 674, 674, 1, 674, 1, 674, 674, 674,
+ 674, 674, 674, 674, 674, 674, 674, 674,
+ 1, 1, 1, 674, 1, 674, 1, 674,
+ 674, 674, 674, 674, 674, 674, 674, 674,
+ 674, 674, 674, 674, 674, 674, 674, 674,
+ 674, 674, 674, 674, 674, 674, 674, 674,
+ 674, 1, 1, 1, 674, 674, 674, 674,
+ 674, 674, 674, 674, 674, 674, 674, 674,
+ 674, 674, 674, 674, 674, 674, 674, 674,
+ 674, 674, 674, 674, 674, 674, 674, 674,
+ 674, 674, 674, 674, 674, 1, 566, 1,
+ 1, 1, 567, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 566, 568, 569,
+ 568, 568, 568, 568, 568, 570, 1, 568,
+ 568, 1, 568, 571, 568, 568, 568, 568,
+ 568, 568, 568, 568, 568, 568, 568, 1,
+ 600, 573, 568, 1, 568, 29, 568, 568,
+ 568, 568, 568, 568, 568, 568, 568, 568,
+ 568, 568, 568, 568, 568, 568, 568, 568,
+ 568, 568, 568, 568, 568, 568, 568, 568,
+ 574, 1, 1, 568, 568, 568, 568, 568,
+ 568, 568, 568, 568, 568, 568, 568, 568,
+ 568, 568, 568, 568, 568, 568, 568, 568,
+ 568, 568, 568, 568, 568, 568, 568, 568,
+ 568, 568, 568, 568, 1, 676, 676, 676,
+ 676, 676, 676, 676, 676, 677, 1, 676,
+ 676, 678, 676, 676, 676, 676, 676, 676,
+ 676, 676, 676, 676, 676, 676, 676, 676,
+ 676, 676, 676, 676, 677, 676, 46, 676,
+ 676, 676, 676, 676, 676, 676, 676, 676,
+ 676, 676, 676, 676, 676, 676, 676, 676,
+ 676, 676, 676, 676, 676, 676, 676, 676,
+ 676, 676, 676, 676, 676, 676, 676, 676,
+ 676, 676, 676, 676, 676, 676, 676, 676,
+ 676, 676, 676, 676, 676, 676, 676, 676,
+ 676, 676, 676, 676, 676, 676, 676, 676,
+ 679, 676, 676, 676, 676, 676, 676, 676,
+ 676, 676, 676, 676, 676, 676, 676, 676,
+ 676, 676, 676, 676, 676, 676, 676, 676,
+ 676, 676, 676, 676, 676, 676, 676, 676,
+ 676, 676, 676, 676, 1, 680, 680, 680,
+ 680, 680, 680, 680, 680, 680, 1, 680,
+ 680, 681, 680, 680, 680, 680, 680, 680,
+ 680, 680, 680, 680, 680, 680, 680, 680,
+ 680, 680, 680, 680, 680, 680, 682, 680,
+ 680, 680, 680, 680, 680, 680, 680, 680,
+ 680, 680, 680, 680, 680, 680, 680, 680,
+ 680, 680, 680, 680, 680, 680, 680, 680,
+ 680, 680, 680, 680, 680, 680, 680, 680,
+ 680, 680, 680, 680, 680, 680, 680, 680,
+ 680, 680, 680, 680, 680, 680, 680, 680,
+ 680, 680, 680, 680, 680, 680, 680, 680,
+ 683, 680, 680, 680, 680, 680, 680, 680,
+ 680, 680, 680, 680, 680, 680, 680, 680,
+ 680, 680, 680, 680, 680, 680, 680, 680,
+ 680, 680, 680, 680, 680, 680, 680, 680,
+ 680, 680, 680, 680, 1, 684, 1, 680,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 680, 1,
+ 605, 1, 1, 1, 606, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 605,
+ 685, 569, 685, 685, 685, 685, 685, 608,
+ 1, 685, 685, 1, 685, 686, 685, 685,
+ 685, 685, 685, 685, 685, 685, 685, 685,
+ 685, 1, 687, 573, 685, 1, 685, 61,
+ 685, 685, 685, 685, 685, 685, 685, 685,
+ 685, 685, 685, 685, 685, 685, 685, 685,
+ 685, 685, 685, 685, 685, 685, 685, 685,
+ 685, 685, 574, 1, 1, 685, 685, 685,
+ 685, 685, 685, 685, 685, 685, 685, 685,
+ 685, 685, 685, 685, 685, 685, 685, 685,
+ 685, 685, 685, 685, 685, 685, 685, 685,
+ 685, 685, 685, 685, 685, 685, 1, 605,
+ 1, 1, 1, 606, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 605, 685,
+ 569, 685, 685, 685, 685, 685, 608, 1,
+ 685, 685, 1, 685, 686, 685, 685, 685,
+ 685, 685, 685, 685, 685, 685, 685, 685,
+ 1, 600, 573, 685, 1, 685, 29, 685,
+ 685, 685, 685, 685, 685, 685, 685, 685,
+ 685, 685, 685, 685, 685, 685, 685, 685,
+ 685, 685, 685, 685, 685, 685, 685, 685,
+ 685, 574, 1, 1, 685, 685, 685, 685,
+ 685, 685, 685, 685, 685, 685, 685, 685,
+ 685, 685, 685, 685, 685, 685, 685, 685,
+ 685, 685, 685, 685, 685, 685, 685, 685,
+ 685, 685, 685, 685, 685, 1, 688, 689,
+ 688, 688, 688, 688, 688, 1, 1, 688,
+ 688, 1, 688, 690, 688, 688, 688, 688,
+ 688, 688, 688, 688, 688, 688, 688, 1,
+ 1, 1, 688, 1, 688, 1, 688, 688,
+ 688, 688, 688, 688, 688, 688, 688, 688,
+ 688, 688, 688, 688, 688, 688, 688, 688,
+ 688, 688, 688, 688, 688, 688, 688, 688,
+ 1, 1, 1, 688, 688, 688, 688, 688,
+ 688, 688, 688, 688, 688, 688, 688, 688,
+ 688, 688, 688, 688, 688, 688, 688, 688,
+ 688, 688, 688, 688, 688, 688, 688, 688,
+ 688, 688, 688, 688, 1, 691, 691, 691,
+ 691, 691, 691, 691, 691, 689, 1, 691,
+ 691, 692, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 689, 691, 1, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 693, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 1, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 1, 691,
+ 691, 694, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 688, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 693, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 1, 695, 1, 691,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 691, 1,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 691, 691, 691, 691, 691, 691, 691, 691,
+ 1, 696, 1, 689, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 689, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 680, 680, 680, 680,
+ 680, 680, 680, 680, 680, 697, 1, 680,
+ 680, 698, 680, 680, 680, 680, 680, 680,
+ 680, 680, 680, 680, 680, 680, 680, 680,
+ 680, 680, 680, 680, 697, 680, 699, 680,
+ 680, 680, 680, 680, 680, 680, 680, 680,
+ 680, 680, 680, 680, 680, 680, 680, 680,
+ 680, 680, 680, 680, 680, 680, 680, 680,
+ 680, 680, 680, 680, 680, 680, 680, 680,
+ 680, 680, 680, 680, 680, 680, 680, 680,
+ 680, 680, 680, 680, 680, 680, 680, 680,
+ 680, 680, 680, 680, 680, 680, 680, 680,
+ 683, 680, 680, 680, 680, 680, 680, 680,
+ 680, 680, 680, 680, 680, 680, 680, 680,
+ 680, 680, 680, 680, 680, 680, 680, 680,
+ 680, 680, 680, 680, 680, 680, 680, 680,
+ 680, 680, 680, 680, 1, 700, 1, 697,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 697, 1,
+ 701, 1, 1, 1, 702, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 701,
+ 703, 704, 703, 703, 703, 703, 703, 705,
+ 1, 703, 703, 1, 703, 706, 703, 703,
+ 703, 703, 703, 703, 703, 703, 703, 703,
+ 703, 1, 707, 708, 703, 1, 703, 709,
+ 703, 703, 703, 703, 703, 703, 703, 703,
+ 703, 703, 703, 703, 703, 703, 703, 703,
+ 703, 703, 703, 703, 703, 703, 703, 703,
+ 703, 703, 710, 1, 1, 703, 703, 703,
+ 703, 703, 703, 703, 703, 703, 703, 703,
+ 703, 703, 703, 703, 703, 703, 703, 703,
+ 703, 703, 703, 703, 703, 703, 703, 703,
+ 703, 703, 703, 703, 703, 703, 1, 701,
+ 1, 1, 1, 702, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 701, 711,
+ 712, 711, 711, 711, 711, 711, 705, 1,
+ 711, 711, 1, 711, 713, 711, 711, 711,
+ 711, 711, 711, 711, 711, 711, 711, 711,
+ 1, 707, 714, 711, 1, 711, 709, 711,
+ 711, 711, 711, 711, 711, 711, 711, 711,
+ 711, 711, 711, 711, 711, 711, 711, 711,
+ 711, 711, 711, 711, 711, 711, 711, 711,
+ 711, 710, 1, 1, 711, 711, 711, 711,
+ 711, 711, 711, 711, 711, 711, 711, 711,
+ 711, 711, 711, 711, 711, 711, 711, 711,
+ 711, 711, 711, 711, 711, 711, 711, 711,
+ 711, 711, 711, 711, 711, 1, 715, 1,
+ 716, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 716,
+ 1, 717, 1, 1, 1, 718, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 717, 719, 720, 719, 719, 719, 719, 719,
+ 721, 1, 719, 719, 1, 719, 722, 719,
+ 719, 719, 719, 719, 719, 719, 719, 719,
+ 719, 719, 1, 723, 724, 719, 1, 719,
+ 725, 719, 719, 719, 719, 719, 719, 719,
+ 719, 719, 719, 719, 719, 719, 719, 719,
+ 719, 719, 719, 719, 719, 719, 719, 719,
+ 719, 719, 719, 726, 1, 1, 719, 719,
+ 719, 719, 719, 719, 719, 719, 719, 719,
+ 719, 719, 719, 719, 719, 719, 719, 719,
+ 719, 719, 719, 719, 719, 719, 719, 719,
+ 719, 719, 719, 719, 719, 719, 719, 1,
+ 590, 1, 1, 1, 591, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 590,
+ 727, 689, 727, 727, 727, 727, 727, 594,
+ 1, 727, 727, 1, 727, 690, 727, 727,
+ 727, 727, 727, 727, 727, 727, 727, 727,
+ 727, 1, 1, 1, 727, 1, 727, 1,
+ 727, 727, 727, 727, 727, 727, 727, 727,
+ 727, 727, 727, 727, 727, 727, 727, 727,
+ 727, 727, 727, 727, 727, 727, 727, 727,
+ 727, 727, 1, 1, 1, 727, 727, 727,
+ 727, 727, 727, 727, 727, 727, 727, 727,
+ 727, 727, 727, 727, 727, 727, 727, 727,
+ 727, 727, 727, 727, 727, 727, 727, 727,
+ 727, 727, 727, 727, 727, 727, 1, 728,
+ 728, 728, 728, 728, 728, 728, 728, 561,
+ 1, 728, 728, 729, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 561, 728,
+ 1, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 730, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 1, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 1, 728, 728, 731, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 732, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 730, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 1, 733,
+ 1, 728, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 728, 1, 605, 1, 1, 1, 606, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 605, 685, 569, 685, 685, 685, 685,
+ 685, 608, 1, 685, 685, 1, 685, 686,
+ 685, 685, 685, 685, 685, 685, 685, 685,
+ 685, 685, 685, 1, 572, 573, 685, 1,
+ 685, 1, 685, 685, 685, 685, 685, 685,
+ 685, 685, 685, 685, 685, 685, 685, 685,
+ 685, 685, 685, 685, 685, 685, 685, 685,
+ 685, 685, 685, 685, 574, 1, 1, 685,
+ 685, 685, 685, 685, 685, 685, 685, 685,
+ 685, 685, 685, 685, 685, 685, 685, 685,
+ 685, 685, 685, 685, 685, 685, 685, 685,
+ 685, 685, 685, 685, 685, 685, 685, 685,
+ 1, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 1, 734, 1, 561, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 561, 1, 735, 1, 1,
+ 1, 736, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 735, 737, 738, 737,
+ 737, 737, 737, 737, 739, 1, 737, 737,
+ 1, 737, 740, 737, 737, 737, 737, 737,
+ 737, 737, 737, 737, 737, 737, 1, 1,
+ 1, 737, 1, 737, 1, 737, 737, 737,
+ 737, 737, 737, 737, 737, 737, 737, 737,
+ 737, 737, 737, 737, 737, 737, 737, 737,
+ 737, 737, 737, 737, 737, 737, 737, 741,
+ 1, 1, 737, 737, 737, 737, 737, 737,
+ 737, 737, 737, 737, 737, 737, 737, 737,
+ 737, 737, 737, 737, 737, 737, 737, 737,
+ 737, 737, 737, 737, 737, 737, 737, 737,
+ 737, 737, 737, 1, 732, 561, 732, 732,
+ 732, 732, 732, 1, 1, 732, 732, 1,
+ 732, 563, 732, 732, 732, 732, 732, 732,
+ 732, 732, 732, 732, 732, 1, 1, 1,
+ 732, 1, 732, 1, 732, 732, 732, 732,
+ 732, 732, 732, 732, 732, 732, 732, 732,
+ 732, 732, 732, 732, 732, 732, 732, 732,
+ 732, 732, 732, 732, 732, 732, 1, 1,
+ 1, 732, 732, 732, 732, 732, 732, 732,
+ 732, 732, 732, 732, 732, 732, 732, 732,
+ 732, 732, 732, 732, 732, 732, 732, 732,
+ 732, 732, 732, 732, 732, 732, 732, 732,
+ 732, 732, 1, 742, 742, 742, 742, 742,
+ 742, 742, 742, 742, 1, 742, 742, 743,
+ 742, 742, 742, 742, 742, 742, 742, 742,
+ 742, 742, 742, 742, 742, 742, 742, 742,
+ 742, 742, 742, 742, 744, 742, 742, 742,
+ 742, 742, 742, 742, 742, 742, 742, 742,
+ 742, 742, 742, 742, 742, 742, 742, 742,
+ 742, 742, 742, 742, 742, 742, 742, 742,
+ 742, 742, 742, 742, 742, 742, 742, 742,
+ 742, 742, 742, 742, 742, 742, 742, 742,
+ 742, 742, 742, 742, 742, 742, 742, 742,
+ 742, 742, 742, 742, 742, 742, 745, 742,
+ 742, 742, 742, 742, 742, 742, 742, 742,
+ 742, 742, 742, 742, 742, 742, 742, 742,
+ 742, 742, 742, 742, 742, 742, 742, 742,
+ 742, 742, 742, 742, 742, 742, 742, 742,
+ 742, 742, 1, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 1, 746, 746, 747,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 748, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 749, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 1, 750, 1, 746, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 746, 1, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 1, 751,
+ 1, 1, 1, 752, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 751, 753,
+ 754, 753, 753, 753, 753, 753, 755, 1,
+ 753, 753, 1, 753, 1, 753, 753, 753,
+ 753, 753, 753, 753, 753, 753, 753, 753,
+ 1, 1, 1, 753, 1, 753, 1, 753,
+ 753, 753, 753, 753, 753, 753, 753, 753,
+ 753, 753, 753, 753, 753, 753, 753, 753,
+ 753, 753, 753, 753, 753, 753, 753, 753,
+ 753, 1, 1, 1, 753, 753, 753, 753,
+ 753, 753, 753, 753, 753, 753, 753, 753,
+ 753, 753, 753, 753, 753, 753, 753, 753,
+ 753, 753, 753, 753, 753, 753, 753, 753,
+ 753, 753, 753, 753, 753, 1, 756, 1,
+ 1, 1, 757, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 756, 23, 24,
+ 23, 23, 23, 23, 23, 758, 1, 23,
+ 23, 1, 23, 26, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 1,
+ 27, 28, 23, 1, 23, 29, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 30, 1, 1, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 1, 759, 1, 1,
+ 1, 760, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 759, 33, 34, 33,
+ 33, 33, 33, 33, 761, 1, 33, 33,
+ 1, 33, 762, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 1, 37,
+ 38, 33, 1, 33, 39, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 40,
+ 1, 1, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 1, 763, 1, 764, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 764, 1, 765,
+ 1, 1, 1, 766, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 765, 629,
+ 630, 629, 629, 629, 629, 629, 767, 1,
+ 629, 629, 1, 629, 768, 629, 629, 629,
+ 629, 629, 629, 629, 629, 629, 629, 629,
+ 1, 633, 634, 629, 1, 629, 635, 629,
+ 629, 629, 629, 629, 629, 629, 629, 629,
+ 629, 629, 629, 629, 629, 629, 629, 629,
+ 629, 629, 629, 629, 629, 629, 629, 629,
+ 629, 636, 1, 1, 629, 629, 629, 629,
+ 629, 629, 629, 629, 629, 629, 629, 629,
+ 629, 629, 629, 629, 629, 629, 629, 629,
+ 629, 629, 629, 629, 629, 629, 629, 629,
+ 629, 629, 629, 629, 629, 1, 769, 769,
+ 769, 769, 769, 769, 769, 769, 770, 1,
+ 769, 769, 771, 769, 769, 769, 769, 769,
+ 769, 769, 769, 769, 769, 769, 769, 769,
+ 769, 769, 769, 769, 769, 770, 769, 744,
+ 769, 769, 769, 769, 769, 769, 769, 769,
+ 769, 769, 769, 769, 769, 769, 769, 769,
+ 769, 769, 769, 769, 769, 769, 769, 769,
+ 769, 769, 769, 769, 769, 769, 769, 769,
+ 769, 769, 769, 769, 769, 769, 769, 769,
+ 769, 769, 769, 769, 769, 769, 769, 769,
+ 769, 769, 769, 769, 769, 769, 769, 769,
+ 769, 772, 769, 769, 769, 769, 769, 769,
+ 769, 769, 769, 769, 769, 769, 769, 769,
+ 769, 769, 769, 769, 769, 769, 769, 769,
+ 769, 769, 769, 769, 769, 769, 769, 769,
+ 769, 769, 769, 769, 769, 1, 773, 773,
+ 773, 773, 773, 773, 773, 773, 773, 1,
+ 773, 773, 774, 773, 773, 773, 773, 773,
+ 773, 773, 773, 773, 773, 773, 773, 773,
+ 773, 773, 773, 773, 773, 773, 773, 775,
+ 773, 773, 773, 773, 773, 773, 773, 773,
+ 773, 773, 773, 773, 773, 773, 773, 773,
+ 773, 773, 773, 773, 773, 773, 773, 773,
+ 773, 773, 773, 773, 773, 773, 773, 773,
+ 773, 773, 773, 773, 773, 773, 773, 773,
+ 773, 773, 773, 773, 773, 773, 773, 773,
+ 773, 773, 773, 773, 773, 773, 773, 773,
+ 773, 776, 773, 773, 773, 773, 773, 773,
+ 773, 773, 773, 773, 773, 773, 773, 773,
+ 773, 773, 773, 773, 773, 773, 773, 773,
+ 773, 773, 773, 773, 773, 773, 773, 773,
+ 773, 773, 773, 773, 773, 1, 777, 1,
+ 773, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 773,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 773, 773, 773, 773, 773, 773, 773,
+ 773, 773, 778, 1, 773, 773, 779, 773,
+ 773, 773, 773, 773, 773, 773, 773, 773,
+ 773, 773, 773, 773, 773, 773, 773, 773,
+ 773, 778, 773, 748, 773, 773, 773, 773,
+ 773, 773, 773, 773, 773, 773, 773, 773,
+ 773, 773, 773, 773, 773, 773, 773, 773,
+ 773, 773, 773, 773, 773, 773, 773, 773,
+ 773, 773, 773, 773, 773, 773, 773, 773,
+ 773, 773, 773, 773, 773, 773, 773, 773,
+ 773, 773, 773, 773, 773, 773, 773, 773,
+ 773, 773, 773, 773, 773, 776, 773, 773,
+ 773, 773, 773, 773, 773, 773, 773, 773,
+ 773, 773, 773, 773, 773, 773, 773, 773,
+ 773, 773, 773, 773, 773, 773, 773, 773,
+ 773, 773, 773, 773, 773, 773, 773, 773,
+ 773, 1, 780, 1, 778, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 778, 1, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 1, 48, 48,
+ 48, 48, 48, 48, 48, 48, 781, 1,
+ 48, 48, 782, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 781, 48, 699,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 51, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 1, 783, 1,
+ 781, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 781,
+ 1, 784, 1, 1, 1, 785, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 784, 629, 630, 629, 629, 629, 629, 629,
+ 786, 1, 629, 629, 1, 629, 787, 629,
+ 629, 629, 629, 629, 629, 629, 629, 629,
+ 629, 629, 1, 633, 634, 629, 1, 629,
+ 635, 629, 629, 629, 629, 629, 629, 629,
+ 629, 629, 629, 629, 629, 629, 629, 629,
+ 629, 629, 629, 629, 629, 629, 629, 629,
+ 629, 629, 629, 636, 1, 1, 629, 629,
+ 629, 629, 629, 629, 629, 629, 629, 629,
+ 629, 629, 629, 629, 629, 629, 629, 629,
+ 629, 629, 629, 629, 629, 629, 629, 629,
+ 629, 629, 629, 629, 629, 629, 629, 1,
+ 788, 1, 1, 1, 789, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 788,
+ 790, 88, 790, 790, 790, 790, 790, 791,
+ 1, 790, 790, 1, 790, 90, 790, 790,
+ 790, 790, 790, 790, 790, 790, 790, 790,
+ 790, 1, 1, 1, 790, 1, 790, 1,
+ 790, 790, 790, 790, 790, 790, 790, 790,
+ 790, 790, 790, 790, 790, 790, 790, 790,
+ 790, 790, 790, 790, 790, 790, 790, 790,
+ 790, 790, 1, 1, 1, 790, 790, 790,
+ 790, 790, 790, 790, 790, 790, 790, 790,
+ 790, 790, 790, 790, 790, 790, 790, 790,
+ 790, 790, 790, 790, 790, 790, 790, 790,
+ 790, 790, 790, 790, 790, 790, 1, 788,
+ 1, 1, 1, 789, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 788, 792,
+ 92, 792, 792, 792, 792, 792, 791, 1,
+ 792, 792, 1, 792, 1, 792, 792, 792,
+ 792, 792, 792, 792, 792, 792, 792, 792,
+ 1, 1, 1, 792, 1, 792, 1, 792,
+ 792, 792, 792, 792, 792, 792, 792, 792,
+ 792, 792, 792, 792, 792, 792, 792, 792,
+ 792, 792, 792, 792, 792, 792, 792, 792,
+ 792, 1, 1, 1, 792, 792, 792, 792,
+ 792, 792, 792, 792, 792, 792, 792, 792,
+ 792, 792, 792, 792, 792, 792, 792, 792,
+ 792, 792, 792, 792, 792, 792, 792, 792,
+ 792, 792, 792, 792, 792, 1, 793, 1,
+ 788, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 788,
+ 1, 794, 1, 1, 1, 795, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 794, 607, 598, 607, 607, 607, 607, 607,
+ 796, 1, 607, 607, 1, 607, 797, 607,
+ 607, 607, 607, 607, 607, 607, 607, 607,
+ 607, 607, 1, 572, 573, 607, 1, 607,
+ 98, 607, 607, 607, 607, 607, 607, 607,
+ 607, 607, 607, 607, 607, 607, 607, 607,
+ 607, 607, 607, 607, 607, 607, 607, 607,
+ 607, 607, 607, 574, 1, 1, 607, 607,
+ 607, 607, 607, 607, 607, 607, 607, 607,
+ 607, 607, 607, 607, 607, 607, 607, 607,
+ 607, 607, 607, 607, 607, 607, 607, 607,
+ 607, 607, 607, 607, 607, 607, 607, 1,
+ 794, 1, 1, 1, 795, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 794,
+ 575, 576, 575, 575, 575, 575, 575, 796,
+ 1, 575, 575, 1, 575, 798, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 1, 572, 578, 575, 1, 575, 98,
+ 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 574, 1, 1, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 575, 1, 799,
+ 1, 800, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 800, 1, 801, 1, 1, 1, 802, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 801, 583, 584, 583, 583, 583, 583,
+ 583, 803, 1, 583, 583, 1, 583, 804,
+ 583, 583, 583, 583, 583, 583, 583, 583,
+ 583, 583, 583, 1, 587, 588, 583, 1,
+ 583, 108, 583, 583, 583, 583, 583, 583,
+ 583, 583, 583, 583, 583, 583, 583, 583,
+ 583, 583, 583, 583, 583, 583, 583, 583,
+ 583, 583, 583, 583, 589, 1, 1, 583,
+ 583, 583, 583, 583, 583, 583, 583, 583,
+ 583, 583, 583, 583, 583, 583, 583, 583,
+ 583, 583, 583, 583, 583, 583, 583, 583,
+ 583, 583, 583, 583, 583, 583, 583, 583,
+ 1, 805, 1, 1, 1, 806, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 805, 807, 754, 807, 807, 807, 807, 807,
+ 808, 1, 807, 807, 1, 807, 1, 807,
+ 807, 807, 807, 807, 807, 807, 807, 807,
+ 807, 807, 1, 1, 1, 807, 1, 807,
+ 1, 807, 807, 807, 807, 807, 807, 807,
+ 807, 807, 807, 807, 807, 807, 807, 807,
+ 807, 807, 807, 807, 807, 807, 807, 807,
+ 807, 807, 807, 1, 1, 1, 807, 807,
+ 807, 807, 807, 807, 807, 807, 807, 807,
+ 807, 807, 807, 807, 807, 807, 807, 807,
+ 807, 807, 807, 807, 807, 807, 807, 807,
+ 807, 807, 807, 807, 807, 807, 807, 1,
+ 21, 1, 1, 1, 22, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 21,
+ 23, 24, 23, 23, 23, 23, 23, 809,
+ 1, 23, 23, 1, 23, 26, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 1, 27, 28, 23, 1, 23, 29,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 30, 1, 1, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 1, 810,
+ 1, 1, 1, 811, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 810, 102,
+ 103, 102, 102, 102, 102, 102, 812, 1,
+ 102, 102, 1, 102, 813, 102, 102, 102,
+ 102, 102, 102, 102, 102, 102, 102, 102,
+ 1, 106, 107, 102, 1, 102, 1, 102,
+ 102, 102, 102, 102, 102, 102, 102, 102,
+ 102, 102, 102, 102, 102, 102, 102, 102,
+ 102, 102, 102, 102, 102, 102, 102, 102,
+ 102, 109, 1, 1, 102, 102, 102, 102,
+ 102, 102, 102, 102, 102, 102, 102, 102,
+ 102, 102, 102, 102, 102, 102, 102, 102,
+ 102, 102, 102, 102, 102, 102, 102, 102,
+ 102, 102, 102, 102, 102, 1, 814, 814,
+ 814, 814, 814, 814, 814, 814, 814, 1,
+ 814, 814, 815, 814, 814, 814, 814, 814,
+ 814, 814, 814, 814, 814, 814, 814, 814,
+ 814, 814, 814, 814, 814, 814, 814, 814,
+ 814, 814, 814, 814, 814, 816, 817, 814,
+ 814, 814, 814, 814, 814, 814, 814, 814,
+ 814, 814, 814, 814, 814, 814, 814, 814,
+ 814, 814, 814, 814, 814, 814, 814, 814,
+ 814, 814, 814, 814, 814, 814, 814, 814,
+ 814, 814, 814, 814, 814, 814, 814, 814,
+ 814, 814, 814, 814, 814, 814, 814, 814,
+ 814, 818, 814, 814, 814, 814, 814, 814,
+ 814, 814, 814, 814, 814, 814, 814, 814,
+ 814, 814, 814, 814, 814, 814, 814, 814,
+ 814, 814, 814, 814, 814, 814, 814, 814,
+ 814, 814, 814, 814, 814, 1, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 1,
+ 819, 819, 820, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 821, 822, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 823, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 1, 824, 1,
+ 819, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 819,
+ 1, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 819,
+ 819, 1, 825, 1, 1, 1, 826, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 825, 1, 1, 1, 1, 1, 1,
+ 1, 827, 1, 227, 1, 1, 1, 828,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 227, 1, 1, 1, 1, 1,
+ 1, 1, 829, 1, 830, 1, 1, 1,
+ 831, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 830, 1, 1, 1, 1,
+ 1, 1, 1, 832, 1, 825, 1, 1,
+ 1, 826, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 825, 1, 1, 1,
+ 1, 1, 1, 1, 827, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 833, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 833,
+ 1, 825, 1, 1, 1, 826, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 825, 1, 1, 1, 1, 1, 1, 1,
+ 827, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 833, 1, 825,
+ 1, 1, 1, 826, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 825, 1,
+ 1, 1, 1, 1, 1, 1, 827, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 199, 1, 1, 0
+]
+
+class << self
+ attr_accessor :_received_trans_targs
+ private :_received_trans_targs, :_received_trans_targs=
+end
+self._received_trans_targs = [
+ 2, 0, 3, 5, 9, 376, 287, 26,
+ 116, 278, 2, 3, 5, 9, 376, 287,
+ 26, 116, 278, 4, 2, 6, 7, 5,
+ 9, 364, 293, 26, 116, 263, 278, 6,
+ 7, 5, 9, 364, 365, 26, 116, 263,
+ 278, 8, 6, 10, 361, 362, 325, 360,
+ 10, 11, 13, 360, 12, 14, 15, 5,
+ 9, 17, 293, 26, 116, 263, 278, 14,
+ 15, 5, 9, 17, 18, 26, 116, 263,
+ 278, 16, 14, 14, 15, 5, 9, 17,
+ 18, 26, 116, 263, 278, 19, 20, 347,
+ 352, 346, 287, 22, 341, 21, 22, 23,
+ 25, 18, 263, 24, 22, 23, 5, 9,
+ 25, 18, 26, 116, 263, 278, 27, 28,
+ 30, 31, 96, 107, 109, 111, 114, 27,
+ 28, 30, 31, 29, 27, 28, 30, 31,
+ 96, 107, 109, 111, 114, 32, 33, 35,
+ 36, 81, 83, 85, 88, 90, 92, 94,
+ 34, 32, 33, 35, 36, 81, 83, 85,
+ 88, 90, 92, 94, 37, 80, 38, 39,
+ 41, 42, 40, 38, 39, 41, 42, 43,
+ 44, 45, 47, 48, 46, 44, 45, 47,
+ 48, 49, 50, 52, 53, 51, 49, 50,
+ 52, 53, 54, 56, 57, 55, 54, 56,
+ 57, 58, 59, 60, 62, 63, 73, 382,
+ 385, 386, 387, 61, 59, 60, 62, 63,
+ 64, 66, 67, 65, 64, 66, 67, 68,
+ 69, 70, 72, 71, 69, 70, 72, 74,
+ 75, 76, 78, 383, 82, 84, 86, 87,
+ 89, 91, 93, 95, 97, 98, 99, 101,
+ 102, 100, 98, 99, 101, 102, 103, 104,
+ 106, 103, 104, 106, 105, 103, 104, 106,
+ 108, 110, 112, 113, 115, 117, 118, 120,
+ 198, 215, 216, 238, 220, 117, 118, 215,
+ 216, 220, 119, 121, 122, 120, 172, 124,
+ 184, 2, 133, 121, 122, 124, 125, 133,
+ 123, 121, 122, 124, 125, 2, 133, 126,
+ 128, 166, 171, 127, 129, 130, 132, 133,
+ 131, 129, 130, 132, 133, 134, 135, 137,
+ 147, 161, 156, 162, 134, 135, 137, 147,
+ 161, 156, 162, 136, 138, 139, 141, 160,
+ 2, 142, 140, 138, 139, 141, 142, 2,
+ 143, 145, 146, 144, 143, 145, 146, 148,
+ 158, 157, 149, 151, 150, 152, 153, 155,
+ 154, 152, 153, 155, 159, 134, 135, 137,
+ 147, 161, 156, 162, 163, 165, 164, 167,
+ 168, 129, 170, 167, 168, 129, 170, 169,
+ 126, 128, 166, 171, 173, 182, 181, 174,
+ 176, 175, 177, 178, 180, 177, 178, 180,
+ 179, 177, 178, 180, 183, 185, 186, 189,
+ 188, 185, 186, 188, 187, 185, 186, 188,
+ 190, 195, 196, 194, 190, 191, 193, 194,
+ 192, 195, 196, 197, 199, 208, 209, 211,
+ 207, 199, 200, 202, 207, 201, 203, 204,
+ 206, 133, 203, 204, 206, 133, 205, 203,
+ 204, 206, 133, 208, 209, 211, 210, 211,
+ 212, 214, 133, 213, 211, 212, 214, 133,
+ 117, 118, 120, 198, 215, 216, 238, 220,
+ 217, 219, 218, 217, 219, 221, 222, 224,
+ 244, 258, 253, 259, 221, 222, 224, 244,
+ 258, 253, 259, 223, 225, 226, 228, 229,
+ 257, 233, 239, 227, 225, 226, 228, 229,
+ 239, 233, 229, 230, 232, 233, 231, 229,
+ 230, 232, 233, 234, 235, 120, 198, 237,
+ 238, 234, 235, 237, 236, 234, 235, 237,
+ 238, 240, 242, 243, 241, 240, 242, 243,
+ 245, 255, 254, 246, 248, 247, 249, 250,
+ 252, 251, 249, 250, 252, 256, 221, 222,
+ 224, 244, 258, 253, 259, 260, 262, 261,
+ 264, 265, 267, 331, 339, 340, 264, 265,
+ 267, 331, 339, 340, 278, 266, 268, 269,
+ 306, 307, 271, 330, 26, 116, 278, 5,
+ 9, 272, 116, 270, 268, 268, 269, 5,
+ 9, 271, 272, 26, 116, 278, 273, 274,
+ 277, 298, 305, 276, 275, 277, 9, 272,
+ 26, 279, 281, 282, 280, 283, 284, 5,
+ 286, 287, 287, 285, 283, 283, 284, 286,
+ 287, 288, 289, 290, 292, 289, 290, 292,
+ 287, 291, 289, 289, 290, 5, 9, 292,
+ 287, 26, 116, 263, 278, 294, 295, 5,
+ 9, 297, 293, 26, 116, 278, 294, 295,
+ 5, 9, 297, 287, 26, 116, 278, 296,
+ 294, 294, 295, 5, 9, 297, 287, 26,
+ 116, 278, 299, 303, 302, 300, 301, 304,
+ 273, 274, 276, 305, 308, 322, 323, 321,
+ 308, 309, 311, 321, 310, 312, 313, 26,
+ 312, 314, 313, 315, 319, 318, 316, 317,
+ 320, 322, 323, 325, 324, 326, 327, 5,
+ 9, 329, 18, 26, 116, 263, 278, 5,
+ 9, 18, 116, 328, 326, 326, 327, 5,
+ 9, 329, 18, 26, 116, 263, 278, 306,
+ 332, 337, 336, 333, 335, 334, 338, 264,
+ 265, 267, 331, 339, 340, 278, 342, 343,
+ 22, 345, 342, 343, 22, 345, 344, 19,
+ 20, 22, 341, 346, 348, 349, 351, 348,
+ 349, 351, 18, 350, 348, 348, 349, 351,
+ 18, 353, 357, 358, 356, 353, 354, 347,
+ 356, 355, 357, 358, 359, 361, 362, 363,
+ 6, 7, 364, 365, 366, 367, 375, 374,
+ 369, 368, 370, 371, 373, 365, 365, 372,
+ 370, 370, 371, 373, 365, 366, 367, 369,
+ 374, 364, 2, 3, 376, 287, 378, 379,
+ 378, 388, 381, 378, 379, 378, 388, 381,
+ 380, 383, 77, 384, 77, 384, 383, 77,
+ 384, 79
+]
+
+class << self
+ attr_accessor :_received_trans_actions
+ private :_received_trans_actions, :_received_trans_actions=
+end
+self._received_trans_actions = [
+ 1, 0, 1, 1, 1, 2, 1, 3,
+ 4, 5, 6, 6, 6, 6, 7, 6,
+ 8, 9, 10, 0, 0, 11, 11, 11,
+ 11, 12, 11, 13, 14, 15, 16, 17,
+ 17, 18, 18, 19, 18, 20, 21, 22,
+ 23, 0, 0, 24, 24, 24, 25, 24,
+ 0, 0, 26, 0, 0, 27, 27, 27,
+ 27, 28, 27, 29, 30, 31, 32, 33,
+ 33, 34, 34, 35, 34, 36, 37, 38,
+ 39, 0, 0, 40, 40, 41, 41, 42,
+ 41, 43, 44, 45, 46, 0, 0, 0,
+ 0, 47, 0, 0, 0, 0, 6, 6,
+ 7, 6, 0, 0, 48, 48, 48, 48,
+ 49, 48, 50, 51, 52, 53, 54, 54,
+ 55, 54, 0, 0, 0, 0, 0, 0,
+ 0, 47, 0, 0, 52, 52, 56, 52,
+ 52, 52, 52, 52, 52, 0, 0, 47,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 52, 52, 56, 52, 52, 52, 52,
+ 52, 52, 52, 52, 0, 0, 0, 0,
+ 47, 0, 0, 52, 52, 56, 52, 0,
+ 0, 0, 47, 57, 0, 52, 52, 56,
+ 58, 0, 0, 47, 0, 0, 52, 52,
+ 56, 52, 0, 47, 0, 0, 52, 56,
+ 52, 0, 0, 0, 47, 0, 0, 0,
+ 0, 0, 0, 0, 52, 52, 56, 52,
+ 0, 47, 0, 0, 52, 56, 52, 0,
+ 0, 0, 47, 0, 52, 52, 56, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 47,
+ 0, 0, 52, 52, 56, 52, 54, 54,
+ 59, 0, 0, 47, 0, 52, 52, 56,
+ 0, 0, 0, 0, 0, 60, 60, 61,
+ 61, 62, 63, 61, 63, 0, 0, 47,
+ 0, 0, 0, 64, 64, 0, 0, 65,
+ 0, 64, 15, 0, 0, 47, 0, 22,
+ 0, 52, 52, 56, 52, 52, 66, 0,
+ 0, 0, 47, 0, 0, 0, 47, 0,
+ 0, 52, 52, 56, 52, 10, 10, 10,
+ 10, 67, 10, 10, 0, 0, 0, 0,
+ 47, 0, 0, 0, 0, 0, 47, 0,
+ 68, 0, 0, 52, 52, 56, 52, 69,
+ 0, 0, 47, 0, 52, 52, 56, 0,
+ 0, 0, 0, 0, 0, 0, 0, 47,
+ 0, 52, 52, 56, 0, 52, 52, 52,
+ 52, 56, 52, 52, 0, 0, 0, 24,
+ 24, 25, 24, 0, 0, 26, 0, 0,
+ 52, 52, 52, 56, 0, 0, 0, 0,
+ 0, 0, 64, 64, 65, 0, 0, 47,
+ 0, 52, 52, 56, 0, 64, 64, 0,
+ 65, 0, 0, 47, 0, 52, 52, 56,
+ 24, 24, 24, 24, 0, 0, 26, 0,
+ 0, 0, 0, 0, 24, 24, 24, 25,
+ 24, 0, 0, 26, 0, 0, 64, 64,
+ 65, 31, 0, 0, 47, 38, 0, 52,
+ 52, 56, 45, 0, 0, 26, 0, 0,
+ 0, 47, 70, 0, 52, 52, 56, 71,
+ 52, 52, 72, 72, 56, 52, 72, 52,
+ 0, 47, 0, 52, 56, 10, 10, 10,
+ 10, 67, 10, 10, 0, 0, 0, 0,
+ 47, 0, 0, 0, 0, 0, 47, 68,
+ 0, 68, 0, 0, 52, 52, 56, 69,
+ 52, 69, 0, 0, 47, 0, 0, 52,
+ 52, 56, 52, 73, 73, 73, 73, 74,
+ 73, 0, 0, 47, 0, 52, 52, 56,
+ 0, 0, 0, 47, 0, 52, 52, 56,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 47, 0, 52, 52, 56, 0, 52, 52,
+ 52, 52, 56, 52, 52, 0, 0, 0,
+ 10, 10, 10, 10, 67, 10, 0, 0,
+ 0, 0, 47, 0, 0, 0, 75, 75,
+ 75, 75, 76, 75, 77, 78, 79, 80,
+ 80, 80, 81, 0, 0, 82, 82, 83,
+ 83, 84, 83, 85, 86, 87, 0, 0,
+ 0, 0, 47, 0, 0, 75, 75, 75,
+ 88, 0, 0, 0, 0, 75, 75, 75,
+ 76, 75, 80, 0, 0, 82, 82, 84,
+ 83, 0, 11, 11, 89, 17, 17, 19,
+ 18, 0, 0, 90, 90, 91, 91, 92,
+ 91, 93, 94, 66, 95, 96, 96, 96,
+ 96, 97, 96, 98, 99, 100, 101, 101,
+ 102, 102, 103, 102, 104, 105, 106, 0,
+ 0, 107, 107, 108, 108, 109, 108, 110,
+ 111, 112, 0, 0, 0, 0, 0, 0,
+ 52, 52, 52, 56, 24, 24, 24, 24,
+ 0, 0, 26, 0, 0, 75, 75, 113,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 26, 0, 114, 114, 114,
+ 114, 115, 114, 116, 117, 70, 118, 119,
+ 119, 119, 120, 0, 0, 121, 121, 122,
+ 122, 123, 122, 124, 125, 71, 126, 0,
+ 0, 0, 0, 0, 0, 0, 0, 52,
+ 52, 52, 52, 56, 52, 52, 24, 24,
+ 25, 24, 0, 0, 26, 0, 0, 52,
+ 52, 52, 52, 56, 11, 11, 89, 17,
+ 17, 19, 18, 0, 0, 90, 90, 92,
+ 91, 24, 24, 24, 24, 0, 0, 26,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 90, 90, 92, 91, 0, 0, 0, 47,
+ 0, 0, 75, 75, 76, 75, 80, 0,
+ 0, 82, 82, 84, 83, 52, 52, 52,
+ 56, 89, 48, 48, 49, 48, 127, 127,
+ 128, 129, 127, 0, 0, 47, 130, 0,
+ 0, 131, 131, 132, 0, 47, 52, 52,
+ 56, 0
+]
+
+class << self
+ attr_accessor :_received_eof_actions
+ private :_received_eof_actions, :_received_eof_actions=
+end
+self._received_eof_actions = [
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 131, 0,
+ 52, 131, 131, 131, 0
+]
+
+class << self
+ attr_accessor :received_start
+end
+self.received_start = 1;
+class << self
+ attr_accessor :received_first_final
+end
+self.received_first_final = 382;
+class << self
+ attr_accessor :received_error
+end
+self.received_error = 0;
+
+class << self
+ attr_accessor :received_en_comment_tail
+end
+self.received_en_comment_tail = 377;
+class << self
+ attr_accessor :received_en_main
+end
+self.received_en_main = 1;
+
+
+# line 17 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/received_machine.rb.rl"
+
+ def self.parse(data)
+ p = 0
+ eof = data.length
+ stack = []
+
+ actions = []
+ data_unpacked = data.bytes.to_a
+
+# line 3475 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/received_machine.rb"
+begin
+ p ||= 0
+ pe ||= data.length
+ cs = received_start
+ top = 0
+end
+
+# line 26 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/received_machine.rb.rl"
+
+# line 3485 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/received_machine.rb"
+begin
+ testEof = false
+ _slen, _trans, _keys, _inds, _acts, _nacts = nil
+ _goto_level = 0
+ _resume = 10
+ _eof_trans = 15
+ _again = 20
+ _test_eof = 30
+ _out = 40
+ while true
+ if _goto_level <= 0
+ if p == pe
+ _goto_level = _test_eof
+ next
+ end
+ if cs == 0
+ _goto_level = _out
+ next
+ end
+ end
+ if _goto_level <= _resume
+ _keys = cs << 1
+ _inds = _received_index_offsets[cs]
+ _slen = _received_key_spans[cs]
+ _trans = if ( _slen > 0 &&
+ _received_trans_keys[_keys] <= ( data_unpacked[p]) &&
+ ( data_unpacked[p]) <= _received_trans_keys[_keys + 1]
+ ) then
+ _received_indicies[ _inds + ( data_unpacked[p]) - _received_trans_keys[_keys] ]
+ else
+ _received_indicies[ _inds + _slen ]
+ end
+ cs = _received_trans_targs[_trans]
+ if _received_trans_actions[_trans] != 0
+ case _received_trans_actions[_trans]
+ when 9 then
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(3, p) end
+ when 52 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+ when 127 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+ when 54 then
+# line 12 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(9, p) end
+ when 68 then
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+ when 10 then
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 22 then
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+ when 64 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+ when 61 then
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+ when 70 then
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+ when 63 then
+# line 34 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(31, p) end
+ when 26 then
+# line 41 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(38, p) end
+ when 24 then
+# line 42 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(39, p) end
+ when 8 then
+# line 43 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(40, p) end
+ when 131 then
+# line 47 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(44, p) end
+ when 47 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+ when 130 then
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ top -= 1
+ cs = stack[top]
+ _goto_level = _again
+ next
+ end
+ end
+ when 81 then
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(3, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+ when 105 then
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(3, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+ when 120 then
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(3, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+ when 51 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(3, p) end
+ when 69 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+ when 53 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 66 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+ when 72 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+ when 71 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+ when 50 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 43 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(40, p) end
+ when 56 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+ when 128 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+ when 129 then
+# line 8 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(5, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ top -= 1
+ cs = stack[top]
+ _goto_level = _again
+ next
+ end
+ end
+ when 57 then
+# line 11 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(8, p) end
+# line 48 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(45, p) end
+ when 59 then
+# line 12 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(9, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+ when 78 then
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(3, p) end
+ when 79 then
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 77 then
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 43 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(40, p) end
+ when 67 then
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+ when 106 then
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 38 then
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+ when 104 then
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 43 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(40, p) end
+ when 15 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+ when 65 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+ when 6 then
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 60 then
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 34 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(31, p) end
+ when 117 then
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(3, p) end
+ when 118 then
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 116 then
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 43 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(40, p) end
+ when 73 then
+# line 33 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(30, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+ when 25 then
+# line 42 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(39, p) end
+# line 41 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(38, p) end
+ when 4 then
+# line 44 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(41, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(3, p) end
+ when 5 then
+# line 44 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(41, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 3 then
+# line 44 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(41, p) end
+# line 43 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(40, p) end
+ when 132 then
+# line 47 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(44, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+ when 55 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+# line 12 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(9, p) end
+ when 21 then
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(3, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+ when 86 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(3, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+ when 111 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(3, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+ when 125 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(3, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+ when 58 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 11 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(8, p) end
+# line 48 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(45, p) end
+ when 87 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 85 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 43 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(40, p) end
+ when 112 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 45 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+ when 110 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 43 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(40, p) end
+ when 48 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 126 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 124 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 43 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(40, p) end
+ when 75 then
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 23 then
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 20 then
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 43 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(40, p) end
+ when 101 then
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 99 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(3, p) end
+ when 100 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 31 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+ when 98 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 43 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(40, p) end
+ when 80 then
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 102 then
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 119 then
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 62 then
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+# line 34 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(31, p) end
+ when 114 then
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 74 then
+# line 33 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(30, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+ when 1 then
+# line 44 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(41, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 7 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 37 then
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(3, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+ when 94 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(3, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+ when 82 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 95 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 93 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 43 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(40, p) end
+ when 107 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 83 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 108 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 122 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 121 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 49 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 88 then
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 43 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(40, p) end
+ when 17 then
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 39 then
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 36 then
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 43 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(40, p) end
+ when 14 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(3, p) end
+ when 16 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 13 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 43 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(40, p) end
+ when 96 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 18 then
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 2 then
+# line 44 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(41, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 76 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 103 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 115 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 44 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(3, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+ when 90 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 46 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 43 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 43 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(40, p) end
+ when 91 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 84 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 109 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 123 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 113 then
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 43 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(40, p) end
+ when 33 then
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 11 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 30 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 6 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(3, p) end
+ when 32 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 29 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 43 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(40, p) end
+ when 97 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 34 then
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 19 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 40 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 41 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 92 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 27 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 89 then
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 35 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 12 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 42 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+ when 28 then
+# line 5 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/../../common.rl"
+ begin
+ begin
+ stack[top] = cs
+ top+= 1
+ cs = 377
+ _goto_level = _again
+ next
+ end
+ end
+# line 22 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(19, p) end
+# line 21 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(18, p) end
+# line 24 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(21, p) end
+# line 15 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(12, p) end
+# line 23 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(20, p) end
+# line 16 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(13, p) end
+# line 5093 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/received_machine.rb"
+ end
+ end
+ end
+ if _goto_level <= _again
+ if cs == 0
+ _goto_level = _out
+ next
+ end
+ p += 1
+ if p != pe
+ _goto_level = _resume
+ next
+ end
+ end
+ if _goto_level <= _test_eof
+ if p == eof
+ case _received_eof_actions[cs]
+ when 52 then
+# line 7 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(4, p) end
+ when 131 then
+# line 47 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl"
+ begin
+ actions.push(44, p) end
+# line 5119 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/received_machine.rb"
+ end
+ end
+
+ end
+ if _goto_level <= _out
+ break
+ end
+end
+ end
+
+# line 27 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/received_machine.rb.rl"
+
+ if p == eof && cs >=
+# line 5133 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/received_machine.rb"
+382
+# line 28 "/home/bpot/src/gh/bpot/mail/lib/mail/parsers/ragel/ruby/machines/received_machine.rb.rl"
+
+ return actions, nil
+ else
+ return [], "Only able to parse up to #{data[0..p]}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel/ruby/machines/received_machine.rb.rl b/lib/mail/parsers/ragel/ruby/machines/received_machine.rb.rl
new file mode 100644
index 0000000..c5ae6ee
--- /dev/null
+++ b/lib/mail/parsers/ragel/ruby/machines/received_machine.rb.rl
@@ -0,0 +1,37 @@
+%%{
+ machine received;
+
+ include rb_actions "rb_actions.rl";
+ include common "../../common.rl";
+
+ getkey data_unpacked[p];
+
+ main := received;
+}%%
+
+module Mail
+ module Parsers
+ module Ragel
+ module ReceivedMachine
+ %%write data;
+
+ def self.parse(data)
+ p = 0
+ eof = data.length
+ stack = []
+
+ actions = []
+ data_unpacked = data.bytes.to_a
+ %%write init;
+ %%write exec;
+
+ if p == eof && cs >= %%{ write first_final; }%%
+ return actions, nil
+ else
+ return [], "Only able to parse up to #{data[0..p]}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/mail/parsers/ragel/ruby/parser.rb.rl.erb b/lib/mail/parsers/ragel/ruby/parser.rb.rl.erb
new file mode 100644
index 0000000..d2b8424
--- /dev/null
+++ b/lib/mail/parsers/ragel/ruby/parser.rb.rl.erb
@@ -0,0 +1,37 @@
+%%{
+ machine <%= parser_name %>;
+
+ include rb_actions "rb_actions.rl";
+ include common "../../common.rl";
+
+ getkey data_unpacked[p];
+
+ main := <%= parser_name %>;
+}%%
+
+module Mail
+ module Parsers
+ module Ragel
+ module <%= parser_name_cc %>
+ %%write data;
+
+ def self.parse(data)
+ p = 0
+ eof = data.length
+ stack = []
+
+ actions = []
+ data_unpacked = data.bytes.to_a
+ %%write init;
+ %%write exec;
+
+ if p == eof && cs >= %%{ write first_final; }%%
+ return actions, nil
+ else
+ return [], "Only able to parse up to #{data[0..p]}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/mail/parsers/received.rb b/lib/mail/parsers/received.rb
deleted file mode 100644
index 6d632f1..0000000
--- a/lib/mail/parsers/received.rb
+++ /dev/null
@@ -1,71 +0,0 @@
-# Autogenerated from a Treetop grammar. Edits may be lost.
-
-
-module Mail
- module Received
- include Treetop::Runtime
-
- def root
- @root ||= :primary
- end
-
- include RFC2822
-
- module Primary0
- def name_val_list
- elements[0]
- end
-
- def date_time
- elements[2]
- end
- end
-
- def _nt_primary
- start_index = index
- if node_cache[:primary].has_key?(index)
- cached = node_cache[:primary][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r1 = _nt_name_val_list
- s0 << r1
- if r1
- if has_terminal?(";", false, index)
- r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(";")
- r2 = nil
- end
- s0 << r2
- if r2
- r3 = _nt_date_time
- s0 << r3
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(Primary0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:primary][start_index] = r0
-
- r0
- end
-
- end
-
- class ReceivedParser < Treetop::Runtime::CompiledParser
- include Received
- end
-
-end
\ No newline at end of file
diff --git a/lib/mail/parsers/received.treetop b/lib/mail/parsers/received.treetop
deleted file mode 100644
index b4c9b59..0000000
--- a/lib/mail/parsers/received.treetop
+++ /dev/null
@@ -1,11 +0,0 @@
-module Mail
- grammar Received
-
- include RFC2822
-
- rule primary
- name_val_list ";" date_time
- end
-
- end
-end
\ No newline at end of file
diff --git a/lib/mail/parsers/received_parser.rb b/lib/mail/parsers/received_parser.rb
new file mode 100644
index 0000000..cca50ce
--- /dev/null
+++ b/lib/mail/parsers/received_parser.rb
@@ -0,0 +1,47 @@
+module Mail::Parsers
+ class ReceivedParser
+
+ def parse(s)
+ actions, error = Ragel.parse(:received, s)
+ if error
+ raise Mail::Field::ParseError.new(Mail::ReceivedElement, s, error)
+ end
+
+ received = ReceivedStruct.new
+
+ received_tokens_s = date_s = time_s = nil
+ actions.each_slice(2) do |action_id, p|
+ action = Mail::Parsers::Ragel::ACTIONS[action_id]
+ case action
+
+ # Received Tokens:
+ when :received_tokens_s then received_tokens_s = p
+ when :received_tokens_e
+ received.info = s[received_tokens_s..(p-1)]
+
+ # Date
+ when :date_s then date_s = p
+ when :date_e
+ received.date = s[date_s..(p-1)].strip
+
+ # Time
+ when :time_s then time_s = p
+ when :time_e
+ received.time = s[time_s..(p-1)]
+
+ when :angle_addr_s, :comment_e, :comment_s,
+ :domain_e, :domain_s, :local_dot_atom_e,
+ :local_dot_atom_pre_comment_e,
+ :local_dot_atom_pre_comment_s,
+ :local_dot_atom_s, :qstr_e, :qstr_s,
+ :local_quoted_string_s, :local_quoted_string_e
+ # ignored actions
+
+ else
+ raise Mail::Field::ParseError.new(Mail::ReceivedElement, s, "Failed to process unknown action: #{action}")
+ end
+ end
+ received
+ end
+ end
+end
diff --git a/lib/mail/parsers/rfc2045.rb b/lib/mail/parsers/rfc2045.rb
deleted file mode 100644
index 285c342..0000000
--- a/lib/mail/parsers/rfc2045.rb
+++ /dev/null
@@ -1,421 +0,0 @@
-# Autogenerated from a Treetop grammar. Edits may be lost.
-
-
-module Mail
- module RFC2045
- include Treetop::Runtime
-
- def root
- @root ||= :tspecials
- end
-
- def _nt_tspecials
- start_index = index
- if node_cache[:tspecials].has_key?(index)
- cached = node_cache[:tspecials][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- if has_terminal?("(", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("(")
- r1 = nil
- end
- if r1
- r0 = r1
- else
- if has_terminal?(")", false, index)
- r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(")")
- r2 = nil
- end
- if r2
- r0 = r2
- else
- if has_terminal?("<", false, index)
- r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("<")
- r3 = nil
- end
- if r3
- r0 = r3
- else
- if has_terminal?(">", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(">")
- r4 = nil
- end
- if r4
- r0 = r4
- else
- if has_terminal?("@", false, index)
- r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("@")
- r5 = nil
- end
- if r5
- r0 = r5
- else
- if has_terminal?(",", false, index)
- r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(",")
- r6 = nil
- end
- if r6
- r0 = r6
- else
- if has_terminal?(";", false, index)
- r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(";")
- r7 = nil
- end
- if r7
- r0 = r7
- else
- if has_terminal?(":", false, index)
- r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r8 = nil
- end
- if r8
- r0 = r8
- else
- if has_terminal?('\\', false, index)
- r9 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure('\\')
- r9 = nil
- end
- if r9
- r0 = r9
- else
- if has_terminal?("<", false, index)
- r10 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("<")
- r10 = nil
- end
- if r10
- r0 = r10
- else
- if has_terminal?(">", false, index)
- r11 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(">")
- r11 = nil
- end
- if r11
- r0 = r11
- else
- if has_terminal?("/", false, index)
- r12 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("/")
- r12 = nil
- end
- if r12
- r0 = r12
- else
- if has_terminal?("[", false, index)
- r13 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("[")
- r13 = nil
- end
- if r13
- r0 = r13
- else
- if has_terminal?("]", false, index)
- r14 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("]")
- r14 = nil
- end
- if r14
- r0 = r14
- else
- if has_terminal?("?", false, index)
- r15 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("?")
- r15 = nil
- end
- if r15
- r0 = r15
- else
- if has_terminal?("=", false, index)
- r16 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("=")
- r16 = nil
- end
- if r16
- r0 = r16
- else
- @index = i0
- r0 = nil
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
-
- node_cache[:tspecials][start_index] = r0
-
- r0
- end
-
- def _nt_ietf_token
- start_index = index
- if node_cache[:ietf_token].has_key?(index)
- cached = node_cache[:ietf_token][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- s0, i0 = [], index
- loop do
- r1 = _nt_token
- if r1
- s0 << r1
- else
- break
- end
- end
- if s0.empty?
- @index = i0
- r0 = nil
- else
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- end
-
- node_cache[:ietf_token][start_index] = r0
-
- r0
- end
-
- module CustomXToken0
- end
-
- def _nt_custom_x_token
- start_index = index
- if node_cache[:custom_x_token].has_key?(index)
- cached = node_cache[:custom_x_token][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?('\G[xX]', true, index)
- r1 = true
- @index += 1
- else
- r1 = nil
- end
- s0 << r1
- if r1
- if has_terminal?("-", false, index)
- r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("-")
- r2 = nil
- end
- s0 << r2
- if r2
- s3, i3 = [], index
- loop do
- r4 = _nt_token
- if r4
- s3 << r4
- else
- break
- end
- end
- if s3.empty?
- @index = i3
- r3 = nil
- else
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
- end
- s0 << r3
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(CustomXToken0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:custom_x_token][start_index] = r0
-
- r0
- end
-
- def _nt_iana_token
- start_index = index
- if node_cache[:iana_token].has_key?(index)
- cached = node_cache[:iana_token][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- s0, i0 = [], index
- loop do
- r1 = _nt_token
- if r1
- s0 << r1
- else
- break
- end
- end
- if s0.empty?
- @index = i0
- r0 = nil
- else
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- end
-
- node_cache[:iana_token][start_index] = r0
-
- r0
- end
-
- def _nt_token
- start_index = index
- if node_cache[:token].has_key?(index)
- cached = node_cache[:token][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- if has_terminal?('\G[\\x21-\\x27]', true, index)
- r1 = true
- @index += 1
- else
- r1 = nil
- end
- if r1
- r0 = r1
- else
- if has_terminal?('\G[\\x2a-\\x2b]', true, index)
- r2 = true
- @index += 1
- else
- r2 = nil
- end
- if r2
- r0 = r2
- else
- if has_terminal?('\G[\\x2c-\\x2e]', true, index)
- r3 = true
- @index += 1
- else
- r3 = nil
- end
- if r3
- r0 = r3
- else
- if has_terminal?('\G[\\x30-\\x39]', true, index)
- r4 = true
- @index += 1
- else
- r4 = nil
- end
- if r4
- r0 = r4
- else
- if has_terminal?('\G[\\x41-\\x5a]', true, index)
- r5 = true
- @index += 1
- else
- r5 = nil
- end
- if r5
- r0 = r5
- else
- if has_terminal?('\G[\\x5e-\\x7e]', true, index)
- r6 = true
- @index += 1
- else
- r6 = nil
- end
- if r6
- r0 = r6
- else
- @index = i0
- r0 = nil
- end
- end
- end
- end
- end
- end
-
- node_cache[:token][start_index] = r0
-
- r0
- end
-
- end
-
- class RFC2045Parser < Treetop::Runtime::CompiledParser
- include RFC2045
- end
-
-end
diff --git a/lib/mail/parsers/rfc2045.treetop b/lib/mail/parsers/rfc2045.treetop
deleted file mode 100644
index 2839e73..0000000
--- a/lib/mail/parsers/rfc2045.treetop
+++ /dev/null
@@ -1,35 +0,0 @@
-module Mail
- grammar RFC2045
-
- rule tspecials
- "(" / ")" / "<" / ">" / "@" /
- "," / ";" / ":" / '\\' / "<" / ">" /
- "/" / "[" / "]" / "?" / "="
- end
-
- rule ietf_token
- token+
- end
-
- rule custom_x_token
- [xX] "-" token+
- end
-
- rule iana_token
- token+
-# <A publicly-defined extension token. Tokens
-# of this form must be registered with IANA
-# as specified in RFC 2048.>
- end
-
- rule token
- [\x21-\x27] / # any (US-ASCII) CHAR
- [\x2a-\x2b] / # except SPACE,
- [\x2c-\x2e] / # CTLs,
- [\x30-\x39] / # or tspecials
- [\x41-\x5a] /
- [\x5e-\x7e]
- end
-
- end
-end
diff --git a/lib/mail/parsers/rfc2822.rb b/lib/mail/parsers/rfc2822.rb
deleted file mode 100644
index 7c31d10..0000000
--- a/lib/mail/parsers/rfc2822.rb
+++ /dev/null
@@ -1,5397 +0,0 @@
-# Autogenerated from a Treetop grammar. Edits may be lost.
-
-
-module Mail
- module RFC2822
- include Treetop::Runtime
-
- def root
- @root ||= :ALPHA
- end
-
- include RFC2822Obsolete
-
- def _nt_ALPHA
- start_index = index
- if node_cache[:ALPHA].has_key?(index)
- cached = node_cache[:ALPHA][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- if has_terminal?('\G[a-zA-Z]', true, index)
- r0 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- r0 = nil
- end
-
- node_cache[:ALPHA][start_index] = r0
-
- r0
- end
-
- def _nt_DIGIT
- start_index = index
- if node_cache[:DIGIT].has_key?(index)
- cached = node_cache[:DIGIT][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- if has_terminal?('\G[0-9]', true, index)
- r0 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- r0 = nil
- end
-
- node_cache[:DIGIT][start_index] = r0
-
- r0
- end
-
- def _nt_DQUOTE
- start_index = index
- if node_cache[:DQUOTE].has_key?(index)
- cached = node_cache[:DQUOTE][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- if has_terminal?('"', false, index)
- r0 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure('"')
- r0 = nil
- end
-
- node_cache[:DQUOTE][start_index] = r0
-
- r0
- end
-
- def _nt_LF
- start_index = index
- if node_cache[:LF].has_key?(index)
- cached = node_cache[:LF][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- if has_terminal?("\n", false, index)
- r0 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("\n")
- r0 = nil
- end
-
- node_cache[:LF][start_index] = r0
-
- r0
- end
-
- def _nt_CR
- start_index = index
- if node_cache[:CR].has_key?(index)
- cached = node_cache[:CR][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- if has_terminal?("\r", false, index)
- r0 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("\r")
- r0 = nil
- end
-
- node_cache[:CR][start_index] = r0
-
- r0
- end
-
- def _nt_CRLF
- start_index = index
- if node_cache[:CRLF].has_key?(index)
- cached = node_cache[:CRLF][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- if has_terminal?("\r\n", false, index)
- r0 = instantiate_node(SyntaxNode,input, index...(index + 2))
- @index += 2
- else
- terminal_parse_failure("\r\n")
- r0 = nil
- end
-
- node_cache[:CRLF][start_index] = r0
-
- r0
- end
-
- def _nt_WSP
- start_index = index
- if node_cache[:WSP].has_key?(index)
- cached = node_cache[:WSP][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- if has_terminal?('\G[\\x09\\x20]', true, index)
- r0 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- r0 = nil
- end
-
- node_cache[:WSP][start_index] = r0
-
- r0
- end
-
- module FWS0
- def CRLF
- elements[1]
- end
-
- end
-
- module FWS1
- def CRLF
- elements[0]
- end
-
- end
-
- def _nt_FWS
- start_index = index
- if node_cache[:FWS].has_key?(index)
- cached = node_cache[:FWS][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- i1, s1 = index, []
- s2, i2 = [], index
- loop do
- r3 = _nt_WSP
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s1 << r2
- if r2
- r4 = _nt_CRLF
- s1 << r4
- if r4
- s5, i5 = [], index
- loop do
- r6 = _nt_WSP
- if r6
- s5 << r6
- else
- break
- end
- end
- if s5.empty?
- @index = i5
- r5 = nil
- else
- r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
- end
- s1 << r5
- end
- end
- if s1.last
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- r1.extend(FWS0)
- else
- @index = i1
- r1 = nil
- end
- if r1
- r0 = r1
- else
- i7, s7 = index, []
- r8 = _nt_CRLF
- s7 << r8
- if r8
- s9, i9 = [], index
- loop do
- r10 = _nt_WSP
- if r10
- s9 << r10
- else
- break
- end
- end
- if s9.empty?
- @index = i9
- r9 = nil
- else
- r9 = instantiate_node(SyntaxNode,input, i9...index, s9)
- end
- s7 << r9
- end
- if s7.last
- r7 = instantiate_node(SyntaxNode,input, i7...index, s7)
- r7.extend(FWS1)
- else
- @index = i7
- r7 = nil
- end
- if r7
- r0 = r7
- else
- r11 = _nt_obs_FWS
- if r11
- r0 = r11
- else
- @index = i0
- r0 = nil
- end
- end
- end
-
- node_cache[:FWS][start_index] = r0
-
- r0
- end
-
- module CFWS0
- def comment
- elements[1]
- end
- end
-
- module CFWS1
- end
-
- def _nt_CFWS
- start_index = index
- if node_cache[:CFWS].has_key?(index)
- cached = node_cache[:CFWS][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- s1, i1 = [], index
- loop do
- i2, s2 = index, []
- s3, i3 = [], index
- loop do
- r4 = _nt_FWS
- if r4
- s3 << r4
- else
- break
- end
- end
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
- s2 << r3
- if r3
- r5 = _nt_comment
- s2 << r5
- end
- if s2.last
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- r2.extend(CFWS0)
- else
- @index = i2
- r2 = nil
- end
- if r2
- s1 << r2
- else
- break
- end
- end
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- s0 << r1
- if r1
- r7 = _nt_FWS
- if r7
- r6 = r7
- else
- r6 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r6
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(CFWS1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:CFWS][start_index] = r0
-
- r0
- end
-
- def _nt_NO_WS_CTL
- start_index = index
- if node_cache[:NO_WS_CTL].has_key?(index)
- cached = node_cache[:NO_WS_CTL][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- if has_terminal?('\G[\\x01-\\x08]', true, index)
- r1 = true
- @index += 1
- else
- r1 = nil
- end
- if r1
- r0 = r1
- else
- if has_terminal?('\G[\\x0B-\\x0C]', true, index)
- r2 = true
- @index += 1
- else
- r2 = nil
- end
- if r2
- r0 = r2
- else
- if has_terminal?('\G[\\x0E-\\x1F]', true, index)
- r3 = true
- @index += 1
- else
- r3 = nil
- end
- if r3
- r0 = r3
- else
- if has_terminal?('\G[\\x7f]', true, index)
- r4 = true
- @index += 1
- else
- r4 = nil
- end
- if r4
- r0 = r4
- else
- @index = i0
- r0 = nil
- end
- end
- end
- end
-
- node_cache[:NO_WS_CTL][start_index] = r0
-
- r0
- end
-
- def _nt_specials
- start_index = index
- if node_cache[:specials].has_key?(index)
- cached = node_cache[:specials][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- if has_terminal?("(", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("(")
- r1 = nil
- end
- if r1
- r0 = r1
- else
- if has_terminal?(")", false, index)
- r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(")")
- r2 = nil
- end
- if r2
- r0 = r2
- else
- if has_terminal?("<", false, index)
- r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("<")
- r3 = nil
- end
- if r3
- r0 = r3
- else
- if has_terminal?(">", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(">")
- r4 = nil
- end
- if r4
- r0 = r4
- else
- if has_terminal?("[", false, index)
- r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("[")
- r5 = nil
- end
- if r5
- r0 = r5
- else
- if has_terminal?("]", false, index)
- r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("]")
- r6 = nil
- end
- if r6
- r0 = r6
- else
- if has_terminal?(":", false, index)
- r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r7 = nil
- end
- if r7
- r0 = r7
- else
- if has_terminal?(";", false, index)
- r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(";")
- r8 = nil
- end
- if r8
- r0 = r8
- else
- if has_terminal?("@", false, index)
- r9 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("@")
- r9 = nil
- end
- if r9
- r0 = r9
- else
- if has_terminal?('\\', false, index)
- r10 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure('\\')
- r10 = nil
- end
- if r10
- r0 = r10
- else
- if has_terminal?(",", false, index)
- r11 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(",")
- r11 = nil
- end
- if r11
- r0 = r11
- else
- if has_terminal?(".", false, index)
- r12 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(".")
- r12 = nil
- end
- if r12
- r0 = r12
- else
- r13 = _nt_DQUOTE
- if r13
- r0 = r13
- else
- @index = i0
- r0 = nil
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
-
- node_cache[:specials][start_index] = r0
-
- r0
- end
-
- def _nt_ctext
- start_index = index
- if node_cache[:ctext].has_key?(index)
- cached = node_cache[:ctext][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_NO_WS_CTL
- if r1
- r0 = r1
- else
- if has_terminal?('\G[\\x21-\\x27]', true, index)
- r2 = true
- @index += 1
- else
- r2 = nil
- end
- if r2
- r0 = r2
- else
- if has_terminal?('\G[\\x2a-\\x5b]', true, index)
- r3 = true
- @index += 1
- else
- r3 = nil
- end
- if r3
- r0 = r3
- else
- if has_terminal?('\G[\\x5d-\\x7e]', true, index)
- r4 = true
- @index += 1
- else
- r4 = nil
- end
- if r4
- r0 = r4
- else
- @index = i0
- r0 = nil
- end
- end
- end
- end
-
- node_cache[:ctext][start_index] = r0
-
- r0
- end
-
- def _nt_ccontent
- start_index = index
- if node_cache[:ccontent].has_key?(index)
- cached = node_cache[:ccontent][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_ctext
- if r1
- r0 = r1
- else
- r2 = _nt_quoted_pair
- if r2
- r0 = r2
- else
- r3 = _nt_comment
- if r3
- r0 = r3
- else
- @index = i0
- r0 = nil
- end
- end
- end
-
- node_cache[:ccontent][start_index] = r0
-
- r0
- end
-
- module Comment0
- def ccontent
- elements[1]
- end
- end
-
- module Comment1
- end
-
- def _nt_comment
- start_index = index
- if node_cache[:comment].has_key?(index)
- cached = node_cache[:comment][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("(", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("(")
- r1 = nil
- end
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- i3, s3 = index, []
- r5 = _nt_FWS
- if r5
- r4 = r5
- else
- r4 = instantiate_node(SyntaxNode,input, index...index)
- end
- s3 << r4
- if r4
- r6 = _nt_ccontent
- s3 << r6
- end
- if s3.last
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
- r3.extend(Comment0)
- else
- @index = i3
- r3 = nil
- end
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- if r2
- r8 = _nt_FWS
- if r8
- r7 = r8
- else
- r7 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r7
- if r7
- if has_terminal?(")", false, index)
- r9 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(")")
- r9 = nil
- end
- s0 << r9
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(Comment1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:comment][start_index] = r0
-
- r0
- end
-
- def _nt_atext
- start_index = index
- if node_cache[:atext].has_key?(index)
- cached = node_cache[:atext][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_ALPHA
- if r1
- r0 = r1
- else
- r2 = _nt_DIGIT
- if r2
- r0 = r2
- else
- if has_terminal?("!", false, index)
- r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("!")
- r3 = nil
- end
- if r3
- r0 = r3
- else
- if has_terminal?("#", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("#")
- r4 = nil
- end
- if r4
- r0 = r4
- else
- if has_terminal?("$", false, index)
- r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("$")
- r5 = nil
- end
- if r5
- r0 = r5
- else
- if has_terminal?("%", false, index)
- r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("%")
- r6 = nil
- end
- if r6
- r0 = r6
- else
- if has_terminal?("&", false, index)
- r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("&")
- r7 = nil
- end
- if r7
- r0 = r7
- else
- if has_terminal?("'", false, index)
- r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("'")
- r8 = nil
- end
- if r8
- r0 = r8
- else
- if has_terminal?("*", false, index)
- r9 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("*")
- r9 = nil
- end
- if r9
- r0 = r9
- else
- if has_terminal?("+", false, index)
- r10 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("+")
- r10 = nil
- end
- if r10
- r0 = r10
- else
- if has_terminal?("-", false, index)
- r11 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("-")
- r11 = nil
- end
- if r11
- r0 = r11
- else
- if has_terminal?("/", false, index)
- r12 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("/")
- r12 = nil
- end
- if r12
- r0 = r12
- else
- if has_terminal?("=", false, index)
- r13 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("=")
- r13 = nil
- end
- if r13
- r0 = r13
- else
- if has_terminal?("?", false, index)
- r14 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("?")
- r14 = nil
- end
- if r14
- r0 = r14
- else
- if has_terminal?("^", false, index)
- r15 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("^")
- r15 = nil
- end
- if r15
- r0 = r15
- else
- if has_terminal?("_", false, index)
- r16 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("_")
- r16 = nil
- end
- if r16
- r0 = r16
- else
- if has_terminal?("`", false, index)
- r17 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("`")
- r17 = nil
- end
- if r17
- r0 = r17
- else
- if has_terminal?("{", false, index)
- r18 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("{")
- r18 = nil
- end
- if r18
- r0 = r18
- else
- if has_terminal?("|", false, index)
- r19 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("|")
- r19 = nil
- end
- if r19
- r0 = r19
- else
- if has_terminal?("}", false, index)
- r20 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("}")
- r20 = nil
- end
- if r20
- r0 = r20
- else
- if has_terminal?("~", false, index)
- r21 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("~")
- r21 = nil
- end
- if r21
- r0 = r21
- else
- @index = i0
- r0 = nil
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
-
- node_cache[:atext][start_index] = r0
-
- r0
- end
-
- def _nt_mtext
- start_index = index
- if node_cache[:mtext].has_key?(index)
- cached = node_cache[:mtext][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- s0, i0 = [], index
- loop do
- i1 = index
- r2 = _nt_atext
- if r2
- r1 = r2
- else
- if has_terminal?(".", false, index)
- r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(".")
- r3 = nil
- end
- if r3
- r1 = r3
- else
- @index = i1
- r1 = nil
- end
- end
- if r1
- s0 << r1
- else
- break
- end
- end
- if s0.empty?
- @index = i0
- r0 = nil
- else
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- end
-
- node_cache[:mtext][start_index] = r0
-
- r0
- end
-
- module Atom0
- end
-
- def _nt_atom
- start_index = index
- if node_cache[:atom].has_key?(index)
- cached = node_cache[:atom][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r2 = _nt_CFWS
- if r2
- r1 = r2
- else
- r1 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r1
- if r1
- s3, i3 = [], index
- loop do
- r4 = _nt_atext
- if r4
- s3 << r4
- else
- break
- end
- end
- if s3.empty?
- @index = i3
- r3 = nil
- else
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
- end
- s0 << r3
- if r3
- r6 = _nt_CFWS
- if r6
- r5 = r6
- else
- r5 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r5
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(Atom0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:atom][start_index] = r0
-
- r0
- end
-
- module DotAtom0
- def dot_atom_text
- elements[1]
- end
-
- end
-
- def _nt_dot_atom
- start_index = index
- if node_cache[:dot_atom].has_key?(index)
- cached = node_cache[:dot_atom][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r2 = _nt_CFWS
- if r2
- r1 = r2
- else
- r1 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r1
- if r1
- r3 = _nt_dot_atom_text
- s0 << r3
- if r3
- r5 = _nt_CFWS
- if r5
- r4 = r5
- else
- r4 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r4
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(DotAtom0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:dot_atom][start_index] = r0
-
- r0
- end
-
- module LocalDotAtom0
- def local_dot_atom_text
- elements[1]
- end
-
- end
-
- def _nt_local_dot_atom
- start_index = index
- if node_cache[:local_dot_atom].has_key?(index)
- cached = node_cache[:local_dot_atom][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r2 = _nt_CFWS
- if r2
- r1 = r2
- else
- r1 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r1
- if r1
- r3 = _nt_local_dot_atom_text
- s0 << r3
- if r3
- r5 = _nt_CFWS
- if r5
- r4 = r5
- else
- r4 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r4
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(LocalDotAtom0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:local_dot_atom][start_index] = r0
-
- r0
- end
-
- def _nt_message_id_text
- start_index = index
- if node_cache[:message_id_text].has_key?(index)
- cached = node_cache[:message_id_text][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- s0, i0 = [], index
- loop do
- r1 = _nt_mtext
- if r1
- s0 << r1
- else
- break
- end
- end
- if s0.empty?
- @index = i0
- r0 = nil
- else
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- end
-
- node_cache[:message_id_text][start_index] = r0
-
- r0
- end
-
- module DotAtomText0
- def domain_text
- elements[0]
- end
-
- end
-
- def _nt_dot_atom_text
- start_index = index
- if node_cache[:dot_atom_text].has_key?(index)
- cached = node_cache[:dot_atom_text][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- s0, i0 = [], index
- loop do
- i1, s1 = index, []
- r2 = _nt_domain_text
- s1 << r2
- if r2
- if has_terminal?(".", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(".")
- r4 = nil
- end
- if r4
- r3 = r4
- else
- r3 = instantiate_node(SyntaxNode,input, index...index)
- end
- s1 << r3
- end
- if s1.last
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- r1.extend(DotAtomText0)
- else
- @index = i1
- r1 = nil
- end
- if r1
- s0 << r1
- else
- break
- end
- end
- if s0.empty?
- @index = i0
- r0 = nil
- else
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- end
-
- node_cache[:dot_atom_text][start_index] = r0
-
- r0
- end
-
- module LocalDotAtomText0
- def domain_text
- elements[1]
- end
-
- end
-
- def _nt_local_dot_atom_text
- start_index = index
- if node_cache[:local_dot_atom_text].has_key?(index)
- cached = node_cache[:local_dot_atom_text][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- s0, i0 = [], index
- loop do
- i1, s1 = index, []
- s2, i2 = [], index
- loop do
- if has_terminal?(".", false, index)
- r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(".")
- r3 = nil
- end
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s1 << r2
- if r2
- r4 = _nt_domain_text
- s1 << r4
- if r4
- s5, i5 = [], index
- loop do
- if has_terminal?(".", false, index)
- r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(".")
- r6 = nil
- end
- if r6
- s5 << r6
- else
- break
- end
- end
- r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
- s1 << r5
- end
- end
- if s1.last
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- r1.extend(LocalDotAtomText0)
- else
- @index = i1
- r1 = nil
- end
- if r1
- s0 << r1
- else
- break
- end
- end
- if s0.empty?
- @index = i0
- r0 = nil
- else
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- end
-
- node_cache[:local_dot_atom_text][start_index] = r0
-
- r0
- end
-
- module DomainText0
- def quoted_domain
- elements[1]
- end
- end
-
- module DomainText1
- def DQUOTE1
- elements[0]
- end
-
- def DQUOTE2
- elements[3]
- end
- end
-
- def _nt_domain_text
- start_index = index
- if node_cache[:domain_text].has_key?(index)
- cached = node_cache[:domain_text][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- i1, s1 = index, []
- r2 = _nt_DQUOTE
- s1 << r2
- if r2
- s3, i3 = [], index
- loop do
- i4, s4 = index, []
- r6 = _nt_FWS
- if r6
- r5 = r6
- else
- r5 = instantiate_node(SyntaxNode,input, index...index)
- end
- s4 << r5
- if r5
- r7 = _nt_quoted_domain
- s4 << r7
- end
- if s4.last
- r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
- r4.extend(DomainText0)
- else
- @index = i4
- r4 = nil
- end
- if r4
- s3 << r4
- else
- break
- end
- end
- if s3.empty?
- @index = i3
- r3 = nil
- else
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
- end
- s1 << r3
- if r3
- r9 = _nt_FWS
- if r9
- r8 = r9
- else
- r8 = instantiate_node(SyntaxNode,input, index...index)
- end
- s1 << r8
- if r8
- r10 = _nt_DQUOTE
- s1 << r10
- end
- end
- end
- if s1.last
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- r1.extend(DomainText1)
- else
- @index = i1
- r1 = nil
- end
- if r1
- r0 = r1
- else
- s11, i11 = [], index
- loop do
- r12 = _nt_atext
- if r12
- s11 << r12
- else
- break
- end
- end
- if s11.empty?
- @index = i11
- r11 = nil
- else
- r11 = instantiate_node(SyntaxNode,input, i11...index, s11)
- end
- if r11
- r0 = r11
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:domain_text][start_index] = r0
-
- r0
- end
-
- module QuotedDomain0
- def text
- elements[1]
- end
- end
-
- def _nt_quoted_domain
- start_index = index
- if node_cache[:quoted_domain].has_key?(index)
- cached = node_cache[:quoted_domain][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_qdcontent
- if r1
- r0 = r1
- else
- i2, s2 = index, []
- if has_terminal?("\\", false, index)
- r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("\\")
- r3 = nil
- end
- s2 << r3
- if r3
- r4 = _nt_text
- s2 << r4
- end
- if s2.last
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- r2.extend(QuotedDomain0)
- else
- @index = i2
- r2 = nil
- end
- if r2
- r0 = r2
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:quoted_domain][start_index] = r0
-
- r0
- end
-
- def _nt_qdcontent
- start_index = index
- if node_cache[:qdcontent].has_key?(index)
- cached = node_cache[:qdcontent][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_NO_WS_CTL
- if r1
- r0 = r1
- else
- if has_terminal?('\G[\\x21]', true, index)
- r2 = true
- @index += 1
- else
- r2 = nil
- end
- if r2
- r0 = r2
- else
- if has_terminal?('\G[\\x23-\\x45]', true, index)
- r3 = true
- @index += 1
- else
- r3 = nil
- end
- if r3
- r0 = r3
- else
- if has_terminal?('\G[\\x47-\\x5b]', true, index)
- r4 = true
- @index += 1
- else
- r4 = nil
- end
- if r4
- r0 = r4
- else
- if has_terminal?('\G[\\x5d-\\x7e]', true, index)
- r5 = true
- @index += 1
- else
- r5 = nil
- end
- if r5
- r0 = r5
- else
- @index = i0
- r0 = nil
- end
- end
- end
- end
- end
-
- node_cache[:qdcontent][start_index] = r0
-
- r0
- end
-
- def _nt_phrase
- start_index = index
- if node_cache[:phrase].has_key?(index)
- cached = node_cache[:phrase][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_obs_phrase
- if r1
- r0 = r1
- else
- s2, i2 = [], index
- loop do
- r3 = _nt_word
- if r3
- s2 << r3
- else
- break
- end
- end
- if s2.empty?
- @index = i2
- r2 = nil
- else
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- end
- if r2
- r0 = r2
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:phrase][start_index] = r0
-
- r0
- end
-
- def _nt_word
- start_index = index
- if node_cache[:word].has_key?(index)
- cached = node_cache[:word][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_atom
- if r1
- r0 = r1
- else
- r2 = _nt_quoted_string
- if r2
- r0 = r2
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:word][start_index] = r0
-
- r0
- end
-
- module PhraseList0
- def phrase_value
- elements[2]
- end
- end
-
- module PhraseList1
- def first_phrase
- elements[0]
- end
-
- def other_phrases
- elements[1]
- end
- end
-
- def _nt_phrase_list
- start_index = index
- if node_cache[:phrase_list].has_key?(index)
- cached = node_cache[:phrase_list][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r1 = _nt_phrase
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- i3, s3 = index, []
- if has_terminal?(",", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(",")
- r4 = nil
- end
- s3 << r4
- if r4
- s5, i5 = [], index
- loop do
- r6 = _nt_FWS
- if r6
- s5 << r6
- else
- break
- end
- end
- r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
- s3 << r5
- if r5
- r7 = _nt_phrase
- s3 << r7
- end
- end
- if s3.last
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
- r3.extend(PhraseList0)
- else
- @index = i3
- r3 = nil
- end
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(PhraseList1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:phrase_list][start_index] = r0
-
- r0
- end
-
- module DomainLiteral0
- def dcontent
- elements[1]
- end
- end
-
- module DomainLiteral1
- end
-
- def _nt_domain_literal
- start_index = index
- if node_cache[:domain_literal].has_key?(index)
- cached = node_cache[:domain_literal][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r2 = _nt_CFWS
- if r2
- r1 = r2
- else
- r1 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r1
- if r1
- if has_terminal?("[", false, index)
- r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("[")
- r3 = nil
- end
- s0 << r3
- if r3
- s4, i4 = [], index
- loop do
- i5, s5 = index, []
- r7 = _nt_FWS
- if r7
- r6 = r7
- else
- r6 = instantiate_node(SyntaxNode,input, index...index)
- end
- s5 << r6
- if r6
- r8 = _nt_dcontent
- s5 << r8
- end
- if s5.last
- r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
- r5.extend(DomainLiteral0)
- else
- @index = i5
- r5 = nil
- end
- if r5
- s4 << r5
- else
- break
- end
- end
- r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
- s0 << r4
- if r4
- r10 = _nt_FWS
- if r10
- r9 = r10
- else
- r9 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r9
- if r9
- if has_terminal?("]", false, index)
- r11 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("]")
- r11 = nil
- end
- s0 << r11
- if r11
- r13 = _nt_CFWS
- if r13
- r12 = r13
- else
- r12 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r12
- end
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(DomainLiteral1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:domain_literal][start_index] = r0
-
- r0
- end
-
- def _nt_dcontent
- start_index = index
- if node_cache[:dcontent].has_key?(index)
- cached = node_cache[:dcontent][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_dtext
- if r1
- r0 = r1
- else
- r2 = _nt_quoted_pair
- if r2
- r0 = r2
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:dcontent][start_index] = r0
-
- r0
- end
-
- def _nt_dtext
- start_index = index
- if node_cache[:dtext].has_key?(index)
- cached = node_cache[:dtext][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_NO_WS_CTL
- if r1
- r0 = r1
- else
- if has_terminal?('\G[\\x21-\\x5a]', true, index)
- r2 = true
- @index += 1
- else
- r2 = nil
- end
- if r2
- r0 = r2
- else
- if has_terminal?('\G[\\x5e-\\x7e]', true, index)
- r3 = true
- @index += 1
- else
- r3 = nil
- end
- if r3
- r0 = r3
- else
- @index = i0
- r0 = nil
- end
- end
- end
-
- node_cache[:dtext][start_index] = r0
-
- r0
- end
-
- module AngleAddr0
- def addr_spec
- elements[2]
- end
-
- end
-
- def _nt_angle_addr
- start_index = index
- if node_cache[:angle_addr].has_key?(index)
- cached = node_cache[:angle_addr][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- i1, s1 = index, []
- r3 = _nt_CFWS
- if r3
- r2 = r3
- else
- r2 = instantiate_node(SyntaxNode,input, index...index)
- end
- s1 << r2
- if r2
- if has_terminal?("<", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("<")
- r4 = nil
- end
- s1 << r4
- if r4
- r5 = _nt_addr_spec
- s1 << r5
- if r5
- if has_terminal?(">", false, index)
- r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(">")
- r6 = nil
- end
- s1 << r6
- if r6
- r8 = _nt_CFWS
- if r8
- r7 = r8
- else
- r7 = instantiate_node(SyntaxNode,input, index...index)
- end
- s1 << r7
- end
- end
- end
- end
- if s1.last
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- r1.extend(AngleAddr0)
- else
- @index = i1
- r1 = nil
- end
- if r1
- r0 = r1
- else
- r9 = _nt_obs_angle_addr
- if r9
- r0 = r9
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:angle_addr][start_index] = r0
-
- r0
- end
-
- module AddrSpec0
- def local_part
- elements[0]
- end
-
- def domain
- elements[2]
- end
- end
-
- def _nt_addr_spec
- start_index = index
- if node_cache[:addr_spec].has_key?(index)
- cached = node_cache[:addr_spec][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- i1, s1 = index, []
- r2 = _nt_local_part
- s1 << r2
- if r2
- if has_terminal?("@", false, index)
- r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("@")
- r3 = nil
- end
- s1 << r3
- if r3
- r4 = _nt_domain
- s1 << r4
- end
- end
- if s1.last
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- r1.extend(AddrSpec0)
- else
- @index = i1
- r1 = nil
- end
- if r1
- r0 = r1
- else
- r5 = _nt_local_part
- if r5
- r0 = r5
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:addr_spec][start_index] = r0
-
- r0
- end
-
- def _nt_local_part
- start_index = index
- if node_cache[:local_part].has_key?(index)
- cached = node_cache[:local_part][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_local_dot_atom
- if r1
- r0 = r1
- else
- r2 = _nt_quoted_string
- if r2
- r0 = r2
- else
- r3 = _nt_obs_local_part
- if r3
- r0 = r3
- else
- @index = i0
- r0 = nil
- end
- end
- end
-
- node_cache[:local_part][start_index] = r0
-
- r0
- end
-
- def _nt_domain
- start_index = index
- if node_cache[:domain].has_key?(index)
- cached = node_cache[:domain][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_dot_atom
- if r1
- r0 = r1
- else
- r2 = _nt_domain_literal
- if r2
- r0 = r2
- else
- r3 = _nt_obs_domain
- if r3
- r0 = r3
- else
- @index = i0
- r0 = nil
- end
- end
- end
-
- node_cache[:domain][start_index] = r0
-
- r0
- end
-
- module Group0
- def group_name
- elements[0]
- end
-
- def group_list
- elements[2]
- end
-
- end
-
- def _nt_group
- start_index = index
- if node_cache[:group].has_key?(index)
- cached = node_cache[:group][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r1 = _nt_display_name
- s0 << r1
- if r1
- if has_terminal?(":", false, index)
- r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r2 = nil
- end
- s0 << r2
- if r2
- i4 = index
- r5 = _nt_mailbox_list_group
- if r5
- r4 = r5
- else
- r6 = _nt_CFWS
- if r6
- r4 = r6
- else
- @index = i4
- r4 = nil
- end
- end
- if r4
- r3 = r4
- else
- r3 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r3
- if r3
- if has_terminal?(";", false, index)
- r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(";")
- r7 = nil
- end
- s0 << r7
- if r7
- r9 = _nt_CFWS
- if r9
- r8 = r9
- else
- r8 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r8
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(Group0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:group][start_index] = r0
-
- r0
- end
-
- module MailboxListGroup0
- def addresses
- [first_addr] + other_addr.elements.map { |o| o.addr_value }
- end
- end
-
- def _nt_mailbox_list_group
- start_index = index
- if node_cache[:mailbox_list_group].has_key?(index)
- cached = node_cache[:mailbox_list_group][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- r0 = _nt_mailbox_list
- r0.extend(MailboxListGroup0)
-
- node_cache[:mailbox_list_group][start_index] = r0
-
- r0
- end
-
- module QuotedString0
- def qcontent
- elements[1]
- end
- end
-
- module QuotedString1
- def DQUOTE1
- elements[1]
- end
-
- def quoted_content
- elements[2]
- end
-
- def DQUOTE2
- elements[4]
- end
-
- end
-
- def _nt_quoted_string
- start_index = index
- if node_cache[:quoted_string].has_key?(index)
- cached = node_cache[:quoted_string][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r2 = _nt_CFWS
- if r2
- r1 = r2
- else
- r1 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r1
- if r1
- r3 = _nt_DQUOTE
- s0 << r3
- if r3
- s4, i4 = [], index
- loop do
- i5, s5 = index, []
- r7 = _nt_FWS
- if r7
- r6 = r7
- else
- r6 = instantiate_node(SyntaxNode,input, index...index)
- end
- s5 << r6
- if r6
- r8 = _nt_qcontent
- s5 << r8
- end
- if s5.last
- r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
- r5.extend(QuotedString0)
- else
- @index = i5
- r5 = nil
- end
- if r5
- s4 << r5
- else
- break
- end
- end
- r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
- s0 << r4
- if r4
- r10 = _nt_FWS
- if r10
- r9 = r10
- else
- r9 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r9
- if r9
- r11 = _nt_DQUOTE
- s0 << r11
- if r11
- r13 = _nt_CFWS
- if r13
- r12 = r13
- else
- r12 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r12
- end
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(QuotedString1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:quoted_string][start_index] = r0
-
- r0
- end
-
- def _nt_qcontent
- start_index = index
- if node_cache[:qcontent].has_key?(index)
- cached = node_cache[:qcontent][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_qtext
- if r1
- r0 = r1
- else
- r2 = _nt_quoted_pair
- if r2
- r0 = r2
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:qcontent][start_index] = r0
-
- r0
- end
-
- module QuotedPair0
- def text
- elements[1]
- end
- end
-
- def _nt_quoted_pair
- start_index = index
- if node_cache[:quoted_pair].has_key?(index)
- cached = node_cache[:quoted_pair][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- i1, s1 = index, []
- if has_terminal?("\\", false, index)
- r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("\\")
- r2 = nil
- end
- s1 << r2
- if r2
- r3 = _nt_text
- s1 << r3
- end
- if s1.last
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- r1.extend(QuotedPair0)
- else
- @index = i1
- r1 = nil
- end
- if r1
- r0 = r1
- else
- r4 = _nt_obs_qp
- if r4
- r0 = r4
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:quoted_pair][start_index] = r0
-
- r0
- end
-
- def _nt_qtext
- start_index = index
- if node_cache[:qtext].has_key?(index)
- cached = node_cache[:qtext][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_NO_WS_CTL
- if r1
- r0 = r1
- else
- if has_terminal?('\G[\\x21]', true, index)
- r2 = true
- @index += 1
- else
- r2 = nil
- end
- if r2
- r0 = r2
- else
- if has_terminal?('\G[\\x23-\\x5b]', true, index)
- r3 = true
- @index += 1
- else
- r3 = nil
- end
- if r3
- r0 = r3
- else
- if has_terminal?('\G[\\x5d-\\x7e]', true, index)
- r4 = true
- @index += 1
- else
- r4 = nil
- end
- if r4
- r0 = r4
- else
- @index = i0
- r0 = nil
- end
- end
- end
- end
-
- node_cache[:qtext][start_index] = r0
-
- r0
- end
-
- def _nt_text
- start_index = index
- if node_cache[:text].has_key?(index)
- cached = node_cache[:text][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- if has_terminal?('\G[\\x01-\\x09]', true, index)
- r1 = true
- @index += 1
- else
- r1 = nil
- end
- if r1
- r0 = r1
- else
- if has_terminal?('\G[\\x0b-\\x0c]', true, index)
- r2 = true
- @index += 1
- else
- r2 = nil
- end
- if r2
- r0 = r2
- else
- if has_terminal?('\G[\\x0e-\\x7e]', true, index)
- r3 = true
- @index += 1
- else
- r3 = nil
- end
- if r3
- r0 = r3
- else
- r4 = _nt_obs_text
- if r4
- r0 = r4
- else
- @index = i0
- r0 = nil
- end
- end
- end
- end
-
- node_cache[:text][start_index] = r0
-
- r0
- end
-
- def _nt_display_name
- start_index = index
- if node_cache[:display_name].has_key?(index)
- cached = node_cache[:display_name][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- r0 = _nt_phrase
-
- node_cache[:display_name][start_index] = r0
-
- r0
- end
-
- module NameAddr0
- def display_name
- elements[0]
- end
-
- def angle_addr
- elements[1]
- end
- end
-
- def _nt_name_addr
- start_index = index
- if node_cache[:name_addr].has_key?(index)
- cached = node_cache[:name_addr][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- i1, s1 = index, []
- r2 = _nt_display_name
- s1 << r2
- if r2
- r3 = _nt_angle_addr
- s1 << r3
- end
- if s1.last
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- r1.extend(NameAddr0)
- else
- @index = i1
- r1 = nil
- end
- if r1
- r0 = r1
- else
- r4 = _nt_angle_addr
- if r4
- r0 = r4
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:name_addr][start_index] = r0
-
- r0
- end
-
- module MailboxList0
- def addr_value
- elements[1]
- end
- end
-
- module MailboxList1
- def first_addr
- elements[0]
- end
-
- def other_addr
- elements[1]
- end
- end
-
- def _nt_mailbox_list
- start_index = index
- if node_cache[:mailbox_list].has_key?(index)
- cached = node_cache[:mailbox_list][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- i1, s1 = index, []
- r2 = _nt_mailbox
- s1 << r2
- if r2
- s3, i3 = [], index
- loop do
- i4, s4 = index, []
- i5 = index
- if has_terminal?(",", false, index)
- r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(",")
- r6 = nil
- end
- if r6
- r5 = r6
- else
- if has_terminal?(";", false, index)
- r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(";")
- r7 = nil
- end
- if r7
- r5 = r7
- else
- @index = i5
- r5 = nil
- end
- end
- s4 << r5
- if r5
- r8 = _nt_mailbox
- s4 << r8
- end
- if s4.last
- r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
- r4.extend(MailboxList0)
- else
- @index = i4
- r4 = nil
- end
- if r4
- s3 << r4
- else
- break
- end
- end
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
- s1 << r3
- end
- if s1.last
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- r1.extend(MailboxList1)
- else
- @index = i1
- r1 = nil
- end
- if r1
- r0 = r1
- else
- r9 = _nt_obs_mbox_list
- if r9
- r0 = r9
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:mailbox_list][start_index] = r0
-
- r0
- end
-
- module Mailbox0
- def dig_comments(comments, elements)
- elements.each { |elem|
- if elem.respond_to?(:comment)
- comments << elem.comment
- end
- dig_comments(comments, elem.elements) if elem.elements
- }
- end
-
- def comments
- comments = []
- dig_comments(comments, elements)
- comments
- end
- end
-
- def _nt_mailbox
- start_index = index
- if node_cache[:mailbox].has_key?(index)
- cached = node_cache[:mailbox][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_name_addr
- if r1
- r0 = r1
- r0.extend(Mailbox0)
- else
- r2 = _nt_addr_spec
- if r2
- r0 = r2
- r0.extend(Mailbox0)
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:mailbox][start_index] = r0
-
- r0
- end
-
- module Address0
-
- def dig_comments(comments, elements)
- elements.each { |elem|
- if elem.respond_to?(:comment)
- comments << elem.comment
- end
- dig_comments(comments, elem.elements) if elem.elements
- }
- end
-
- def comments
- comments = []
- dig_comments(comments, elements)
- comments
- end
- end
-
- def _nt_address
- start_index = index
- if node_cache[:address].has_key?(index)
- cached = node_cache[:address][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_group
- r1.extend(Address0)
- if r1
- r0 = r1
- else
- r2 = _nt_mailbox
- if r2
- r0 = r2
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:address][start_index] = r0
-
- r0
- end
-
- module AddressList0
- def addr_value
- elements[3]
- end
- end
-
- module AddressList1
- def first_addr
- elements[0]
- end
-
- def other_addr
- elements[1]
- end
- end
-
- def _nt_address_list
- start_index = index
- if node_cache[:address_list].has_key?(index)
- cached = node_cache[:address_list][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r2 = _nt_address
- if r2
- r1 = r2
- else
- r1 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r1
- if r1
- s3, i3 = [], index
- loop do
- i4, s4 = index, []
- s5, i5 = [], index
- loop do
- r6 = _nt_FWS
- if r6
- s5 << r6
- else
- break
- end
- end
- r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
- s4 << r5
- if r5
- i7 = index
- if has_terminal?(",", false, index)
- r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(",")
- r8 = nil
- end
- if r8
- r7 = r8
- else
- if has_terminal?(";", false, index)
- r9 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(";")
- r9 = nil
- end
- if r9
- r7 = r9
- else
- @index = i7
- r7 = nil
- end
- end
- s4 << r7
- if r7
- s10, i10 = [], index
- loop do
- r11 = _nt_FWS
- if r11
- s10 << r11
- else
- break
- end
- end
- r10 = instantiate_node(SyntaxNode,input, i10...index, s10)
- s4 << r10
- if r10
- r13 = _nt_address
- if r13
- r12 = r13
- else
- r12 = instantiate_node(SyntaxNode,input, index...index)
- end
- s4 << r12
- end
- end
- end
- if s4.last
- r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
- r4.extend(AddressList0)
- else
- @index = i4
- r4 = nil
- end
- if r4
- s3 << r4
- else
- break
- end
- end
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
- s0 << r3
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(AddressList1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:address_list][start_index] = r0
-
- r0
- end
-
- module DateTime0
- def day_of_week
- elements[0]
- end
-
- end
-
- module DateTime1
- def date
- elements[1]
- end
-
- def FWS
- elements[2]
- end
-
- def time
- elements[3]
- end
-
- end
-
- def _nt_date_time
- start_index = index
- if node_cache[:date_time].has_key?(index)
- cached = node_cache[:date_time][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- i2, s2 = index, []
- r3 = _nt_day_of_week
- s2 << r3
- if r3
- if has_terminal?(",", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(",")
- r4 = nil
- end
- s2 << r4
- end
- if s2.last
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- r2.extend(DateTime0)
- else
- @index = i2
- r2 = nil
- end
- if r2
- r1 = r2
- else
- r1 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r1
- if r1
- r5 = _nt_date
- s0 << r5
- if r5
- r6 = _nt_FWS
- s0 << r6
- if r6
- r7 = _nt_time
- s0 << r7
- if r7
- r9 = _nt_CFWS
- if r9
- r8 = r9
- else
- r8 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r8
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(DateTime1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:date_time][start_index] = r0
-
- r0
- end
-
- module DayOfWeek0
- def day_name
- elements[1]
- end
- end
-
- def _nt_day_of_week
- start_index = index
- if node_cache[:day_of_week].has_key?(index)
- cached = node_cache[:day_of_week][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- i1, s1 = index, []
- r3 = _nt_FWS
- if r3
- r2 = r3
- else
- r2 = instantiate_node(SyntaxNode,input, index...index)
- end
- s1 << r2
- if r2
- r4 = _nt_day_name
- s1 << r4
- end
- if s1.last
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- r1.extend(DayOfWeek0)
- else
- @index = i1
- r1 = nil
- end
- if r1
- r0 = r1
- else
- r5 = _nt_obs_day_of_week
- if r5
- r0 = r5
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:day_of_week][start_index] = r0
-
- r0
- end
-
- def _nt_day_name
- start_index = index
- if node_cache[:day_name].has_key?(index)
- cached = node_cache[:day_name][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- if has_terminal?("Mon", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("Mon")
- r1 = nil
- end
- if r1
- r0 = r1
- else
- if has_terminal?("Tue", false, index)
- r2 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("Tue")
- r2 = nil
- end
- if r2
- r0 = r2
- else
- if has_terminal?("Wed", false, index)
- r3 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("Wed")
- r3 = nil
- end
- if r3
- r0 = r3
- else
- if has_terminal?("Thu", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("Thu")
- r4 = nil
- end
- if r4
- r0 = r4
- else
- if has_terminal?("Fri", false, index)
- r5 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("Fri")
- r5 = nil
- end
- if r5
- r0 = r5
- else
- if has_terminal?("Sat", false, index)
- r6 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("Sat")
- r6 = nil
- end
- if r6
- r0 = r6
- else
- if has_terminal?("Sun", false, index)
- r7 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("Sun")
- r7 = nil
- end
- if r7
- r0 = r7
- else
- @index = i0
- r0 = nil
- end
- end
- end
- end
- end
- end
- end
-
- node_cache[:day_name][start_index] = r0
-
- r0
- end
-
- module Date0
- def day
- elements[0]
- end
-
- def month
- elements[1]
- end
-
- def year
- elements[2]
- end
- end
-
- def _nt_date
- start_index = index
- if node_cache[:date].has_key?(index)
- cached = node_cache[:date][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r1 = _nt_day
- s0 << r1
- if r1
- r2 = _nt_month
- s0 << r2
- if r2
- r3 = _nt_year
- s0 << r3
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(Date0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:date][start_index] = r0
-
- r0
- end
-
- module Year0
- def DIGIT1
- elements[0]
- end
-
- def DIGIT2
- elements[1]
- end
-
- def DIGIT3
- elements[2]
- end
-
- def DIGIT4
- elements[3]
- end
- end
-
- def _nt_year
- start_index = index
- if node_cache[:year].has_key?(index)
- cached = node_cache[:year][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- i1, s1 = index, []
- r2 = _nt_DIGIT
- s1 << r2
- if r2
- r3 = _nt_DIGIT
- s1 << r3
- if r3
- r4 = _nt_DIGIT
- s1 << r4
- if r4
- r5 = _nt_DIGIT
- s1 << r5
- end
- end
- end
- if s1.last
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- r1.extend(Year0)
- else
- @index = i1
- r1 = nil
- end
- if r1
- r0 = r1
- else
- r6 = _nt_obs_year
- if r6
- r0 = r6
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:year][start_index] = r0
-
- r0
- end
-
- module Month0
- def FWS1
- elements[0]
- end
-
- def month_name
- elements[1]
- end
-
- def FWS2
- elements[2]
- end
- end
-
- def _nt_month
- start_index = index
- if node_cache[:month].has_key?(index)
- cached = node_cache[:month][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- i1, s1 = index, []
- r2 = _nt_FWS
- s1 << r2
- if r2
- r3 = _nt_month_name
- s1 << r3
- if r3
- r4 = _nt_FWS
- s1 << r4
- end
- end
- if s1.last
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- r1.extend(Month0)
- else
- @index = i1
- r1 = nil
- end
- if r1
- r0 = r1
- else
- r5 = _nt_obs_month
- if r5
- r0 = r5
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:month][start_index] = r0
-
- r0
- end
-
- def _nt_month_name
- start_index = index
- if node_cache[:month_name].has_key?(index)
- cached = node_cache[:month_name][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- if has_terminal?("Jan", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("Jan")
- r1 = nil
- end
- if r1
- r0 = r1
- else
- if has_terminal?("Feb", false, index)
- r2 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("Feb")
- r2 = nil
- end
- if r2
- r0 = r2
- else
- if has_terminal?("Mar", false, index)
- r3 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("Mar")
- r3 = nil
- end
- if r3
- r0 = r3
- else
- if has_terminal?("Apr", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("Apr")
- r4 = nil
- end
- if r4
- r0 = r4
- else
- if has_terminal?("May", false, index)
- r5 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("May")
- r5 = nil
- end
- if r5
- r0 = r5
- else
- if has_terminal?("Jun", false, index)
- r6 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("Jun")
- r6 = nil
- end
- if r6
- r0 = r6
- else
- if has_terminal?("Jul", false, index)
- r7 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("Jul")
- r7 = nil
- end
- if r7
- r0 = r7
- else
- if has_terminal?("Aug", false, index)
- r8 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("Aug")
- r8 = nil
- end
- if r8
- r0 = r8
- else
- if has_terminal?("Sep", false, index)
- r9 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("Sep")
- r9 = nil
- end
- if r9
- r0 = r9
- else
- if has_terminal?("Oct", false, index)
- r10 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("Oct")
- r10 = nil
- end
- if r10
- r0 = r10
- else
- if has_terminal?("Nov", false, index)
- r11 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("Nov")
- r11 = nil
- end
- if r11
- r0 = r11
- else
- if has_terminal?("Dec", false, index)
- r12 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("Dec")
- r12 = nil
- end
- if r12
- r0 = r12
- else
- @index = i0
- r0 = nil
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
-
- node_cache[:month_name][start_index] = r0
-
- r0
- end
-
- module Day0
- def DIGIT
- elements[1]
- end
-
- end
-
- def _nt_day
- start_index = index
- if node_cache[:day].has_key?(index)
- cached = node_cache[:day][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- i1, s1 = index, []
- r3 = _nt_FWS
- if r3
- r2 = r3
- else
- r2 = instantiate_node(SyntaxNode,input, index...index)
- end
- s1 << r2
- if r2
- r4 = _nt_DIGIT
- s1 << r4
- if r4
- r6 = _nt_DIGIT
- if r6
- r5 = r6
- else
- r5 = instantiate_node(SyntaxNode,input, index...index)
- end
- s1 << r5
- end
- end
- if s1.last
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- r1.extend(Day0)
- else
- @index = i1
- r1 = nil
- end
- if r1
- r0 = r1
- else
- r7 = _nt_obs_day
- if r7
- r0 = r7
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:day][start_index] = r0
-
- r0
- end
-
- module Time0
- def time_of_day
- elements[0]
- end
-
- def FWS
- elements[1]
- end
-
- def zone
- elements[2]
- end
- end
-
- def _nt_time
- start_index = index
- if node_cache[:time].has_key?(index)
- cached = node_cache[:time][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r1 = _nt_time_of_day
- s0 << r1
- if r1
- r2 = _nt_FWS
- s0 << r2
- if r2
- r3 = _nt_zone
- s0 << r3
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(Time0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:time][start_index] = r0
-
- r0
- end
-
- module TimeOfDay0
- def second
- elements[1]
- end
- end
-
- module TimeOfDay1
- def hour
- elements[0]
- end
-
- def minute
- elements[2]
- end
-
- end
-
- def _nt_time_of_day
- start_index = index
- if node_cache[:time_of_day].has_key?(index)
- cached = node_cache[:time_of_day][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r1 = _nt_hour
- s0 << r1
- if r1
- if has_terminal?(":", false, index)
- r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r2 = nil
- end
- s0 << r2
- if r2
- r3 = _nt_minute
- s0 << r3
- if r3
- i5, s5 = index, []
- if has_terminal?(":", false, index)
- r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r6 = nil
- end
- s5 << r6
- if r6
- r7 = _nt_second
- s5 << r7
- end
- if s5.last
- r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
- r5.extend(TimeOfDay0)
- else
- @index = i5
- r5 = nil
- end
- if r5
- r4 = r5
- else
- r4 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r4
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(TimeOfDay1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:time_of_day][start_index] = r0
-
- r0
- end
-
- module Hour0
- def DIGIT1
- elements[0]
- end
-
- def DIGIT2
- elements[1]
- end
- end
-
- def _nt_hour
- start_index = index
- if node_cache[:hour].has_key?(index)
- cached = node_cache[:hour][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- i1, s1 = index, []
- r2 = _nt_DIGIT
- s1 << r2
- if r2
- r3 = _nt_DIGIT
- s1 << r3
- end
- if s1.last
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- r1.extend(Hour0)
- else
- @index = i1
- r1 = nil
- end
- if r1
- r0 = r1
- else
- r4 = _nt_obs_hour
- if r4
- r0 = r4
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:hour][start_index] = r0
-
- r0
- end
-
- module Minute0
- def DIGIT1
- elements[0]
- end
-
- def DIGIT2
- elements[1]
- end
- end
-
- def _nt_minute
- start_index = index
- if node_cache[:minute].has_key?(index)
- cached = node_cache[:minute][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- i1, s1 = index, []
- r2 = _nt_DIGIT
- s1 << r2
- if r2
- r3 = _nt_DIGIT
- s1 << r3
- end
- if s1.last
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- r1.extend(Minute0)
- else
- @index = i1
- r1 = nil
- end
- if r1
- r0 = r1
- else
- r4 = _nt_obs_minute
- if r4
- r0 = r4
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:minute][start_index] = r0
-
- r0
- end
-
- module Second0
- def DIGIT1
- elements[0]
- end
-
- def DIGIT2
- elements[1]
- end
- end
-
- def _nt_second
- start_index = index
- if node_cache[:second].has_key?(index)
- cached = node_cache[:second][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- i1, s1 = index, []
- r2 = _nt_DIGIT
- s1 << r2
- if r2
- r3 = _nt_DIGIT
- s1 << r3
- end
- if s1.last
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- r1.extend(Second0)
- else
- @index = i1
- r1 = nil
- end
- if r1
- r0 = r1
- else
- r4 = _nt_obs_second
- if r4
- r0 = r4
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:second][start_index] = r0
-
- r0
- end
-
- module Zone0
- def DIGIT1
- elements[1]
- end
-
- def DIGIT2
- elements[2]
- end
-
- def DIGIT3
- elements[3]
- end
-
- def DIGIT4
- elements[4]
- end
- end
-
- def _nt_zone
- start_index = index
- if node_cache[:zone].has_key?(index)
- cached = node_cache[:zone][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- i1, s1 = index, []
- i2 = index
- if has_terminal?("+", false, index)
- r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("+")
- r3 = nil
- end
- if r3
- r2 = r3
- else
- if has_terminal?("-", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("-")
- r4 = nil
- end
- if r4
- r2 = r4
- else
- @index = i2
- r2 = nil
- end
- end
- s1 << r2
- if r2
- r5 = _nt_DIGIT
- s1 << r5
- if r5
- r6 = _nt_DIGIT
- s1 << r6
- if r6
- r7 = _nt_DIGIT
- s1 << r7
- if r7
- r8 = _nt_DIGIT
- s1 << r8
- end
- end
- end
- end
- if s1.last
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- r1.extend(Zone0)
- else
- @index = i1
- r1 = nil
- end
- if r1
- r0 = r1
- else
- r9 = _nt_obs_zone
- if r9
- r0 = r9
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:zone][start_index] = r0
-
- r0
- end
-
- module Return0
- def path
- elements[0]
- end
-
- def CRLF
- elements[1]
- end
- end
-
- def _nt_return
- start_index = index
- if node_cache[:return].has_key?(index)
- cached = node_cache[:return][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r1 = _nt_path
- s0 << r1
- if r1
- r2 = _nt_CRLF
- s0 << r2
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(Return0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:return][start_index] = r0
-
- r0
- end
-
- module Path0
- end
-
- def _nt_path
- start_index = index
- if node_cache[:path].has_key?(index)
- cached = node_cache[:path][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- i1, s1 = index, []
- r3 = _nt_CFWS
- if r3
- r2 = r3
- else
- r2 = instantiate_node(SyntaxNode,input, index...index)
- end
- s1 << r2
- if r2
- if has_terminal?("<", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("<")
- r4 = nil
- end
- s1 << r4
- if r4
- i5 = index
- r7 = _nt_CFWS
- if r7
- r6 = r7
- else
- r6 = instantiate_node(SyntaxNode,input, index...index)
- end
- if r6
- r5 = r6
- else
- r8 = _nt_addr_spec
- if r8
- r5 = r8
- else
- @index = i5
- r5 = nil
- end
- end
- s1 << r5
- if r5
- if has_terminal?(">", false, index)
- r9 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(">")
- r9 = nil
- end
- s1 << r9
- if r9
- r11 = _nt_CFWS
- if r11
- r10 = r11
- else
- r10 = instantiate_node(SyntaxNode,input, index...index)
- end
- s1 << r10
- end
- end
- end
- end
- if s1.last
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- r1.extend(Path0)
- else
- @index = i1
- r1 = nil
- end
- if r1
- r0 = r1
- else
- r12 = _nt_obs_path
- if r12
- r0 = r12
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:path][start_index] = r0
-
- r0
- end
-
- module Received0
- def name_val_list
- elements[0]
- end
-
- def date_time
- elements[2]
- end
-
- def CRLF
- elements[3]
- end
- end
-
- def _nt_received
- start_index = index
- if node_cache[:received].has_key?(index)
- cached = node_cache[:received][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r1 = _nt_name_val_list
- s0 << r1
- if r1
- if has_terminal?(";", false, index)
- r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(";")
- r2 = nil
- end
- s0 << r2
- if r2
- r3 = _nt_date_time
- s0 << r3
- if r3
- r4 = _nt_CRLF
- s0 << r4
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(Received0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:received][start_index] = r0
-
- r0
- end
-
- module NameValList0
- def CFWS
- elements[0]
- end
-
- def name_val_pair
- elements[1]
- end
- end
-
- module NameValList1
- def name_val_pair
- elements[0]
- end
-
- end
-
- module NameValList2
- end
-
- def _nt_name_val_list
- start_index = index
- if node_cache[:name_val_list].has_key?(index)
- cached = node_cache[:name_val_list][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r2 = _nt_CFWS
- if r2
- r1 = r2
- else
- r1 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r1
- if r1
- i4, s4 = index, []
- r5 = _nt_name_val_pair
- s4 << r5
- if r5
- s6, i6 = [], index
- loop do
- i7, s7 = index, []
- r8 = _nt_CFWS
- s7 << r8
- if r8
- r9 = _nt_name_val_pair
- s7 << r9
- end
- if s7.last
- r7 = instantiate_node(SyntaxNode,input, i7...index, s7)
- r7.extend(NameValList0)
- else
- @index = i7
- r7 = nil
- end
- if r7
- s6 << r7
- else
- break
- end
- end
- r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
- s4 << r6
- end
- if s4.last
- r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
- r4.extend(NameValList1)
- else
- @index = i4
- r4 = nil
- end
- if r4
- r3 = r4
- else
- r3 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r3
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(NameValList2)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:name_val_list][start_index] = r0
-
- r0
- end
-
- module NameValPair0
- def item_name
- elements[0]
- end
-
- def CFWS
- elements[1]
- end
-
- def item_value
- elements[2]
- end
- end
-
- def _nt_name_val_pair
- start_index = index
- if node_cache[:name_val_pair].has_key?(index)
- cached = node_cache[:name_val_pair][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r1 = _nt_item_name
- s0 << r1
- if r1
- r2 = _nt_CFWS
- s0 << r2
- if r2
- r3 = _nt_item_value
- s0 << r3
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(NameValPair0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:name_val_pair][start_index] = r0
-
- r0
- end
-
- module ItemName0
- end
-
- module ItemName1
- def ALPHA
- elements[0]
- end
-
- end
-
- def _nt_item_name
- start_index = index
- if node_cache[:item_name].has_key?(index)
- cached = node_cache[:item_name][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r1 = _nt_ALPHA
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- i3, s3 = index, []
- if has_terminal?("-", false, index)
- r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("-")
- r5 = nil
- end
- if r5
- r4 = r5
- else
- r4 = instantiate_node(SyntaxNode,input, index...index)
- end
- s3 << r4
- if r4
- i6 = index
- r7 = _nt_ALPHA
- if r7
- r6 = r7
- else
- r8 = _nt_DIGIT
- if r8
- r6 = r8
- else
- @index = i6
- r6 = nil
- end
- end
- s3 << r6
- end
- if s3.last
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
- r3.extend(ItemName0)
- else
- @index = i3
- r3 = nil
- end
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ItemName1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:item_name][start_index] = r0
-
- r0
- end
-
- def _nt_item_value
- start_index = index
- if node_cache[:item_value].has_key?(index)
- cached = node_cache[:item_value][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- s1, i1 = [], index
- loop do
- r2 = _nt_angle_addr
- if r2
- s1 << r2
- else
- break
- end
- end
- if s1.empty?
- @index = i1
- r1 = nil
- else
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- end
- if r1
- r0 = r1
- else
- r3 = _nt_addr_spec
- if r3
- r0 = r3
- else
- r4 = _nt_atom
- if r4
- r0 = r4
- else
- r5 = _nt_domain
- if r5
- r0 = r5
- else
- r6 = _nt_msg_id
- if r6
- r0 = r6
- else
- @index = i0
- r0 = nil
- end
- end
- end
- end
- end
-
- node_cache[:item_value][start_index] = r0
-
- r0
- end
-
- module MessageIds0
- def CFWS
- elements[0]
- end
-
- def msg_id_value
- elements[1]
- end
- end
-
- module MessageIds1
- def first_msg_id
- elements[0]
- end
-
- def other_msg_ids
- elements[1]
- end
- end
-
- def _nt_message_ids
- start_index = index
- if node_cache[:message_ids].has_key?(index)
- cached = node_cache[:message_ids][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r1 = _nt_msg_id
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- i3, s3 = index, []
- r4 = _nt_CFWS
- s3 << r4
- if r4
- r5 = _nt_msg_id
- s3 << r5
- end
- if s3.last
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
- r3.extend(MessageIds0)
- else
- @index = i3
- r3 = nil
- end
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(MessageIds1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:message_ids][start_index] = r0
-
- r0
- end
-
- module MsgId0
- def msg_id_value
- elements[2]
- end
-
- end
-
- def _nt_msg_id
- start_index = index
- if node_cache[:msg_id].has_key?(index)
- cached = node_cache[:msg_id][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r2 = _nt_CFWS
- if r2
- r1 = r2
- else
- r1 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r1
- if r1
- if has_terminal?("<", false, index)
- r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("<")
- r3 = nil
- end
- s0 << r3
- if r3
- r4 = _nt_msg_id_value
- s0 << r4
- if r4
- if has_terminal?(">", false, index)
- r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(">")
- r5 = nil
- end
- s0 << r5
- if r5
- r7 = _nt_CFWS
- if r7
- r6 = r7
- else
- r6 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r6
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(MsgId0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:msg_id][start_index] = r0
-
- r0
- end
-
- module MsgIdValue0
- def id_left
- elements[0]
- end
-
- def id_right
- elements[2]
- end
- end
-
- def _nt_msg_id_value
- start_index = index
- if node_cache[:msg_id_value].has_key?(index)
- cached = node_cache[:msg_id_value][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r1 = _nt_id_left
- s0 << r1
- if r1
- if has_terminal?("@", false, index)
- r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("@")
- r2 = nil
- end
- s0 << r2
- if r2
- r3 = _nt_id_right
- s0 << r3
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(MsgIdValue0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:msg_id_value][start_index] = r0
-
- r0
- end
-
- def _nt_id_left
- start_index = index
- if node_cache[:id_left].has_key?(index)
- cached = node_cache[:id_left][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_message_id_text
- if r1
- r0 = r1
- else
- r2 = _nt_no_fold_quote
- if r2
- r0 = r2
- else
- r3 = _nt_obs_id_left
- if r3
- r0 = r3
- else
- @index = i0
- r0 = nil
- end
- end
- end
-
- node_cache[:id_left][start_index] = r0
-
- r0
- end
-
- def _nt_id_right
- start_index = index
- if node_cache[:id_right].has_key?(index)
- cached = node_cache[:id_right][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_msg_id_dot_atom_text
- if r1
- r0 = r1
- else
- r2 = _nt_no_fold_literal
- if r2
- r0 = r2
- else
- r3 = _nt_obs_id_right
- if r3
- r0 = r3
- else
- @index = i0
- r0 = nil
- end
- end
- end
-
- node_cache[:id_right][start_index] = r0
-
- r0
- end
-
- module MsgIdDotAtomText0
- def msg_id_domain_text
- elements[0]
- end
-
- end
-
- def _nt_msg_id_dot_atom_text
- start_index = index
- if node_cache[:msg_id_dot_atom_text].has_key?(index)
- cached = node_cache[:msg_id_dot_atom_text][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- s0, i0 = [], index
- loop do
- i1, s1 = index, []
- r2 = _nt_msg_id_domain_text
- s1 << r2
- if r2
- if has_terminal?(".", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(".")
- r4 = nil
- end
- if r4
- r3 = r4
- else
- r3 = instantiate_node(SyntaxNode,input, index...index)
- end
- s1 << r3
- end
- if s1.last
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- r1.extend(MsgIdDotAtomText0)
- else
- @index = i1
- r1 = nil
- end
- if r1
- s0 << r1
- else
- break
- end
- end
- if s0.empty?
- @index = i0
- r0 = nil
- else
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- end
-
- node_cache[:msg_id_dot_atom_text][start_index] = r0
-
- r0
- end
-
- module MsgIdDomainText0
- def quoted_domain
- elements[1]
- end
- end
-
- module MsgIdDomainText1
- def DQUOTE1
- elements[0]
- end
-
- def DQUOTE2
- elements[3]
- end
- end
-
- def _nt_msg_id_domain_text
- start_index = index
- if node_cache[:msg_id_domain_text].has_key?(index)
- cached = node_cache[:msg_id_domain_text][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- i1, s1 = index, []
- r2 = _nt_DQUOTE
- s1 << r2
- if r2
- s3, i3 = [], index
- loop do
- i4, s4 = index, []
- r6 = _nt_FWS
- if r6
- r5 = r6
- else
- r5 = instantiate_node(SyntaxNode,input, index...index)
- end
- s4 << r5
- if r5
- r7 = _nt_quoted_domain
- s4 << r7
- end
- if s4.last
- r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
- r4.extend(MsgIdDomainText0)
- else
- @index = i4
- r4 = nil
- end
- if r4
- s3 << r4
- else
- break
- end
- end
- if s3.empty?
- @index = i3
- r3 = nil
- else
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
- end
- s1 << r3
- if r3
- r9 = _nt_FWS
- if r9
- r8 = r9
- else
- r8 = instantiate_node(SyntaxNode,input, index...index)
- end
- s1 << r8
- if r8
- r10 = _nt_DQUOTE
- s1 << r10
- end
- end
- end
- if s1.last
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- r1.extend(MsgIdDomainText1)
- else
- @index = i1
- r1 = nil
- end
- if r1
- r0 = r1
- else
- s11, i11 = [], index
- loop do
- r12 = _nt_msg_id_atext
- if r12
- s11 << r12
- else
- break
- end
- end
- if s11.empty?
- @index = i11
- r11 = nil
- else
- r11 = instantiate_node(SyntaxNode,input, i11...index, s11)
- end
- if r11
- r0 = r11
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:msg_id_domain_text][start_index] = r0
-
- r0
- end
-
- def _nt_msg_id_atext
- start_index = index
- if node_cache[:msg_id_atext].has_key?(index)
- cached = node_cache[:msg_id_atext][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_ALPHA
- if r1
- r0 = r1
- else
- r2 = _nt_DIGIT
- if r2
- r0 = r2
- else
- if has_terminal?("!", false, index)
- r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("!")
- r3 = nil
- end
- if r3
- r0 = r3
- else
- if has_terminal?("#", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("#")
- r4 = nil
- end
- if r4
- r0 = r4
- else
- if has_terminal?("$", false, index)
- r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("$")
- r5 = nil
- end
- if r5
- r0 = r5
- else
- if has_terminal?("%", false, index)
- r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("%")
- r6 = nil
- end
- if r6
- r0 = r6
- else
- if has_terminal?("&", false, index)
- r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("&")
- r7 = nil
- end
- if r7
- r0 = r7
- else
- if has_terminal?("'", false, index)
- r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("'")
- r8 = nil
- end
- if r8
- r0 = r8
- else
- if has_terminal?("*", false, index)
- r9 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("*")
- r9 = nil
- end
- if r9
- r0 = r9
- else
- if has_terminal?("+", false, index)
- r10 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("+")
- r10 = nil
- end
- if r10
- r0 = r10
- else
- if has_terminal?("-", false, index)
- r11 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("-")
- r11 = nil
- end
- if r11
- r0 = r11
- else
- if has_terminal?("/", false, index)
- r12 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("/")
- r12 = nil
- end
- if r12
- r0 = r12
- else
- if has_terminal?("=", false, index)
- r13 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("=")
- r13 = nil
- end
- if r13
- r0 = r13
- else
- if has_terminal?("?", false, index)
- r14 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("?")
- r14 = nil
- end
- if r14
- r0 = r14
- else
- if has_terminal?("^", false, index)
- r15 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("^")
- r15 = nil
- end
- if r15
- r0 = r15
- else
- if has_terminal?("_", false, index)
- r16 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("_")
- r16 = nil
- end
- if r16
- r0 = r16
- else
- if has_terminal?("`", false, index)
- r17 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("`")
- r17 = nil
- end
- if r17
- r0 = r17
- else
- if has_terminal?("{", false, index)
- r18 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("{")
- r18 = nil
- end
- if r18
- r0 = r18
- else
- if has_terminal?("|", false, index)
- r19 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("|")
- r19 = nil
- end
- if r19
- r0 = r19
- else
- if has_terminal?("}", false, index)
- r20 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("}")
- r20 = nil
- end
- if r20
- r0 = r20
- else
- if has_terminal?("~", false, index)
- r21 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("~")
- r21 = nil
- end
- if r21
- r0 = r21
- else
- if has_terminal?("@", false, index)
- r22 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("@")
- r22 = nil
- end
- if r22
- r0 = r22
- else
- @index = i0
- r0 = nil
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
-
- node_cache[:msg_id_atext][start_index] = r0
-
- r0
- end
-
- module NoFoldQuote0
- def DQUOTE1
- elements[0]
- end
-
- def DQUOTE2
- elements[2]
- end
- end
-
- def _nt_no_fold_quote
- start_index = index
- if node_cache[:no_fold_quote].has_key?(index)
- cached = node_cache[:no_fold_quote][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r1 = _nt_DQUOTE
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- i3 = index
- r4 = _nt_qtext
- if r4
- r3 = r4
- else
- r5 = _nt_quoted_pair
- if r5
- r3 = r5
- else
- @index = i3
- r3 = nil
- end
- end
- if r3
- s2 << r3
- else
- break
- end
- end
- if s2.empty?
- @index = i2
- r2 = nil
- else
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- end
- s0 << r2
- if r2
- r6 = _nt_DQUOTE
- s0 << r6
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(NoFoldQuote0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:no_fold_quote][start_index] = r0
-
- r0
- end
-
- module NoFoldLiteral0
- end
-
- def _nt_no_fold_literal
- start_index = index
- if node_cache[:no_fold_literal].has_key?(index)
- cached = node_cache[:no_fold_literal][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("[", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("[")
- r1 = nil
- end
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- i3 = index
- r4 = _nt_dtext
- if r4
- r3 = r4
- else
- r5 = _nt_quoted_pair
- if r5
- r3 = r5
- else
- @index = i3
- r3 = nil
- end
- end
- if r3
- s2 << r3
- else
- break
- end
- end
- if s2.empty?
- @index = i2
- r2 = nil
- else
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- end
- s0 << r2
- if r2
- if has_terminal?("]", false, index)
- r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("]")
- r6 = nil
- end
- s0 << r6
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(NoFoldLiteral0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:no_fold_literal][start_index] = r0
-
- r0
- end
-
- end
-
- class RFC2822Parser < Treetop::Runtime::CompiledParser
- include RFC2822
- end
-
-end
diff --git a/lib/mail/parsers/rfc2822.treetop b/lib/mail/parsers/rfc2822.treetop
deleted file mode 100644
index 77dc3d6..0000000
--- a/lib/mail/parsers/rfc2822.treetop
+++ /dev/null
@@ -1,408 +0,0 @@
-module Mail
- grammar RFC2822
-
- include RFC2822Obsolete
-
- rule ALPHA
- [a-zA-Z]
- end
-
- rule DIGIT
- [0-9]
- end
-
- rule DQUOTE
- '"'
- end
-
- rule LF
- "\n"
- end
-
- rule CR
- "\r"
- end
-
- rule CRLF
- "\r\n"
- end
-
- rule WSP
- [\x09\x20]
- end
-
- rule FWS # Folding white space
- (WSP* CRLF WSP+) / (CRLF WSP+) / obs_FWS
- end
-
- rule CFWS
- (FWS* comment)* FWS?
- end
-
- rule NO_WS_CTL
- [\x01-\x08] / # US-ASCII control characters
- [\x0B-\x0C] / # that do not include the
- [\x0E-\x1F] / # carriage return, line feed,
- [\x7f] # and white space characters
- end
-
- rule specials
- "(" / ")" / # Special characters used in
- "<" / ">" / # other parts of the syntax
- "[" / "]" /
- ":" / ";" /
- "@" / '\\' /
- "," / "." /
- DQUOTE
- end
-
- rule ctext
- NO_WS_CTL / # Non white space controls
- [\x21-\x27] / # The rest of the US-ASCII
- [\x2a-\x5b] / # characters not including "(",
- [\x5d-\x7e] # ")", or "\"
- end
-
- rule ccontent
- ctext / quoted_pair / comment
- end
-
- rule comment
- "(" ( FWS? ccontent )* FWS? ")"
- end
-
- rule atext
- ALPHA / DIGIT / # Any character except controls,
- "!" / "#" / # SP, and specials.
- "$" / "%" / # Used for atoms
- "&" / "'" /
- "*" / "+" /
- "-" / "/" /
- "=" / "?" /
- "^" / "_" /
- "`" / "{" /
- "|" / "}" /
- "~"
- end
-
- rule mtext
- (atext / ".")+
- end
-
- rule atom
- CFWS? atext+ CFWS?
- end
-
- rule dot_atom
- CFWS? dot_atom_text CFWS?
- end
-
- rule local_dot_atom
- CFWS? local_dot_atom_text CFWS?
- end
-
- rule message_id_text
- mtext+
- end
-
- rule dot_atom_text
- (domain_text "."?)+
- end
-
- rule local_dot_atom_text
- ("."* domain_text "."*)+
- end
-
- rule domain_text
- (DQUOTE (FWS? quoted_domain)+ FWS? DQUOTE) / atext+
- end
-
- rule quoted_domain
- qdcontent / "\\" text
- end
-
- rule qdcontent
- NO_WS_CTL / # Non white space controls
- [\x21] / # The rest of the US-ASCII
- [\x23-\x45] / # characters not including "\"
- [\x47-\x5b] / # or the "." or the
- [\x5d-\x7e] # double quote character
- end
-
- rule phrase
- obs_phrase / word+
- end
-
- rule word
- atom / quoted_string
- end
-
- rule phrase_list
- first_phrase:phrase other_phrases:("," FWS* phrase_value:phrase)*
- end
-
- rule domain_literal
- CFWS? "[" (FWS? dcontent)* FWS? "]" CFWS?
- end
-
- rule dcontent
- dtext / quoted_pair
- end
-
- rule dtext
- NO_WS_CTL / # Non white space controls
- [\x21-\x5a] / # The rest of the US-ASCII characters
- [\x5e-\x7e] # not including "[", "]", or "\"
- end
-
- rule angle_addr
- CFWS? "<" addr_spec ">" CFWS? / obs_angle_addr
- end
-
- rule addr_spec
- (local_part "@" domain) / local_part
- end
-
- rule local_part
- local_dot_atom / quoted_string / obs_local_part
- end
-
- rule domain
- dot_atom / domain_literal / obs_domain
- end
-
- rule group
- group_name:display_name ":" group_list:(mailbox_list_group / CFWS)? ";" CFWS?
- end
-
- rule mailbox_list_group
- mailbox_list {
- def addresses
- [first_addr] + other_addr.elements.map { |o| o.addr_value }
- end
- }
- end
-
- rule quoted_string
- CFWS? DQUOTE quoted_content:(FWS? qcontent)* FWS? DQUOTE CFWS?
- end
-
- rule qcontent
- qtext / quoted_pair
- end
-
- rule quoted_pair
- ("\\" text) / obs_qp
- end
-
- rule qtext
- NO_WS_CTL / # Non white space controls
- [\x21] / # The rest of the US-ASCII
- [\x23-\x5b] / # characters not including "\"
- [\x5d-\x7e] # or the quote character
- end
-
- rule text
- [\x01-\x09] / # Characters excluding CR and LF
- [\x0b-\x0c] /
- [\x0e-\x7e] /
- obs_text
- end
-
- rule display_name
- phrase
- end
-
- rule name_addr
- display_name angle_addr / angle_addr
- end
-
- rule mailbox_list
- (first_addr:mailbox other_addr:(("," / ";") addr_value:mailbox)*) / obs_mbox_list
- end
-
- rule mailbox
- (name_addr / addr_spec) {
- def dig_comments(comments, elements)
- elements.each { |elem|
- if elem.respond_to?(:comment)
- comments << elem.comment
- end
- dig_comments(comments, elem.elements) if elem.elements
- }
- end
-
- def comments
- comments = []
- dig_comments(comments, elements)
- comments
- end
- }
- end
-
- rule address
- group {
-
- def dig_comments(comments, elements)
- elements.each { |elem|
- if elem.respond_to?(:comment)
- comments << elem.comment
- end
- dig_comments(comments, elem.elements) if elem.elements
- }
- end
-
- def comments
- comments = []
- dig_comments(comments, elements)
- comments
- end
-
- } /
- mailbox
- end
-
- rule address_list
- first_addr:address? other_addr:(FWS* ("," / ";") FWS* addr_value:address?)*
- end
-
- rule date_time
- ( day_of_week ",")? date FWS time CFWS?
- end
-
- rule day_of_week
- (FWS? day_name) / obs_day_of_week
- end
-
- rule day_name
- "Mon" / "Tue" / "Wed" / "Thu" /
- "Fri" / "Sat" / "Sun"
- end
-
- rule date
- day month year
- end
-
- rule year
- DIGIT DIGIT DIGIT DIGIT / obs_year
- end
-
- rule month
- (FWS month_name FWS) / obs_month
- end
-
- rule month_name
- "Jan" / "Feb" / "Mar" / "Apr" /
- "May" / "Jun" / "Jul" / "Aug" /
- "Sep" / "Oct" / "Nov" / "Dec"
- end
-
- rule day
- (FWS? DIGIT DIGIT?) / obs_day
- end
-
- rule time
- time_of_day FWS zone
- end
-
- rule time_of_day
- hour ":" minute ( ":" second )?
- end
-
- rule hour
- DIGIT DIGIT / obs_hour
- end
-
- rule minute
- DIGIT DIGIT / obs_minute
- end
-
- rule second
- DIGIT DIGIT / obs_second
- end
-
- rule zone
- (( "+" / "-" ) DIGIT DIGIT DIGIT DIGIT) / obs_zone
- end
-
- rule return
- path CRLF
- end
-
- rule path
- ((CFWS)? "<" ((CFWS)? / addr_spec) ">" (CFWS)?) / obs_path
- end
-
- rule received
- name_val_list ";" date_time CRLF
- end
-
- rule name_val_list
- (CFWS)? (name_val_pair (CFWS name_val_pair)*)?
- end
-
- rule name_val_pair
- item_name CFWS item_value
- end
-
- rule item_name
- ALPHA (("-")? (ALPHA / DIGIT))*
- end
-
- rule item_value
- (angle_addr)+ / addr_spec / atom / domain / msg_id
- end
-
- rule message_ids
- first_msg_id:msg_id other_msg_ids:( CFWS msg_id_value:msg_id )*
- end
-
- rule msg_id
- (CFWS)? "<" msg_id_value ">" (CFWS)?
- end
-
- rule msg_id_value
- id_left "@" id_right
- end
-
- rule id_left
- message_id_text / no_fold_quote / obs_id_left
- end
-
- rule id_right
- msg_id_dot_atom_text / no_fold_literal / obs_id_right
- end
-
- rule msg_id_dot_atom_text
- (msg_id_domain_text "."?)+
- end
-
- rule msg_id_domain_text
- (DQUOTE (FWS? quoted_domain)+ FWS? DQUOTE) / msg_id_atext+
- end
-
- rule msg_id_atext
- ALPHA / DIGIT / # Any character except controls,
- "!" / "#" / # SP, and specials.
- "$" / "%" / # Used for atoms
- "&" / "'" /
- "*" / "+" /
- "-" / "/" /
- "=" / "?" /
- "^" / "_" /
- "`" / "{" /
- "|" / "}" /
- "~" / "@"
- end
-
- rule no_fold_quote
- DQUOTE (qtext / quoted_pair)+ DQUOTE
- end
-
- rule no_fold_literal
- "[" (dtext / quoted_pair)+ "]"
- end
-
-
- end
-end
diff --git a/lib/mail/parsers/rfc2822_obsolete.rb b/lib/mail/parsers/rfc2822_obsolete.rb
deleted file mode 100644
index c8bccab..0000000
--- a/lib/mail/parsers/rfc2822_obsolete.rb
+++ /dev/null
@@ -1,3768 +0,0 @@
-# Autogenerated from a Treetop grammar. Edits may be lost.
-
-
-module Mail
- module RFC2822Obsolete
- include Treetop::Runtime
-
- def root
- @root ||= :obs_qp
- end
-
- module ObsQp0
- end
-
- def _nt_obs_qp
- start_index = index
- if node_cache[:obs_qp].has_key?(index)
- cached = node_cache[:obs_qp][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("\\", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("\\")
- r1 = nil
- end
- s0 << r1
- if r1
- if has_terminal?('\G[\\x00-\\x7F]', true, index)
- r2 = true
- @index += 1
- else
- r2 = nil
- end
- s0 << r2
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsQp0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_qp][start_index] = r0
-
- r0
- end
-
- module ObsText0
- def obs_char
- elements[0]
- end
-
- end
-
- module ObsText1
- end
-
- def _nt_obs_text
- start_index = index
- if node_cache[:obs_text].has_key?(index)
- cached = node_cache[:obs_text][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- s1, i1 = [], index
- loop do
- r2 = _nt_LF
- if r2
- s1 << r2
- else
- break
- end
- end
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- s0 << r1
- if r1
- s3, i3 = [], index
- loop do
- r4 = _nt_CR
- if r4
- s3 << r4
- else
- break
- end
- end
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
- s0 << r3
- if r3
- s5, i5 = [], index
- loop do
- i6, s6 = index, []
- r7 = _nt_obs_char
- s6 << r7
- if r7
- s8, i8 = [], index
- loop do
- r9 = _nt_LF
- if r9
- s8 << r9
- else
- break
- end
- end
- r8 = instantiate_node(SyntaxNode,input, i8...index, s8)
- s6 << r8
- if r8
- s10, i10 = [], index
- loop do
- r11 = _nt_CR
- if r11
- s10 << r11
- else
- break
- end
- end
- r10 = instantiate_node(SyntaxNode,input, i10...index, s10)
- s6 << r10
- end
- end
- if s6.last
- r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
- r6.extend(ObsText0)
- else
- @index = i6
- r6 = nil
- end
- if r6
- s5 << r6
- else
- break
- end
- end
- r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
- s0 << r5
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsText1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_text][start_index] = r0
-
- r0
- end
-
- def _nt_obs_char
- start_index = index
- if node_cache[:obs_char].has_key?(index)
- cached = node_cache[:obs_char][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- if has_terminal?('\G[\\x00-\\x09]', true, index)
- r1 = true
- @index += 1
- else
- r1 = nil
- end
- if r1
- r0 = r1
- else
- if has_terminal?('\G[\\x0B-\\x0C]', true, index)
- r2 = true
- @index += 1
- else
- r2 = nil
- end
- if r2
- r0 = r2
- else
- if has_terminal?('\G[\\x0E-\\x7F]', true, index)
- r3 = true
- @index += 1
- else
- r3 = nil
- end
- if r3
- r0 = r3
- else
- @index = i0
- r0 = nil
- end
- end
- end
-
- node_cache[:obs_char][start_index] = r0
-
- r0
- end
-
- def _nt_obs_utext
- start_index = index
- if node_cache[:obs_utext].has_key?(index)
- cached = node_cache[:obs_utext][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- r0 = _nt_obs_text
-
- node_cache[:obs_utext][start_index] = r0
-
- r0
- end
-
- def _nt_obs_phrase
- start_index = index
- if node_cache[:obs_phrase].has_key?(index)
- cached = node_cache[:obs_phrase][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- s0, i0 = [], index
- loop do
- i1 = index
- r2 = _nt_word
- if r2
- r1 = r2
- else
- if has_terminal?(".", false, index)
- r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(".")
- r3 = nil
- end
- if r3
- r1 = r3
- else
- if has_terminal?("@", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("@")
- r4 = nil
- end
- if r4
- r1 = r4
- else
- @index = i1
- r1 = nil
- end
- end
- end
- if r1
- s0 << r1
- else
- break
- end
- end
- if s0.empty?
- @index = i0
- r0 = nil
- else
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- end
-
- node_cache[:obs_phrase][start_index] = r0
-
- r0
- end
-
- module ObsPhraseList0
- end
-
- module ObsPhraseList1
- end
-
- def _nt_obs_phrase_list
- start_index = index
- if node_cache[:obs_phrase_list].has_key?(index)
- cached = node_cache[:obs_phrase_list][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- r1 = _nt_phrase
- if r1
- r0 = r1
- else
- i2, s2 = index, []
- s3, i3 = [], index
- loop do
- i4, s4 = index, []
- r6 = _nt_phrase
- if r6
- r5 = r6
- else
- r5 = instantiate_node(SyntaxNode,input, index...index)
- end
- s4 << r5
- if r5
- r8 = _nt_CFWS
- if r8
- r7 = r8
- else
- r7 = instantiate_node(SyntaxNode,input, index...index)
- end
- s4 << r7
- if r7
- if has_terminal?(",", false, index)
- r9 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(",")
- r9 = nil
- end
- s4 << r9
- if r9
- r11 = _nt_CFWS
- if r11
- r10 = r11
- else
- r10 = instantiate_node(SyntaxNode,input, index...index)
- end
- s4 << r10
- end
- end
- end
- if s4.last
- r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
- r4.extend(ObsPhraseList0)
- else
- @index = i4
- r4 = nil
- end
- if r4
- s3 << r4
- else
- break
- end
- end
- if s3.empty?
- @index = i3
- r3 = nil
- else
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
- end
- s2 << r3
- if r3
- r13 = _nt_phrase
- if r13
- r12 = r13
- else
- r12 = instantiate_node(SyntaxNode,input, index...index)
- end
- s2 << r12
- end
- if s2.last
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- r2.extend(ObsPhraseList1)
- else
- @index = i2
- r2 = nil
- end
- if r2
- r0 = r2
- else
- @index = i0
- r0 = nil
- end
- end
-
- node_cache[:obs_phrase_list][start_index] = r0
-
- r0
- end
-
- module ObsFWS0
- def CRLF
- elements[0]
- end
-
- end
-
- module ObsFWS1
- end
-
- def _nt_obs_FWS
- start_index = index
- if node_cache[:obs_FWS].has_key?(index)
- cached = node_cache[:obs_FWS][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- s1, i1 = [], index
- loop do
- r2 = _nt_WSP
- if r2
- s1 << r2
- else
- break
- end
- end
- if s1.empty?
- @index = i1
- r1 = nil
- else
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- end
- s0 << r1
- if r1
- s3, i3 = [], index
- loop do
- i4, s4 = index, []
- r5 = _nt_CRLF
- s4 << r5
- if r5
- s6, i6 = [], index
- loop do
- r7 = _nt_WSP
- if r7
- s6 << r7
- else
- break
- end
- end
- if s6.empty?
- @index = i6
- r6 = nil
- else
- r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
- end
- s4 << r6
- end
- if s4.last
- r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
- r4.extend(ObsFWS0)
- else
- @index = i4
- r4 = nil
- end
- if r4
- s3 << r4
- else
- break
- end
- end
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
- s0 << r3
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsFWS1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_FWS][start_index] = r0
-
- r0
- end
-
- module ObsDayOfWeek0
- def day_name
- elements[1]
- end
-
- end
-
- def _nt_obs_day_of_week
- start_index = index
- if node_cache[:obs_day_of_week].has_key?(index)
- cached = node_cache[:obs_day_of_week][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r2 = _nt_CFWS
- if r2
- r1 = r2
- else
- r1 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r1
- if r1
- r3 = _nt_day_name
- s0 << r3
- if r3
- r5 = _nt_CFWS
- if r5
- r4 = r5
- else
- r4 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r4
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsDayOfWeek0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_day_of_week][start_index] = r0
-
- r0
- end
-
- module ObsYear0
- def DIGIT1
- elements[0]
- end
-
- def DIGIT2
- elements[1]
- end
- end
-
- module ObsYear1
- end
-
- def _nt_obs_year
- start_index = index
- if node_cache[:obs_year].has_key?(index)
- cached = node_cache[:obs_year][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r2 = _nt_CFWS
- if r2
- r1 = r2
- else
- r1 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r1
- if r1
- i3, s3 = index, []
- r4 = _nt_DIGIT
- s3 << r4
- if r4
- r5 = _nt_DIGIT
- s3 << r5
- end
- if s3.last
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
- r3.extend(ObsYear0)
- else
- @index = i3
- r3 = nil
- end
- s0 << r3
- if r3
- r7 = _nt_CFWS
- if r7
- r6 = r7
- else
- r6 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r6
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsYear1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_year][start_index] = r0
-
- r0
- end
-
- module ObsMonth0
- def CFWS1
- elements[0]
- end
-
- def month_name
- elements[1]
- end
-
- def CFWS2
- elements[2]
- end
- end
-
- def _nt_obs_month
- start_index = index
- if node_cache[:obs_month].has_key?(index)
- cached = node_cache[:obs_month][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r1 = _nt_CFWS
- s0 << r1
- if r1
- r2 = _nt_month_name
- s0 << r2
- if r2
- r3 = _nt_CFWS
- s0 << r3
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsMonth0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_month][start_index] = r0
-
- r0
- end
-
- module ObsDay0
- def DIGIT1
- elements[0]
- end
-
- def DIGIT2
- elements[1]
- end
- end
-
- module ObsDay1
- end
-
- def _nt_obs_day
- start_index = index
- if node_cache[:obs_day].has_key?(index)
- cached = node_cache[:obs_day][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r2 = _nt_CFWS
- if r2
- r1 = r2
- else
- r1 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r1
- if r1
- i3 = index
- r4 = _nt_DIGIT
- if r4
- r3 = r4
- else
- i5, s5 = index, []
- r6 = _nt_DIGIT
- s5 << r6
- if r6
- r7 = _nt_DIGIT
- s5 << r7
- end
- if s5.last
- r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
- r5.extend(ObsDay0)
- else
- @index = i5
- r5 = nil
- end
- if r5
- r3 = r5
- else
- @index = i3
- r3 = nil
- end
- end
- s0 << r3
- if r3
- r9 = _nt_CFWS
- if r9
- r8 = r9
- else
- r8 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r8
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsDay1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_day][start_index] = r0
-
- r0
- end
-
- module ObsHour0
- def DIGIT1
- elements[0]
- end
-
- def DIGIT2
- elements[1]
- end
- end
-
- module ObsHour1
- end
-
- def _nt_obs_hour
- start_index = index
- if node_cache[:obs_hour].has_key?(index)
- cached = node_cache[:obs_hour][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r2 = _nt_CFWS
- if r2
- r1 = r2
- else
- r1 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r1
- if r1
- i3, s3 = index, []
- r4 = _nt_DIGIT
- s3 << r4
- if r4
- r5 = _nt_DIGIT
- s3 << r5
- end
- if s3.last
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
- r3.extend(ObsHour0)
- else
- @index = i3
- r3 = nil
- end
- s0 << r3
- if r3
- r7 = _nt_CFWS
- if r7
- r6 = r7
- else
- r6 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r6
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsHour1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_hour][start_index] = r0
-
- r0
- end
-
- module ObsMinute0
- def DIGIT1
- elements[0]
- end
-
- def DIGIT2
- elements[1]
- end
- end
-
- module ObsMinute1
- end
-
- def _nt_obs_minute
- start_index = index
- if node_cache[:obs_minute].has_key?(index)
- cached = node_cache[:obs_minute][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r2 = _nt_CFWS
- if r2
- r1 = r2
- else
- r1 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r1
- if r1
- i3, s3 = index, []
- r4 = _nt_DIGIT
- s3 << r4
- if r4
- r5 = _nt_DIGIT
- s3 << r5
- end
- if s3.last
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
- r3.extend(ObsMinute0)
- else
- @index = i3
- r3 = nil
- end
- s0 << r3
- if r3
- r7 = _nt_CFWS
- if r7
- r6 = r7
- else
- r6 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r6
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsMinute1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_minute][start_index] = r0
-
- r0
- end
-
- module ObsSecond0
- def DIGIT1
- elements[0]
- end
-
- def DIGIT2
- elements[1]
- end
- end
-
- module ObsSecond1
- end
-
- def _nt_obs_second
- start_index = index
- if node_cache[:obs_second].has_key?(index)
- cached = node_cache[:obs_second][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r2 = _nt_CFWS
- if r2
- r1 = r2
- else
- r1 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r1
- if r1
- i3, s3 = index, []
- r4 = _nt_DIGIT
- s3 << r4
- if r4
- r5 = _nt_DIGIT
- s3 << r5
- end
- if s3.last
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
- r3.extend(ObsSecond0)
- else
- @index = i3
- r3 = nil
- end
- s0 << r3
- if r3
- r7 = _nt_CFWS
- if r7
- r6 = r7
- else
- r6 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r6
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsSecond1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_second][start_index] = r0
-
- r0
- end
-
- def _nt_obs_zone
- start_index = index
- if node_cache[:obs_zone].has_key?(index)
- cached = node_cache[:obs_zone][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0 = index
- if has_terminal?("UT", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 2))
- @index += 2
- else
- terminal_parse_failure("UT")
- r1 = nil
- end
- if r1
- r0 = r1
- else
- if has_terminal?("GMT", false, index)
- r2 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("GMT")
- r2 = nil
- end
- if r2
- r0 = r2
- else
- if has_terminal?("EST", false, index)
- r3 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("EST")
- r3 = nil
- end
- if r3
- r0 = r3
- else
- if has_terminal?("EDT", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("EDT")
- r4 = nil
- end
- if r4
- r0 = r4
- else
- if has_terminal?("CST", false, index)
- r5 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("CST")
- r5 = nil
- end
- if r5
- r0 = r5
- else
- if has_terminal?("CDT", false, index)
- r6 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("CDT")
- r6 = nil
- end
- if r6
- r0 = r6
- else
- if has_terminal?("MST", false, index)
- r7 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("MST")
- r7 = nil
- end
- if r7
- r0 = r7
- else
- if has_terminal?("MDT", false, index)
- r8 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("MDT")
- r8 = nil
- end
- if r8
- r0 = r8
- else
- if has_terminal?("PST", false, index)
- r9 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("PST")
- r9 = nil
- end
- if r9
- r0 = r9
- else
- if has_terminal?("PDT", false, index)
- r10 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("PDT")
- r10 = nil
- end
- if r10
- r0 = r10
- else
- if has_terminal?('\G[\\x41-\\x49]', true, index)
- r11 = true
- @index += 1
- else
- r11 = nil
- end
- if r11
- r0 = r11
- else
- if has_terminal?('\G[\\x4B-\\x5A]', true, index)
- r12 = true
- @index += 1
- else
- r12 = nil
- end
- if r12
- r0 = r12
- else
- if has_terminal?('\G[\\x61-\\x69]', true, index)
- r13 = true
- @index += 1
- else
- r13 = nil
- end
- if r13
- r0 = r13
- else
- if has_terminal?('\G[\\x6B-\\x7A]', true, index)
- r14 = true
- @index += 1
- else
- r14 = nil
- end
- if r14
- r0 = r14
- else
- @index = i0
- r0 = nil
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
-
- node_cache[:obs_zone][start_index] = r0
-
- r0
- end
-
- module ObsAngleAddr0
- def addr_spec
- elements[3]
- end
-
- end
-
- def _nt_obs_angle_addr
- start_index = index
- if node_cache[:obs_angle_addr].has_key?(index)
- cached = node_cache[:obs_angle_addr][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r2 = _nt_CFWS
- if r2
- r1 = r2
- else
- r1 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r1
- if r1
- if has_terminal?("<", false, index)
- r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("<")
- r3 = nil
- end
- s0 << r3
- if r3
- r5 = _nt_obs_route
- if r5
- r4 = r5
- else
- r4 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r4
- if r4
- r6 = _nt_addr_spec
- s0 << r6
- if r6
- if has_terminal?(">", false, index)
- r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(">")
- r7 = nil
- end
- s0 << r7
- if r7
- r9 = _nt_CFWS
- if r9
- r8 = r9
- else
- r8 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r8
- end
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsAngleAddr0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_angle_addr][start_index] = r0
-
- r0
- end
-
- module ObsRoute0
- def obs_domain_list
- elements[1]
- end
-
- end
-
- def _nt_obs_route
- start_index = index
- if node_cache[:obs_route].has_key?(index)
- cached = node_cache[:obs_route][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r2 = _nt_CFWS
- if r2
- r1 = r2
- else
- r1 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r1
- if r1
- r3 = _nt_obs_domain_list
- s0 << r3
- if r3
- if has_terminal?(":", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r4 = nil
- end
- s0 << r4
- if r4
- r6 = _nt_CFWS
- if r6
- r5 = r6
- else
- r5 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r5
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsRoute0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_route][start_index] = r0
-
- r0
- end
-
- module ObsDomainList0
- def domain
- elements[3]
- end
- end
-
- module ObsDomainList1
- def domain
- elements[1]
- end
-
- end
-
- def _nt_obs_domain_list
- start_index = index
- if node_cache[:obs_domain_list].has_key?(index)
- cached = node_cache[:obs_domain_list][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("@", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("@")
- r1 = nil
- end
- s0 << r1
- if r1
- r2 = _nt_domain
- s0 << r2
- if r2
- s3, i3 = [], index
- loop do
- i4, s4 = index, []
- s5, i5 = [], index
- loop do
- if has_terminal?(",", false, index)
- r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(",")
- r6 = nil
- end
- if r6
- s5 << r6
- else
- break
- end
- end
- r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
- s4 << r5
- if r5
- r8 = _nt_CFWS
- if r8
- r7 = r8
- else
- r7 = instantiate_node(SyntaxNode,input, index...index)
- end
- s4 << r7
- if r7
- if has_terminal?("@", false, index)
- r9 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure("@")
- r9 = nil
- end
- s4 << r9
- if r9
- r10 = _nt_domain
- s4 << r10
- end
- end
- end
- if s4.last
- r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
- r4.extend(ObsDomainList0)
- else
- @index = i4
- r4 = nil
- end
- if r4
- s3 << r4
- else
- break
- end
- end
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
- s0 << r3
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsDomainList1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_domain_list][start_index] = r0
-
- r0
- end
-
- module ObsLocalPart0
- def word
- elements[1]
- end
- end
-
- module ObsLocalPart1
- def word
- elements[0]
- end
-
- end
-
- def _nt_obs_local_part
- start_index = index
- if node_cache[:obs_local_part].has_key?(index)
- cached = node_cache[:obs_local_part][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r1 = _nt_word
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- i3, s3 = index, []
- if has_terminal?(".", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(".")
- r4 = nil
- end
- s3 << r4
- if r4
- r5 = _nt_word
- s3 << r5
- end
- if s3.last
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
- r3.extend(ObsLocalPart0)
- else
- @index = i3
- r3 = nil
- end
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsLocalPart1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_local_part][start_index] = r0
-
- r0
- end
-
- module ObsDomain0
- def atom
- elements[1]
- end
- end
-
- module ObsDomain1
- def atom
- elements[0]
- end
-
- end
-
- def _nt_obs_domain
- start_index = index
- if node_cache[:obs_domain].has_key?(index)
- cached = node_cache[:obs_domain][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r1 = _nt_atom
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- i3, s3 = index, []
- if has_terminal?(".", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(".")
- r4 = nil
- end
- s3 << r4
- if r4
- r5 = _nt_atom
- s3 << r5
- end
- if s3.last
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
- r3.extend(ObsDomain0)
- else
- @index = i3
- r3 = nil
- end
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsDomain1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_domain][start_index] = r0
-
- r0
- end
-
- module ObsMboxList0
- end
-
- module ObsMboxList1
- end
-
- def _nt_obs_mbox_list
- start_index = index
- if node_cache[:obs_mbox_list].has_key?(index)
- cached = node_cache[:obs_mbox_list][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- s1, i1 = [], index
- loop do
- i2, s2 = index, []
- r4 = _nt_mailbox
- if r4
- r3 = r4
- else
- r3 = instantiate_node(SyntaxNode,input, index...index)
- end
- s2 << r3
- if r3
- r6 = _nt_CFWS
- if r6
- r5 = r6
- else
- r5 = instantiate_node(SyntaxNode,input, index...index)
- end
- s2 << r5
- if r5
- if has_terminal?(",", false, index)
- r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(",")
- r7 = nil
- end
- s2 << r7
- if r7
- r9 = _nt_CFWS
- if r9
- r8 = r9
- else
- r8 = instantiate_node(SyntaxNode,input, index...index)
- end
- s2 << r8
- end
- end
- end
- if s2.last
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- r2.extend(ObsMboxList0)
- else
- @index = i2
- r2 = nil
- end
- if r2
- s1 << r2
- else
- break
- end
- end
- if s1.empty?
- @index = i1
- r1 = nil
- else
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- end
- s0 << r1
- if r1
- r11 = _nt_mailbox
- if r11
- r10 = r11
- else
- r10 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r10
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsMboxList1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_mbox_list][start_index] = r0
-
- r0
- end
-
- module ObsAddrList0
- end
-
- module ObsAddrList1
- end
-
- def _nt_obs_addr_list
- start_index = index
- if node_cache[:obs_addr_list].has_key?(index)
- cached = node_cache[:obs_addr_list][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- s1, i1 = [], index
- loop do
- i2, s2 = index, []
- r4 = _nt_address
- if r4
- r3 = r4
- else
- r3 = instantiate_node(SyntaxNode,input, index...index)
- end
- s2 << r3
- if r3
- r6 = _nt_CFWS
- if r6
- r5 = r6
- else
- r5 = instantiate_node(SyntaxNode,input, index...index)
- end
- s2 << r5
- if r5
- if has_terminal?(",", false, index)
- r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(",")
- r7 = nil
- end
- s2 << r7
- if r7
- r9 = _nt_CFWS
- if r9
- r8 = r9
- else
- r8 = instantiate_node(SyntaxNode,input, index...index)
- end
- s2 << r8
- end
- end
- end
- if s2.last
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- r2.extend(ObsAddrList0)
- else
- @index = i2
- r2 = nil
- end
- if r2
- s1 << r2
- else
- break
- end
- end
- if s1.empty?
- @index = i1
- r1 = nil
- else
- r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
- end
- s0 << r1
- if r1
- r11 = _nt_address
- if r11
- r10 = r11
- else
- r10 = instantiate_node(SyntaxNode,input, index...index)
- end
- s0 << r10
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsAddrList1)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_addr_list][start_index] = r0
-
- r0
- end
-
- def _nt_obs_fields
- start_index = index
- if node_cache[:obs_fields].has_key?(index)
- cached = node_cache[:obs_fields][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- s0, i0 = [], index
- loop do
- i1 = index
- r2 = _nt_obs_return
- if r2
- r1 = r2
- else
- r3 = _nt_obs_received
- if r3
- r1 = r3
- else
- r4 = _nt_obs_orig_date
- if r4
- r1 = r4
- else
- r5 = _nt_obs_from
- if r5
- r1 = r5
- else
- r6 = _nt_obs_sender
- if r6
- r1 = r6
- else
- r7 = _nt_obs_reply_to
- if r7
- r1 = r7
- else
- r8 = _nt_obs_to
- if r8
- r1 = r8
- else
- r9 = _nt_obs_cc
- if r9
- r1 = r9
- else
- r10 = _nt_obs_bcc
- if r10
- r1 = r10
- else
- r11 = _nt_obs_message_id
- if r11
- r1 = r11
- else
- r12 = _nt_obs_in_reply_to
- if r12
- r1 = r12
- else
- r13 = _nt_obs_references
- if r13
- r1 = r13
- else
- r14 = _nt_obs_subject
- if r14
- r1 = r14
- else
- r15 = _nt_obs_comments
- if r15
- r1 = r15
- else
- r16 = _nt_obs_keywords
- if r16
- r1 = r16
- else
- r17 = _nt_obs_resent_date
- if r17
- r1 = r17
- else
- r18 = _nt_obs_resent_from
- if r18
- r1 = r18
- else
- r19 = _nt_obs_resent_send
- if r19
- r1 = r19
- else
- r20 = _nt_obs_resent_rply
- if r20
- r1 = r20
- else
- r21 = _nt_obs_resent_to
- if r21
- r1 = r21
- else
- r22 = _nt_obs_resent_cc
- if r22
- r1 = r22
- else
- r23 = _nt_obs_resent_bcc
- if r23
- r1 = r23
- else
- r24 = _nt_obs_resent_mid
- if r24
- r1 = r24
- else
- r25 = _nt_obs_optional
- if r25
- r1 = r25
- else
- @index = i1
- r1 = nil
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- end
- if r1
- s0 << r1
- else
- break
- end
- end
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
-
- node_cache[:obs_fields][start_index] = r0
-
- r0
- end
-
- module ObsOrigDate0
- def date_time
- elements[3]
- end
-
- def CRLF
- elements[4]
- end
- end
-
- def _nt_obs_orig_date
- start_index = index
- if node_cache[:obs_orig_date].has_key?(index)
- cached = node_cache[:obs_orig_date][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("Date", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 4))
- @index += 4
- else
- terminal_parse_failure("Date")
- r1 = nil
- end
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- r3 = _nt_WSP
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- if r2
- if has_terminal?(":", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r4 = nil
- end
- s0 << r4
- if r4
- r5 = _nt_date_time
- s0 << r5
- if r5
- r6 = _nt_CRLF
- s0 << r6
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsOrigDate0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_orig_date][start_index] = r0
-
- r0
- end
-
- module ObsFrom0
- def mailbox_list
- elements[3]
- end
-
- def CRLF
- elements[4]
- end
- end
-
- def _nt_obs_from
- start_index = index
- if node_cache[:obs_from].has_key?(index)
- cached = node_cache[:obs_from][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("From", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 4))
- @index += 4
- else
- terminal_parse_failure("From")
- r1 = nil
- end
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- r3 = _nt_WSP
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- if r2
- if has_terminal?(":", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r4 = nil
- end
- s0 << r4
- if r4
- r5 = _nt_mailbox_list
- s0 << r5
- if r5
- r6 = _nt_CRLF
- s0 << r6
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsFrom0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_from][start_index] = r0
-
- r0
- end
-
- module ObsSender0
- def mailbox
- elements[3]
- end
-
- def CRLF
- elements[4]
- end
- end
-
- def _nt_obs_sender
- start_index = index
- if node_cache[:obs_sender].has_key?(index)
- cached = node_cache[:obs_sender][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("Sender", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 6))
- @index += 6
- else
- terminal_parse_failure("Sender")
- r1 = nil
- end
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- r3 = _nt_WSP
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- if r2
- if has_terminal?(":", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r4 = nil
- end
- s0 << r4
- if r4
- r5 = _nt_mailbox
- s0 << r5
- if r5
- r6 = _nt_CRLF
- s0 << r6
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsSender0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_sender][start_index] = r0
-
- r0
- end
-
- module ObsReplyTo0
- def mailbox_list
- elements[3]
- end
-
- def CRLF
- elements[4]
- end
- end
-
- def _nt_obs_reply_to
- start_index = index
- if node_cache[:obs_reply_to].has_key?(index)
- cached = node_cache[:obs_reply_to][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("Reply-To", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 8))
- @index += 8
- else
- terminal_parse_failure("Reply-To")
- r1 = nil
- end
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- r3 = _nt_WSP
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- if r2
- if has_terminal?(":", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r4 = nil
- end
- s0 << r4
- if r4
- r5 = _nt_mailbox_list
- s0 << r5
- if r5
- r6 = _nt_CRLF
- s0 << r6
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsReplyTo0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_reply_to][start_index] = r0
-
- r0
- end
-
- module ObsTo0
- def address_list
- elements[3]
- end
-
- def CRLF
- elements[4]
- end
- end
-
- def _nt_obs_to
- start_index = index
- if node_cache[:obs_to].has_key?(index)
- cached = node_cache[:obs_to][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("To", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 2))
- @index += 2
- else
- terminal_parse_failure("To")
- r1 = nil
- end
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- r3 = _nt_WSP
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- if r2
- if has_terminal?(":", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r4 = nil
- end
- s0 << r4
- if r4
- r5 = _nt_address_list
- s0 << r5
- if r5
- r6 = _nt_CRLF
- s0 << r6
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsTo0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_to][start_index] = r0
-
- r0
- end
-
- module ObsCc0
- def address_list
- elements[3]
- end
-
- def CRLF
- elements[4]
- end
- end
-
- def _nt_obs_cc
- start_index = index
- if node_cache[:obs_cc].has_key?(index)
- cached = node_cache[:obs_cc][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("Cc", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 2))
- @index += 2
- else
- terminal_parse_failure("Cc")
- r1 = nil
- end
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- r3 = _nt_WSP
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- if r2
- if has_terminal?(":", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r4 = nil
- end
- s0 << r4
- if r4
- r5 = _nt_address_list
- s0 << r5
- if r5
- r6 = _nt_CRLF
- s0 << r6
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsCc0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_cc][start_index] = r0
-
- r0
- end
-
- module ObsBcc0
- def CRLF
- elements[4]
- end
- end
-
- def _nt_obs_bcc
- start_index = index
- if node_cache[:obs_bcc].has_key?(index)
- cached = node_cache[:obs_bcc][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("Bcc", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 3))
- @index += 3
- else
- terminal_parse_failure("Bcc")
- r1 = nil
- end
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- r3 = _nt_WSP
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- if r2
- if has_terminal?(":", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r4 = nil
- end
- s0 << r4
- if r4
- i5 = index
- r6 = _nt_address_list
- if r6
- r5 = r6
- else
- r8 = _nt_CFWS
- if r8
- r7 = r8
- else
- r7 = instantiate_node(SyntaxNode,input, index...index)
- end
- if r7
- r5 = r7
- else
- @index = i5
- r5 = nil
- end
- end
- s0 << r5
- if r5
- r9 = _nt_CRLF
- s0 << r9
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsBcc0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_bcc][start_index] = r0
-
- r0
- end
-
- module ObsMessageId0
- def msg_id
- elements[3]
- end
-
- def CRLF
- elements[4]
- end
- end
-
- def _nt_obs_message_id
- start_index = index
- if node_cache[:obs_message_id].has_key?(index)
- cached = node_cache[:obs_message_id][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("Message-ID", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 10))
- @index += 10
- else
- terminal_parse_failure("Message-ID")
- r1 = nil
- end
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- r3 = _nt_WSP
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- if r2
- if has_terminal?(":", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r4 = nil
- end
- s0 << r4
- if r4
- r5 = _nt_msg_id
- s0 << r5
- if r5
- r6 = _nt_CRLF
- s0 << r6
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsMessageId0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_message_id][start_index] = r0
-
- r0
- end
-
- module ObsInReplyTo0
- def CRLF
- elements[4]
- end
- end
-
- def _nt_obs_in_reply_to
- start_index = index
- if node_cache[:obs_in_reply_to].has_key?(index)
- cached = node_cache[:obs_in_reply_to][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("In-Reply-To", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 11))
- @index += 11
- else
- terminal_parse_failure("In-Reply-To")
- r1 = nil
- end
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- r3 = _nt_WSP
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- if r2
- if has_terminal?(":", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r4 = nil
- end
- s0 << r4
- if r4
- s5, i5 = [], index
- loop do
- i6 = index
- r7 = _nt_phrase
- if r7
- r6 = r7
- else
- r8 = _nt_msg_id
- if r8
- r6 = r8
- else
- @index = i6
- r6 = nil
- end
- end
- if r6
- s5 << r6
- else
- break
- end
- end
- r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
- s0 << r5
- if r5
- r9 = _nt_CRLF
- s0 << r9
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsInReplyTo0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_in_reply_to][start_index] = r0
-
- r0
- end
-
- module ObsReferences0
- def CRLF
- elements[4]
- end
- end
-
- def _nt_obs_references
- start_index = index
- if node_cache[:obs_references].has_key?(index)
- cached = node_cache[:obs_references][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("References", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 10))
- @index += 10
- else
- terminal_parse_failure("References")
- r1 = nil
- end
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- r3 = _nt_WSP
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- if r2
- if has_terminal?(":", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r4 = nil
- end
- s0 << r4
- if r4
- s5, i5 = [], index
- loop do
- i6 = index
- r7 = _nt_phrase
- if r7
- r6 = r7
- else
- r8 = _nt_msg_id
- if r8
- r6 = r8
- else
- @index = i6
- r6 = nil
- end
- end
- if r6
- s5 << r6
- else
- break
- end
- end
- r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
- s0 << r5
- if r5
- r9 = _nt_CRLF
- s0 << r9
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsReferences0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_references][start_index] = r0
-
- r0
- end
-
- def _nt_obs_id_left
- start_index = index
- if node_cache[:obs_id_left].has_key?(index)
- cached = node_cache[:obs_id_left][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- r0 = _nt_local_part
-
- node_cache[:obs_id_left][start_index] = r0
-
- r0
- end
-
- def _nt_obs_id_right
- start_index = index
- if node_cache[:obs_id_right].has_key?(index)
- cached = node_cache[:obs_id_right][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- r0 = _nt_domain
-
- node_cache[:obs_id_right][start_index] = r0
-
- r0
- end
-
- module ObsSubject0
- def unstructured
- elements[3]
- end
-
- def CRLF
- elements[4]
- end
- end
-
- def _nt_obs_subject
- start_index = index
- if node_cache[:obs_subject].has_key?(index)
- cached = node_cache[:obs_subject][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("Subject", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 7))
- @index += 7
- else
- terminal_parse_failure("Subject")
- r1 = nil
- end
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- r3 = _nt_WSP
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- if r2
- if has_terminal?(":", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r4 = nil
- end
- s0 << r4
- if r4
- r5 = _nt_unstructured
- s0 << r5
- if r5
- r6 = _nt_CRLF
- s0 << r6
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsSubject0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_subject][start_index] = r0
-
- r0
- end
-
- module ObsComments0
- def unstructured
- elements[3]
- end
-
- def CRLF
- elements[4]
- end
- end
-
- def _nt_obs_comments
- start_index = index
- if node_cache[:obs_comments].has_key?(index)
- cached = node_cache[:obs_comments][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("Comments", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 8))
- @index += 8
- else
- terminal_parse_failure("Comments")
- r1 = nil
- end
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- r3 = _nt_WSP
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- if r2
- if has_terminal?(":", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r4 = nil
- end
- s0 << r4
- if r4
- r5 = _nt_unstructured
- s0 << r5
- if r5
- r6 = _nt_CRLF
- s0 << r6
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsComments0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_comments][start_index] = r0
-
- r0
- end
-
- module ObsKeywords0
- def obs_phrase_list
- elements[3]
- end
-
- def CRLF
- elements[4]
- end
- end
-
- def _nt_obs_keywords
- start_index = index
- if node_cache[:obs_keywords].has_key?(index)
- cached = node_cache[:obs_keywords][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("Keywords", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 8))
- @index += 8
- else
- terminal_parse_failure("Keywords")
- r1 = nil
- end
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- r3 = _nt_WSP
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- if r2
- if has_terminal?(":", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r4 = nil
- end
- s0 << r4
- if r4
- r5 = _nt_obs_phrase_list
- s0 << r5
- if r5
- r6 = _nt_CRLF
- s0 << r6
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsKeywords0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_keywords][start_index] = r0
-
- r0
- end
-
- module ObsResentFrom0
- def mailbox_list
- elements[3]
- end
-
- def CRLF
- elements[4]
- end
- end
-
- def _nt_obs_resent_from
- start_index = index
- if node_cache[:obs_resent_from].has_key?(index)
- cached = node_cache[:obs_resent_from][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("Resent-From", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 11))
- @index += 11
- else
- terminal_parse_failure("Resent-From")
- r1 = nil
- end
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- r3 = _nt_WSP
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- if r2
- if has_terminal?(":", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r4 = nil
- end
- s0 << r4
- if r4
- r5 = _nt_mailbox_list
- s0 << r5
- if r5
- r6 = _nt_CRLF
- s0 << r6
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsResentFrom0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_resent_from][start_index] = r0
-
- r0
- end
-
- module ObsResentSend0
- def mailbox
- elements[3]
- end
-
- def CRLF
- elements[4]
- end
- end
-
- def _nt_obs_resent_send
- start_index = index
- if node_cache[:obs_resent_send].has_key?(index)
- cached = node_cache[:obs_resent_send][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("Resent-Sender", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 13))
- @index += 13
- else
- terminal_parse_failure("Resent-Sender")
- r1 = nil
- end
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- r3 = _nt_WSP
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- if r2
- if has_terminal?(":", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r4 = nil
- end
- s0 << r4
- if r4
- r5 = _nt_mailbox
- s0 << r5
- if r5
- r6 = _nt_CRLF
- s0 << r6
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsResentSend0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_resent_send][start_index] = r0
-
- r0
- end
-
- module ObsResentDate0
- def date_time
- elements[3]
- end
-
- def CRLF
- elements[4]
- end
- end
-
- def _nt_obs_resent_date
- start_index = index
- if node_cache[:obs_resent_date].has_key?(index)
- cached = node_cache[:obs_resent_date][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("Resent-Date", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 11))
- @index += 11
- else
- terminal_parse_failure("Resent-Date")
- r1 = nil
- end
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- r3 = _nt_WSP
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- if r2
- if has_terminal?(":", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r4 = nil
- end
- s0 << r4
- if r4
- r5 = _nt_date_time
- s0 << r5
- if r5
- r6 = _nt_CRLF
- s0 << r6
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsResentDate0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_resent_date][start_index] = r0
-
- r0
- end
-
- module ObsResentTo0
- def address_list
- elements[3]
- end
-
- def CRLF
- elements[4]
- end
- end
-
- def _nt_obs_resent_to
- start_index = index
- if node_cache[:obs_resent_to].has_key?(index)
- cached = node_cache[:obs_resent_to][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("Resent-To", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 9))
- @index += 9
- else
- terminal_parse_failure("Resent-To")
- r1 = nil
- end
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- r3 = _nt_WSP
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- if r2
- if has_terminal?(":", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r4 = nil
- end
- s0 << r4
- if r4
- r5 = _nt_address_list
- s0 << r5
- if r5
- r6 = _nt_CRLF
- s0 << r6
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsResentTo0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_resent_to][start_index] = r0
-
- r0
- end
-
- module ObsResentCc0
- def address_list
- elements[3]
- end
-
- def CRLF
- elements[4]
- end
- end
-
- def _nt_obs_resent_cc
- start_index = index
- if node_cache[:obs_resent_cc].has_key?(index)
- cached = node_cache[:obs_resent_cc][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("Resent-Cc", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 9))
- @index += 9
- else
- terminal_parse_failure("Resent-Cc")
- r1 = nil
- end
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- r3 = _nt_WSP
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- if r2
- if has_terminal?(":", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r4 = nil
- end
- s0 << r4
- if r4
- r5 = _nt_address_list
- s0 << r5
- if r5
- r6 = _nt_CRLF
- s0 << r6
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsResentCc0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_resent_cc][start_index] = r0
-
- r0
- end
-
- module ObsResentBcc0
- def CRLF
- elements[4]
- end
- end
-
- def _nt_obs_resent_bcc
- start_index = index
- if node_cache[:obs_resent_bcc].has_key?(index)
- cached = node_cache[:obs_resent_bcc][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("Resent-Bcc", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 10))
- @index += 10
- else
- terminal_parse_failure("Resent-Bcc")
- r1 = nil
- end
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- r3 = _nt_WSP
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- if r2
- if has_terminal?(":", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r4 = nil
- end
- s0 << r4
- if r4
- i5 = index
- r6 = _nt_address_list
- if r6
- r5 = r6
- else
- r8 = _nt_CFWS
- if r8
- r7 = r8
- else
- r7 = instantiate_node(SyntaxNode,input, index...index)
- end
- if r7
- r5 = r7
- else
- @index = i5
- r5 = nil
- end
- end
- s0 << r5
- if r5
- r9 = _nt_CRLF
- s0 << r9
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsResentBcc0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_resent_bcc][start_index] = r0
-
- r0
- end
-
- module ObsResentMid0
- def msg_id
- elements[3]
- end
-
- def CRLF
- elements[4]
- end
- end
-
- def _nt_obs_resent_mid
- start_index = index
- if node_cache[:obs_resent_mid].has_key?(index)
- cached = node_cache[:obs_resent_mid][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("Resent-Message-ID", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 17))
- @index += 17
- else
- terminal_parse_failure("Resent-Message-ID")
- r1 = nil
- end
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- r3 = _nt_WSP
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- if r2
- if has_terminal?(":", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r4 = nil
- end
- s0 << r4
- if r4
- r5 = _nt_msg_id
- s0 << r5
- if r5
- r6 = _nt_CRLF
- s0 << r6
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsResentMid0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_resent_mid][start_index] = r0
-
- r0
- end
-
- module ObsResentRply0
- def address_list
- elements[3]
- end
-
- def CRLF
- elements[4]
- end
- end
-
- def _nt_obs_resent_rply
- start_index = index
- if node_cache[:obs_resent_rply].has_key?(index)
- cached = node_cache[:obs_resent_rply][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("Resent-Reply-To", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 15))
- @index += 15
- else
- terminal_parse_failure("Resent-Reply-To")
- r1 = nil
- end
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- r3 = _nt_WSP
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- if r2
- if has_terminal?(":", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r4 = nil
- end
- s0 << r4
- if r4
- r5 = _nt_address_list
- s0 << r5
- if r5
- r6 = _nt_CRLF
- s0 << r6
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsResentRply0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_resent_rply][start_index] = r0
-
- r0
- end
-
- module ObsReturn0
- def path
- elements[3]
- end
-
- def CRLF
- elements[4]
- end
- end
-
- def _nt_obs_return
- start_index = index
- if node_cache[:obs_return].has_key?(index)
- cached = node_cache[:obs_return][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("Return-Path", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 11))
- @index += 11
- else
- terminal_parse_failure("Return-Path")
- r1 = nil
- end
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- r3 = _nt_WSP
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- if r2
- if has_terminal?(":", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r4 = nil
- end
- s0 << r4
- if r4
- r5 = _nt_path
- s0 << r5
- if r5
- r6 = _nt_CRLF
- s0 << r6
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsReturn0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_return][start_index] = r0
-
- r0
- end
-
- module ObsReceived0
- def name_val_list
- elements[3]
- end
-
- def CRLF
- elements[4]
- end
- end
-
- def _nt_obs_received
- start_index = index
- if node_cache[:obs_received].has_key?(index)
- cached = node_cache[:obs_received][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- if has_terminal?("Received", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 8))
- @index += 8
- else
- terminal_parse_failure("Received")
- r1 = nil
- end
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- r3 = _nt_WSP
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- if r2
- if has_terminal?(":", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r4 = nil
- end
- s0 << r4
- if r4
- r5 = _nt_name_val_list
- s0 << r5
- if r5
- r6 = _nt_CRLF
- s0 << r6
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsReceived0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_received][start_index] = r0
-
- r0
- end
-
- def _nt_obs_path
- start_index = index
- if node_cache[:obs_path].has_key?(index)
- cached = node_cache[:obs_path][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- r0 = _nt_obs_angle_addr
-
- node_cache[:obs_path][start_index] = r0
-
- r0
- end
-
- module ObsOptional0
- def field_name
- elements[0]
- end
-
- def unstructured
- elements[3]
- end
-
- def CRLF
- elements[4]
- end
- end
-
- def _nt_obs_optional
- start_index = index
- if node_cache[:obs_optional].has_key?(index)
- cached = node_cache[:obs_optional][index]
- if cached
- cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
- @index = cached.interval.end
- end
- return cached
- end
-
- i0, s0 = index, []
- r1 = _nt_field_name
- s0 << r1
- if r1
- s2, i2 = [], index
- loop do
- r3 = _nt_WSP
- if r3
- s2 << r3
- else
- break
- end
- end
- r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
- s0 << r2
- if r2
- if has_terminal?(":", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
- @index += 1
- else
- terminal_parse_failure(":")
- r4 = nil
- end
- s0 << r4
- if r4
- r5 = _nt_unstructured
- s0 << r5
- if r5
- r6 = _nt_CRLF
- s0 << r6
- end
- end
- end
- end
- if s0.last
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
- r0.extend(ObsOptional0)
- else
- @index = i0
- r0 = nil
- end
-
- node_cache[:obs_optional][start_index] = r0
-
- r0
- end
-
- end
-
- class RFC2822ObsoleteParser < Treetop::Runtime::CompiledParser
- include RFC2822Obsolete
- end
-
-end
diff --git a/lib/mail/parsers/rfc2822_obsolete.treetop b/lib/mail/parsers/rfc2822_obsolete.treetop
deleted file mode 100644
index 83a4831..0000000
--- a/lib/mail/parsers/rfc2822_obsolete.treetop
+++ /dev/null
@@ -1,241 +0,0 @@
-module Mail
- grammar RFC2822Obsolete
-
- rule obs_qp
- "\\" [\x00-\x7F]
- end
-
- rule obs_text
- LF* CR* (obs_char LF* CR*)*
- end
-
- rule obs_char
- [\x00-\x09] / # %d0-127 except CR and
- [\x0B-\x0C] / # LF
- [\x0E-\x7F]
- end
-
- rule obs_utext
- obs_text
- end
-
- rule obs_phrase
- (word / "." / "@")+
- end
-
- rule obs_phrase_list
- phrase / (phrase? CFWS? "," CFWS?)+ phrase?
- end
-
- rule obs_FWS
- WSP+ (CRLF WSP+)*
- end
-
- rule obs_day_of_week
- CFWS? day_name CFWS?
- end
-
- rule obs_year
- CFWS? (DIGIT DIGIT) CFWS?
- end
-
- rule obs_month
- CFWS month_name CFWS
- end
-
- rule obs_day
- CFWS? (DIGIT / (DIGIT DIGIT)) CFWS?
- end
-
- rule obs_hour
- CFWS? (DIGIT DIGIT) CFWS?
- end
-
- rule obs_minute
- CFWS? (DIGIT DIGIT) CFWS?
- end
-
- rule obs_second
- CFWS? (DIGIT DIGIT) CFWS?
- end
-
- rule obs_zone
- "UT" / "GMT" / # Universal Time
- # North American UT
- # offsets
- "EST" / "EDT" / # Eastern: - 5/ - 4
- "CST" / "CDT" / # Central: - 6/ - 5
- "MST" / "MDT" / # Mountain: - 7/ - 6
- "PST" / "PDT" / # Pacific: - 8/ - 7
- #
- [\x41-\x49] / # Military zones - "A"
- [\x4B-\x5A] / # through "I" and "K"
- [\x61-\x69] / # through "Z", both
- [\x6B-\x7A] # upper and lower case
- end
-
- rule obs_angle_addr
- CFWS? "<" obs_route? addr_spec ">" CFWS?
- end
-
- rule obs_route
- CFWS? obs_domain_list ":" CFWS?
- end
-
- rule obs_domain_list
- "@" domain (("," )* CFWS? "@" domain)*
- end
-
- rule obs_local_part
- word ("." word)*
- end
-
- rule obs_domain
- atom ("." atom)*
- end
-
- rule obs_mbox_list
- (mailbox? CFWS? "," CFWS?)+ mailbox?
- end
-
- rule obs_addr_list
- (address? CFWS? "," CFWS?)+ address?
- end
-
- rule obs_fields
- (obs_return /
- obs_received /
- obs_orig_date /
- obs_from /
- obs_sender /
- obs_reply_to /
- obs_to /
- obs_cc /
- obs_bcc /
- obs_message_id /
- obs_in_reply_to /
- obs_references /
- obs_subject /
- obs_comments /
- obs_keywords /
- obs_resent_date /
- obs_resent_from /
- obs_resent_send /
- obs_resent_rply /
- obs_resent_to /
- obs_resent_cc /
- obs_resent_bcc /
- obs_resent_mid /
- obs_optional)*
- end
-
- rule obs_orig_date
- "Date" WSP* ":" date_time CRLF
- end
-
- rule obs_from
- "From" WSP* ":" mailbox_list CRLF
- end
-
- rule obs_sender
- "Sender" WSP* ":" mailbox CRLF
- end
-
- rule obs_reply_to
- "Reply-To" WSP* ":" mailbox_list CRLF
- end
-
-
- rule obs_to
- "To" WSP* ":" address_list CRLF
- end
-
- rule obs_cc
- "Cc" WSP* ":" address_list CRLF
- end
-
- rule obs_bcc
- "Bcc" WSP* ":" (address_list / CFWS?) CRLF
- end
-
- rule obs_message_id
- "Message-ID" WSP* ":" msg_id CRLF
- end
-
- rule obs_in_reply_to
- "In-Reply-To" WSP* ":" (phrase / msg_id)* CRLF
- end
-
- rule obs_references
- "References" WSP* ":" (phrase / msg_id)* CRLF
- end
-
- rule obs_id_left
- local_part
- end
-
- rule obs_id_right
- domain
- end
-
- rule obs_subject
- "Subject" WSP* ":" unstructured CRLF
- end
-
- rule obs_comments
- "Comments" WSP* ":" unstructured CRLF
- end
-
- rule obs_keywords
- "Keywords" WSP* ":" obs_phrase_list CRLF
- end
-
- rule obs_resent_from
- "Resent-From" WSP* ":" mailbox_list CRLF
- end
-
- rule obs_resent_send
- "Resent-Sender" WSP* ":" mailbox CRLF
- end
-
- rule obs_resent_date
- "Resent-Date" WSP* ":" date_time CRLF
- end
-
- rule obs_resent_to
- "Resent-To" WSP* ":" address_list CRLF
- end
-
- rule obs_resent_cc
- "Resent-Cc" WSP* ":" address_list CRLF
- end
-
- rule obs_resent_bcc
- "Resent-Bcc" WSP* ":" (address_list / CFWS?) CRLF
- end
-
- rule obs_resent_mid
- "Resent-Message-ID" WSP* ":" msg_id CRLF
- end
-
- rule obs_resent_rply
- "Resent-Reply-To" WSP* ":" address_list CRLF
- end
-
- rule obs_return
- "Return-Path" WSP* ":" path CRLF
- end
-
- rule obs_received
- "Received" WSP* ":" name_val_list CRLF
- end
-
- rule obs_path
- obs_angle_addr
- end
-
- rule obs_optional
- field_name WSP* ":" unstructured CRLF
- end
- end
-end
diff --git a/lib/mail/parts_list.rb b/lib/mail/parts_list.rb
index 38c465f..1e777cf 100644
--- a/lib/mail/parts_list.rb
+++ b/lib/mail/parts_list.rb
@@ -31,11 +31,13 @@ module Mail
end
def sort!(order)
- sorted = self.sort do |a, b|
+ # stable sort should be used to maintain the relative order as the parts are added
+ i = 0;
+ sorted = self.sort_by do |a|
# OK, 10000 is arbitrary... if anyone actually wants to explicitly sort 10000 parts of a
# single email message... please show me a use case and I'll put more work into this method,
# in the meantime, it works :)
- get_order_value(a, order) <=> get_order_value(b, order)
+ [get_order_value(a, order), i += 1]
end
self.clear
sorted.each { |p| self << p }
@@ -44,7 +46,7 @@ module Mail
private
def get_order_value(part, order)
- if part.respond_to?(:content_type)
+ if part.respond_to?(:content_type) && !part[:content_type].nil?
order.index(part[:content_type].string.downcase) || 10000
else
10000
diff --git a/lib/mail/patterns.rb b/lib/mail/patterns.rb
index 582fe1a..77fcfc7 100644
--- a/lib/mail/patterns.rb
+++ b/lib/mail/patterns.rb
@@ -20,10 +20,12 @@ module Mail
FWS = /#{CRLF}#{WSP}*/
TEXT = /[#{text}]/ # + obs-text
FIELD_NAME = /[#{field_name}]+/
- FIELD_BODY = /.+/
+ FIELD_PREFIX = /\A(#{FIELD_NAME})/
+ FIELD_BODY = /.+/m
FIELD_LINE = /^[#{field_name}]+:\s*.+$/
FIELD_SPLIT = /^(#{FIELD_NAME})\s*:\s*(#{FIELD_BODY})?$/
HEADER_LINE = /^([#{field_name}]+:\s*.+)$/
+ HEADER_SPLIT = /#{CRLF}(?!#{WSP})/
QP_UNSAFE = /[^#{qp_safe}]/
QP_SAFE = /[#{qp_safe}]/
diff --git a/lib/mail/utilities.rb b/lib/mail/utilities.rb
index 2cb6ef0..236723a 100644
--- a/lib/mail/utilities.rb
+++ b/lib/mail/utilities.rb
@@ -2,26 +2,28 @@
module Mail
module Utilities
include Patterns
-
+
# Returns true if the string supplied is free from characters not allowed as an ATOM
def atom_safe?( str )
not ATOM_UNSAFE === str
end
- # If the string supplied has ATOM unsafe characters in it, will return the string quoted
+ # If the string supplied has ATOM unsafe characters in it, will return the string quoted
# in double quotes, otherwise returns the string unmodified
def quote_atom( str )
atom_safe?( str ) ? str : dquote(str)
end
- # If the string supplied has PHRASE unsafe characters in it, will return the string quoted
+ # If the string supplied has PHRASE unsafe characters in it, will return the string quoted
# in double quotes, otherwise returns the string unmodified
def quote_phrase( str )
if RUBY_VERSION >= '1.9'
original_encoding = str.encoding
str.force_encoding('ASCII-8BIT')
if (PHRASE_UNSAFE === str)
- dquote(str).force_encoding(original_encoding)
+ quoted_str = dquote(str).force_encoding(original_encoding)
+ str.force_encoding(original_encoding)
+ quoted_str
else
str.force_encoding(original_encoding)
end
@@ -35,7 +37,7 @@ module Mail
not TOKEN_UNSAFE === str
end
- # If the string supplied has TOKEN unsafe characters in it, will return the string quoted
+ # If the string supplied has TOKEN unsafe characters in it, will return the string quoted
# in double quotes, otherwise returns the string unmodified
def quote_token( str )
token_safe?( str ) ? str : dquote(str)
@@ -72,106 +74,106 @@ module Mail
str
end
end
-
+
# Wraps a string in parenthesis and escapes any that are in the string itself.
- #
+ #
# Example:
- #
+ #
# paren( 'This is a string' ) #=> '(This is a string)'
def paren( str )
RubyVer.paren( str )
end
-
+
# Unwraps a string from being wrapped in parenthesis
- #
+ #
# Example:
- #
+ #
# str = '(This is a string)'
# unparen( str ) #=> 'This is a string'
def unparen( str )
match = str.match(/^\((.*?)\)$/)
match ? match[1] : str
end
-
+
# Wraps a string in angle brackets and escapes any that are in the string itself
- #
+ #
# Example:
- #
+ #
# bracket( 'This is a string' ) #=> '<This is a string>'
def bracket( str )
RubyVer.bracket( str )
end
-
+
# Unwraps a string from being wrapped in parenthesis
- #
+ #
# Example:
- #
+ #
# str = '<This is a string>'
# unbracket( str ) #=> 'This is a string'
def unbracket( str )
match = str.match(/^\<(.*?)\>$/)
match ? match[1] : str
end
-
+
# Escape parenthesies in a string
- #
+ #
# Example:
- #
+ #
# str = 'This is (a) string'
# escape_paren( str ) #=> 'This is \(a\) string'
def escape_paren( str )
RubyVer.escape_paren( str )
end
-
+
def uri_escape( str )
uri_parser.escape(str)
end
-
+
def uri_unescape( str )
uri_parser.unescape(str)
end
-
+
def uri_parser
@uri_parser ||= URI.const_defined?(:Parser) ? URI::Parser.new : URI
end
-
+
# Matches two objects with their to_s values case insensitively
- #
+ #
# Example:
- #
+ #
# obj2 = "This_is_An_object"
# obj1 = :this_IS_an_object
# match_to_s( obj1, obj2 ) #=> true
def match_to_s( obj1, obj2 )
obj1.to_s.casecmp(obj2.to_s) == 0
end
-
+
# Capitalizes a string that is joined by hyphens correctly.
- #
+ #
# Example:
- #
+ #
# string = 'resent-from-field'
# capitalize_field( string ) #=> 'Resent-From-Field'
def capitalize_field( str )
str.to_s.split("-").map { |v| v.capitalize }.join("-")
end
-
+
# Takes an underscored word and turns it into a class name
- #
+ #
# Example:
- #
+ #
# constantize("hello") #=> "Hello"
# constantize("hello-there") #=> "HelloThere"
# constantize("hello-there-mate") #=> "HelloThereMate"
def constantize( str )
str.to_s.split(/[-_]/).map { |v| v.capitalize }.to_s
end
-
+
# Swaps out all underscores (_) for hyphens (-) good for stringing from symbols
# a field name.
- #
+ #
# Example:
- #
+ #
# string = :resent_from_field
# dasherize ( string ) #=> 'resent_from_field'
def dasherize( str )
@@ -180,9 +182,9 @@ module Mail
# Swaps out all hyphens (-) for underscores (_) good for stringing to symbols
# a field name.
- #
+ #
# Example:
- #
+ #
# string = :resent_from_field
# underscoreize ( string ) #=> 'resent_from_field'
def underscoreize( str )
@@ -198,7 +200,7 @@ module Mail
end
results
end
-
+
def map_with_index( enum, &block )
results = []
enum.each_with_index do |token, i|
@@ -206,7 +208,7 @@ module Mail
end
results
end
-
+
else
def map_lines( str, &block )
diff --git a/lib/mail/version.rb b/lib/mail/version.rb
index 2b70bd1..d44ba9d 100644
--- a/lib/mail/version.rb
+++ b/lib/mail/version.rb
@@ -3,7 +3,7 @@ module Mail
module VERSION
version = {}
- File.read(File.join(File.dirname(__FILE__), '../', 'VERSION')).each_line do |line|
+ File.read(File.join(File.dirname(__FILE__), '../', '../', 'VERSION')).each_line do |line|
type, value = line.chomp.split(":")
next if type =~ /^\s+$/ || value =~ /^\s+$/
version[type] = value
diff --git a/lib/mail/version_specific/ruby_1_8.rb b/lib/mail/version_specific/ruby_1_8.rb
index e5819b8..43f7145 100644
--- a/lib/mail/version_specific/ruby_1_8.rb
+++ b/lib/mail/version_specific/ruby_1_8.rb
@@ -105,7 +105,7 @@ module Mail
def Ruby18.fix_encoding(encoding)
case encoding.upcase
- when 'UTF8'
+ when 'UTF8', 'UTF_8'
'UTF-8'
when 'UTF16', 'UTF-16'
'UTF-16BE'
diff --git a/lib/mail/version_specific/ruby_1_9.rb b/lib/mail/version_specific/ruby_1_9.rb
index 525cfb6..4d012e0 100644
--- a/lib/mail/version_specific/ruby_1_9.rb
+++ b/lib/mail/version_specific/ruby_1_9.rb
@@ -73,6 +73,9 @@ module Mail
string = string.sub(/\=$/, '')
str = Encodings::QuotedPrintable.decode(string)
str.force_encoding(pick_encoding(charset))
+ # We assume that binary strings hold utf-8 directly to work around
+ # jruby/jruby#829 which subtly changes String#encode semantics.
+ str.force_encoding('utf-8') if str.encoding == Encoding::ASCII_8BIT
end
decoded = str.encode("utf-8", :invalid => :replace, :replace => "")
decoded.valid_encoding? ? decoded : decoded.encode("utf-16le", :invalid => :replace, :replace => "").encode("utf-8")
@@ -105,6 +108,10 @@ module Mail
def Ruby19.pick_encoding(charset)
case charset
+ # ISO-8859-8-I etc. http://en.wikipedia.org/wiki/ISO-8859-8-I
+ when /^iso-?8859-(\d+)(-i)?$/i
+ "ISO-8859-#{$1}"
+
# ISO-8859-15, ISO-2022-JP and alike
when /iso-?(\d{4})-?(\w{1,2})/i
"ISO-#{$1}-#{$2}"
@@ -114,7 +121,7 @@ module Mail
"ISO-#{$1}-#{$2}-#{$3}"
# UTF-8, UTF-32BE and alike
- when /utf-?(\d{1,2})?(\w{1,2})/i
+ when /utf[\-_]?(\d{1,2})?(\w{1,2})/i
"UTF-#{$1}#{$2}".gsub(/\A(UTF-(?:16|32))\z/, '\\1BE')
# Windows-1252 and alike
@@ -124,6 +131,14 @@ module Mail
when /^8bit$/
Encoding::ASCII_8BIT
+ # alternatives/misspellings of us-ascii seen in the wild
+ when /^iso-?646(-us)?$/i, /us=ascii/i
+ Encoding::ASCII
+
+ # Microsoft-specific alias for MACROMAN
+ when /^macintosh$/i
+ Encoding::MACROMAN
+
# Microsoft-specific alias for CP949 (Korean)
when 'ks_c_5601-1987'
Encoding::CP949
diff --git a/lib/tasks/treetop.rake b/lib/tasks/treetop.rake
deleted file mode 100644
index be35f08..0000000
--- a/lib/tasks/treetop.rake
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace :treetop do
-
- desc "Pre-generate all the .treetop files into .rb files"
- task :generate do
- Dir.glob(File.expand_path('../../mail/parsers/*.treetop', __FILE__)).each do |filename|
- `bundle exec tt #{filename}`
- end
- end
-
-end
diff --git a/mail.gemspec b/mail.gemspec
index 07c8ff9..5bbc73e 100644
--- a/mail.gemspec
+++ b/mail.gemspec
@@ -15,11 +15,9 @@ Gem::Specification.new do |s|
s.platform = Gem::Platform::RUBY
s.has_rdoc = true
s.extra_rdoc_files = ["README.md", "CONTRIBUTING.md", "CHANGELOG.rdoc", "TODO.rdoc"]
+ s.rdoc_options << '--exclude' << 'lib/mail/values/unicode_tables.dat'
- s.add_dependency('mime-types', "~> 1.16")
- s.add_dependency('treetop', '~> 1.4.8')
- s.add_dependency('jruby-openssl') if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
- s.add_dependency('tlsmail', '~> 0.0.1') if RUBY_VERSION == '1.8.6'
+ s.add_dependency('mime-types', [">= 1.16", "< 3"])
s.add_development_dependency('bundler', '>= 1.0.3')
s.add_development_dependency('rake', '> 0.8.7')
@@ -27,5 +25,5 @@ Gem::Specification.new do |s|
s.add_development_dependency('rdoc')
s.require_path = 'lib'
- s.files = %w(README.md MIT-LICENSE CONTRIBUTING.md CHANGELOG.rdoc Dependencies.txt Gemfile Rakefile TODO.rdoc) + Dir.glob("lib/**/*")
+ s.files = %w(README.md VERSION MIT-LICENSE CONTRIBUTING.md CHANGELOG.rdoc Dependencies.txt Gemfile Rakefile TODO.rdoc) + Dir.glob("lib/**/*")
end
diff --git a/reference/US ASCII Table.txt b/reference/US ASCII Table.txt
deleted file mode 100644
index b8a1217..0000000
--- a/reference/US ASCII Table.txt
+++ /dev/null
@@ -1,130 +0,0 @@
-CHAR HEX DESCRIPTION
-======================================================
- 00 NULL (U+0000)
- 01 START OF HEADING (U+0001)
- 02 START OF TEXT (U+0002)
- 03 END OF TEXT (U+0003)
- 04 END OF TRANSMISSION (U+0004)
- 05 ENQUIRY (U+0005)
- 06 ACKNOWLEDGE (U+0006)
- 07 BELL (U+0007)
- 08 BACKSPACE (U+0008)
- 09 CHARACTER TABULATION (U+0009)
- 0a LINE FEED (LF) (U+000A)
- 0b LINE TABULATION (U+000B)
- 0c FORM FEED (FF) (U+000C)
- 0d CARRIAGE RETURN (CR) (U+000D)
- 0e SHIFT OUT (U+000E)
- 0f SHIFT IN (U+000F)
- 10 DATA LINK ESCAPE (U+0010)
- 11 DEVICE CONTROL ONE (U+0011)
- 12 DEVICE CONTROL TWO (U+0012)
- 13 DEVICE CONTROL THREE (U+0013)
- 14 DEVICE CONTROL FOUR (U+0014)
- 15 NEGATIVE ACKNOWLEDGE (U+0015)
- 16 SYNCHRONOUS IDLE (U+0016)
- 17 END OF TRANSMISSION BLOCK (U+0017)
- 18 CANCEL (U+0018)
- 19 END OF MEDIUM (U+0019)
- 1a SUBSTITUTE (U+001A)
- 1b ESCAPE (U+001B)
- 1c INFORMATION SEPARATOR FOUR (U+001C)
- 1d INFORMATION SEPARATOR THREE (U+001D)
- 1e INFORMATION SEPARATOR TWO (U+001E)
- 1f INFORMATION SEPARATOR ONE (U+001F)
- 20 SPACE (U+0020)
-! 21 EXCLAMATION MARK (U+0021)
-" 22 QUOTATION MARK (U+0022)
-# 23 NUMBER SIGN (U+0023)
-$ 24 DOLLAR SIGN (U+0024)
-% 25 PERCENT SIGN (U+0025)
-& 26 AMPERSAND (U+0026)
-' 27 APOSTROPHE (U+0027)
-( 28 LEFT PARENTHESIS (U+0028)
-) 29 RIGHT PARENTHESIS (U+0029)
-* 2a ASTERISK (U+002A)
-+ 2b PLUS SIGN (U+002B)
-, 2c COMMA (U+002C)
-- 2d HYPHEN-MINUS (U+002D)
-. 2e FULL STOP (U+002E)
-/ 2f SOLIDUS (U+002F)
-0 30 DIGIT ZERO (U+0030)
-1 31 DIGIT ONE (U+0031)
-2 32 DIGIT TWO (U+0032)
-3 33 DIGIT THREE (U+0033)
-4 34 DIGIT FOUR (U+0034)
-5 35 DIGIT FIVE (U+0035)
-6 36 DIGIT SIX (U+0036)
-7 37 DIGIT SEVEN (U+0037)
-8 38 DIGIT EIGHT (U+0038)
-9 39 DIGIT NINE (U+0039)
-: 3a COLON (U+003A)
-; 3b SEMICOLON (U+003B)
-< 3c LESS-THAN SIGN (U+003C)
-= 3d EQUALS SIGN (U+003D)
-> 3e GREATER-THAN SIGN (U+003E)
-? 3f QUESTION MARK (U+003F)
-@ 40 COMMERCIAL AT (U+0040)
-A 41 LATIN CAPITAL LETTER A (U+0041)
-B 42 LATIN CAPITAL LETTER B (U+0042)
-C 43 LATIN CAPITAL LETTER C (U+0043)
-D 44 LATIN CAPITAL LETTER D (U+0044)
-E 45 LATIN CAPITAL LETTER E (U+0045)
-F 46 LATIN CAPITAL LETTER F (U+0046)
-G 47 LATIN CAPITAL LETTER G (U+0047)
-H 48 LATIN CAPITAL LETTER H (U+0048)
-I 49 LATIN CAPITAL LETTER I (U+0049)
-J 4a LATIN CAPITAL LETTER J (U+004A)
-K 4b LATIN CAPITAL LETTER K (U+004B)
-L 4c LATIN CAPITAL LETTER L (U+004C)
-M 4d LATIN CAPITAL LETTER M (U+004D)
-N 4e LATIN CAPITAL LETTER N (U+004E)
-O 4f LATIN CAPITAL LETTER O (U+004F)
-P 50 LATIN CAPITAL LETTER P (U+0050)
-Q 51 LATIN CAPITAL LETTER Q (U+0051)
-R 52 LATIN CAPITAL LETTER R (U+0052)
-S 53 LATIN CAPITAL LETTER S (U+0053)
-T 54 LATIN CAPITAL LETTER T (U+0054)
-U 55 LATIN CAPITAL LETTER U (U+0055)
-V 56 LATIN CAPITAL LETTER V (U+0056)
-W 57 LATIN CAPITAL LETTER W (U+0057)
-X 58 LATIN CAPITAL LETTER X (U+0058)
-Y 59 LATIN CAPITAL LETTER Y (U+0059)
-Z 5a LATIN CAPITAL LETTER Z (U+005A)
-[ 5b LEFT SQUARE BRACKET (U+005B)
-\ 5c REVERSE SOLIDUS (U+005C)
-] 5d RIGHT SQUARE BRACKET (U+005D)
-^ 5e CIRCUMFLEX ACCENT (U+005E)
-_ 5f LOW LINE (U+005F)
-` 60 GRAVE ACCENT (U+0060)
-a 61 LATIN SMALL LETTER A (U+0061)
-b 62 LATIN SMALL LETTER B (U+0062)
-c 63 LATIN SMALL LETTER C (U+0063)
-d 64 LATIN SMALL LETTER D (U+0064)
-e 65 LATIN SMALL LETTER E (U+0065)
-f 66 LATIN SMALL LETTER F (U+0066)
-g 67 LATIN SMALL LETTER G (U+0067)
-h 68 LATIN SMALL LETTER H (U+0068)
-i 69 LATIN SMALL LETTER I (U+0069)
-j 6a LATIN SMALL LETTER J (U+006A)
-k 6b LATIN SMALL LETTER K (U+006B)
-l 6c LATIN SMALL LETTER L (U+006C)
-m 6d LATIN SMALL LETTER M (U+006D)
-n 6e LATIN SMALL LETTER N (U+006E)
-o 6f LATIN SMALL LETTER O (U+006F)
-p 70 LATIN SMALL LETTER P (U+0070)
-q 71 LATIN SMALL LETTER Q (U+0071)
-r 72 LATIN SMALL LETTER R (U+0072)
-s 73 LATIN SMALL LETTER S (U+0073)
-t 74 LATIN SMALL LETTER T (U+0074)
-u 75 LATIN SMALL LETTER U (U+0075)
-v 76 LATIN SMALL LETTER V (U+0076)
-w 77 LATIN SMALL LETTER W (U+0077)
-x 78 LATIN SMALL LETTER X (U+0078)
-y 79 LATIN SMALL LETTER Y (U+0079)
-z 7a LATIN SMALL LETTER Z (U+007A)
-{ 7b LEFT CURLY BRACKET (U+007B)
-| 7c VERTICAL LINE (U+007C)
-} 7d RIGHT CURLY BRACKET (U+007D)
-~ 7e TILDE (U+007E)
- 7f DELETE (U+007F)
\ No newline at end of file
diff --git a/reference/rfc1035 Domain Implementation and Specification.txt b/reference/rfc1035 Domain Implementation and Specification.txt
deleted file mode 100644
index c3e9b0d..0000000
--- a/reference/rfc1035 Domain Implementation and Specification.txt
+++ /dev/null
@@ -1,3083 +0,0 @@
-Updated by: 1101, 1183, 1348, 1876, 1982, 1995, STANDARD
- 1996, 2065, 2136, 2137, 2181, 2308,
- 2535, 2845, 3425, 3658, 4033, 4034,
- 4035, 4343 Errata
-Network Working Group P. Mockapetris
-Request for Comments: 1035 ISI
- November 1987
-Obsoletes: RFCs 882, 883, 973
-
- DOMAIN NAMES - IMPLEMENTATION AND SPECIFICATION
-
-
-1. STATUS OF THIS MEMO
-
-This RFC describes the details of the domain system and protocol, and
-assumes that the reader is familiar with the concepts discussed in a
-companion RFC, "Domain Names - Concepts and Facilities" [RFC-1034].
-
-The domain system is a mixture of functions and data types which are an
-official protocol and functions and data types which are still
-experimental. Since the domain system is intentionally extensible, new
-data types and experimental behavior should always be expected in parts
-of the system beyond the official protocol. The official protocol parts
-include standard queries, responses and the Internet class RR data
-formats (e.g., host addresses). Since the previous RFC set, several
-definitions have changed, so some previous definitions are obsolete.
-
-Experimental or obsolete features are clearly marked in these RFCs, and
-such information should be used with caution.
-
-The reader is especially cautioned not to depend on the values which
-appear in examples to be current or complete, since their purpose is
-primarily pedagogical. Distribution of this memo is unlimited.
-
- Table of Contents
-
- 1. STATUS OF THIS MEMO 1
- 2. INTRODUCTION 3
- 2.1. Overview 3
- 2.2. Common configurations 4
- 2.3. Conventions 7
- 2.3.1. Preferred name syntax 7
- 2.3.2. Data Transmission Order 8
- 2.3.3. Character Case 9
- 2.3.4. Size limits 10
- 3. DOMAIN NAME SPACE AND RR DEFINITIONS 10
- 3.1. Name space definitions 10
- 3.2. RR definitions 11
- 3.2.1. Format 11
- 3.2.2. TYPE values 12
- 3.2.3. QTYPE values 12
- 3.2.4. CLASS values 13
-
-
-
-Mockapetris [Page 1]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
- 3.2.5. QCLASS values 13
- 3.3. Standard RRs 13
- 3.3.1. CNAME RDATA format 14
- 3.3.2. HINFO RDATA format 14
- 3.3.3. MB RDATA format (EXPERIMENTAL) 14
- 3.3.4. MD RDATA format (Obsolete) 15
- 3.3.5. MF RDATA format (Obsolete) 15
- 3.3.6. MG RDATA format (EXPERIMENTAL) 16
- 3.3.7. MINFO RDATA format (EXPERIMENTAL) 16
- 3.3.8. MR RDATA format (EXPERIMENTAL) 17
- 3.3.9. MX RDATA format 17
- 3.3.10. NULL RDATA format (EXPERIMENTAL) 17
- 3.3.11. NS RDATA format 18
- 3.3.12. PTR RDATA format 18
- 3.3.13. SOA RDATA format 19
- 3.3.14. TXT RDATA format 20
- 3.4. ARPA Internet specific RRs 20
- 3.4.1. A RDATA format 20
- 3.4.2. WKS RDATA format 21
- 3.5. IN-ADDR.ARPA domain 22
- 3.6. Defining new types, classes, and special namespaces 24
- 4. MESSAGES 25
- 4.1. Format 25
- 4.1.1. Header section format 26
- 4.1.2. Question section format 28
- 4.1.3. Resource record format 29
- 4.1.4. Message compression 30
- 4.2. Transport 32
- 4.2.1. UDP usage 32
- 4.2.2. TCP usage 32
- 5. MASTER FILES 33
- 5.1. Format 33
- 5.2. Use of master files to define zones 35
- 5.3. Master file example 36
- 6. NAME SERVER IMPLEMENTATION 37
- 6.1. Architecture 37
- 6.1.1. Control 37
- 6.1.2. Database 37
- 6.1.3. Time 39
- 6.2. Standard query processing 39
- 6.3. Zone refresh and reload processing 39
- 6.4. Inverse queries (Optional) 40
- 6.4.1. The contents of inverse queries and responses 40
- 6.4.2. Inverse query and response example 41
- 6.4.3. Inverse query processing 42
-
-
-
-
-
-
-Mockapetris [Page 2]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
- 6.5. Completion queries and responses 42
- 7. RESOLVER IMPLEMENTATION 43
- 7.1. Transforming a user request into a query 43
- 7.2. Sending the queries 44
- 7.3. Processing responses 46
- 7.4. Using the cache 47
- 8. MAIL SUPPORT 47
- 8.1. Mail exchange binding 48
- 8.2. Mailbox binding (Experimental) 48
- 9. REFERENCES and BIBLIOGRAPHY 50
- Index 54
-
-2. INTRODUCTION
-
-2.1. Overview
-
-The goal of domain names is to provide a mechanism for naming resources
-in such a way that the names are usable in different hosts, networks,
-protocol families, internets, and administrative organizations.
-
-From the user's point of view, domain names are useful as arguments to a
-local agent, called a resolver, which retrieves information associated
-with the domain name. Thus a user might ask for the host address or
-mail information associated with a particular domain name. To enable
-the user to request a particular type of information, an appropriate
-query type is passed to the resolver with the domain name. To the user,
-the domain tree is a single information space; the resolver is
-responsible for hiding the distribution of data among name servers from
-the user.
-
-From the resolver's point of view, the database that makes up the domain
-space is distributed among various name servers. Different parts of the
-domain space are stored in different name servers, although a particular
-data item will be stored redundantly in two or more name servers. The
-resolver starts with knowledge of at least one name server. When the
-resolver processes a user query it asks a known name server for the
-information; in return, the resolver either receives the desired
-information or a referral to another name server. Using these
-referrals, resolvers learn the identities and contents of other name
-servers. Resolvers are responsible for dealing with the distribution of
-the domain space and dealing with the effects of name server failure by
-consulting redundant databases in other servers.
-
-Name servers manage two kinds of data. The first kind of data held in
-sets called zones; each zone is the complete database for a particular
-"pruned" subtree of the domain space. This data is called
-authoritative. A name server periodically checks to make sure that its
-zones are up to date, and if not, obtains a new copy of updated zones
-
-
-
-Mockapetris [Page 3]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-from master files stored locally or in another name server. The second
-kind of data is cached data which was acquired by a local resolver.
-This data may be incomplete, but improves the performance of the
-retrieval process when non-local data is repeatedly accessed. Cached
-data is eventually discarded by a timeout mechanism.
-
-This functional structure isolates the problems of user interface,
-failure recovery, and distribution in the resolvers and isolates the
-database update and refresh problems in the name servers.
-
-2.2. Common configurations
-
-A host can participate in the domain name system in a number of ways,
-depending on whether the host runs programs that retrieve information
-from the domain system, name servers that answer queries from other
-hosts, or various combinations of both functions. The simplest, and
-perhaps most typical, configuration is shown below:
-
- Local Host | Foreign
- |
- +---------+ +----------+ | +--------+
- | | user queries | |queries | | |
- | User |-------------->| |---------|->|Foreign |
- | Program | | Resolver | | | Name |
- | |<--------------| |<--------|--| Server |
- | | user responses| |responses| | |
- +---------+ +----------+ | +--------+
- | A |
- cache additions | | references |
- V | |
- +----------+ |
- | cache | |
- +----------+ |
-
-User programs interact with the domain name space through resolvers; the
-format of user queries and user responses is specific to the host and
-its operating system. User queries will typically be operating system
-calls, and the resolver and its cache will be part of the host operating
-system. Less capable hosts may choose to implement the resolver as a
-subroutine to be linked in with every program that needs its services.
-Resolvers answer user queries with information they acquire via queries
-to foreign name servers and the local cache.
-
-Note that the resolver may have to make several queries to several
-different foreign name servers to answer a particular user query, and
-hence the resolution of a user query may involve several network
-accesses and an arbitrary amount of time. The queries to foreign name
-servers and the corresponding responses have a standard format described
-
-
-
-Mockapetris [Page 4]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-in this memo, and may be datagrams.
-
-Depending on its capabilities, a name server could be a stand alone
-program on a dedicated machine or a process or processes on a large
-timeshared host. A simple configuration might be:
-
- Local Host | Foreign
- |
- +---------+ |
- / /| |
- +---------+ | +----------+ | +--------+
- | | | | |responses| | |
- | | | | Name |---------|->|Foreign |
- | Master |-------------->| Server | | |Resolver|
- | files | | | |<--------|--| |
- | |/ | | queries | +--------+
- +---------+ +----------+ |
-
-Here a primary name server acquires information about one or more zones
-by reading master files from its local file system, and answers queries
-about those zones that arrive from foreign resolvers.
-
-The DNS requires that all zones be redundantly supported by more than
-one name server. Designated secondary servers can acquire zones and
-check for updates from the primary server using the zone transfer
-protocol of the DNS. This configuration is shown below:
-
- Local Host | Foreign
- |
- +---------+ |
- / /| |
- +---------+ | +----------+ | +--------+
- | | | | |responses| | |
- | | | | Name |---------|->|Foreign |
- | Master |-------------->| Server | | |Resolver|
- | files | | | |<--------|--| |
- | |/ | | queries | +--------+
- +---------+ +----------+ |
- A |maintenance | +--------+
- | +------------|->| |
- | queries | |Foreign |
- | | | Name |
- +------------------|--| Server |
- maintenance responses | +--------+
-
-In this configuration, the name server periodically establishes a
-virtual circuit to a foreign name server to acquire a copy of a zone or
-to check that an existing copy has not changed. The messages sent for
-
-
-
-Mockapetris [Page 5]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-these maintenance activities follow the same form as queries and
-responses, but the message sequences are somewhat different.
-
-The information flow in a host that supports all aspects of the domain
-name system is shown below:
-
- Local Host | Foreign
- |
- +---------+ +----------+ | +--------+
- | | user queries | |queries | | |
- | User |-------------->| |---------|->|Foreign |
- | Program | | Resolver | | | Name |
- | |<--------------| |<--------|--| Server |
- | | user responses| |responses| | |
- +---------+ +----------+ | +--------+
- | A |
- cache additions | | references |
- V | |
- +----------+ |
- | Shared | |
- | database | |
- +----------+ |
- A | |
- +---------+ refreshes | | references |
- / /| | V |
- +---------+ | +----------+ | +--------+
- | | | | |responses| | |
- | | | | Name |---------|->|Foreign |
- | Master |-------------->| Server | | |Resolver|
- | files | | | |<--------|--| |
- | |/ | | queries | +--------+
- +---------+ +----------+ |
- A |maintenance | +--------+
- | +------------|->| |
- | queries | |Foreign |
- | | | Name |
- +------------------|--| Server |
- maintenance responses | +--------+
-
-The shared database holds domain space data for the local name server
-and resolver. The contents of the shared database will typically be a
-mixture of authoritative data maintained by the periodic refresh
-operations of the name server and cached data from previous resolver
-requests. The structure of the domain data and the necessity for
-synchronization between name servers and resolvers imply the general
-characteristics of this database, but the actual format is up to the
-local implementor.
-
-
-
-
-Mockapetris [Page 6]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-Information flow can also be tailored so that a group of hosts act
-together to optimize activities. Sometimes this is done to offload less
-capable hosts so that they do not have to implement a full resolver.
-This can be appropriate for PCs or hosts which want to minimize the
-amount of new network code which is required. This scheme can also
-allow a group of hosts can share a small number of caches rather than
-maintaining a large number of separate caches, on the premise that the
-centralized caches will have a higher hit ratio. In either case,
-resolvers are replaced with stub resolvers which act as front ends to
-resolvers located in a recursive server in one or more name servers
-known to perform that service:
-
- Local Hosts | Foreign
- |
- +---------+ |
- | | responses |
- | Stub |<--------------------+ |
- | Resolver| | |
- | |----------------+ | |
- +---------+ recursive | | |
- queries | | |
- V | |
- +---------+ recursive +----------+ | +--------+
- | | queries | |queries | | |
- | Stub |-------------->| Recursive|---------|->|Foreign |
- | Resolver| | Server | | | Name |
- | |<--------------| |<--------|--| Server |
- +---------+ responses | |responses| | |
- +----------+ | +--------+
- | Central | |
- | cache | |
- +----------+ |
-
-In any case, note that domain components are always replicated for
-reliability whenever possible.
-
-2.3. Conventions
-
-The domain system has several conventions dealing with low-level, but
-fundamental, issues. While the implementor is free to violate these
-conventions WITHIN HIS OWN SYSTEM, he must observe these conventions in
-ALL behavior observed from other hosts.
-
-2.3.1. Preferred name syntax
-
-The DNS specifications attempt to be as general as possible in the rules
-for constructing domain names. The idea is that the name of any
-existing object can be expressed as a domain name with minimal changes.
-
-
-
-Mockapetris [Page 7]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-However, when assigning a domain name for an object, the prudent user
-will select a name which satisfies both the rules of the domain system
-and any existing rules for the object, whether these rules are published
-or implied by existing programs.
-
-For example, when naming a mail domain, the user should satisfy both the
-rules of this memo and those in RFC-822. When creating a new host name,
-the old rules for HOSTS.TXT should be followed. This avoids problems
-when old software is converted to use domain names.
-
-The following syntax will result in fewer problems with many
-
-applications that use domain names (e.g., mail, TELNET).
-
-<domain> ::= <subdomain> | " "
-
-<subdomain> ::= <label> | <subdomain> "." <label>
-
-<label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
-
-<ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
-
-<let-dig-hyp> ::= <let-dig> | "-"
-
-<let-dig> ::= <letter> | <digit>
-
-<letter> ::= any one of the 52 alphabetic characters A through Z in
-upper case and a through z in lower case
-
-<digit> ::= any one of the ten digits 0 through 9
-
-Note that while upper and lower case letters are allowed in domain
-names, no significance is attached to the case. That is, two names with
-the same spelling but different case are to be treated as if identical.
-
-The labels must follow the rules for ARPANET host names. They must
-start with a letter, end with a letter or digit, and have as interior
-characters only letters, digits, and hyphen. There are also some
-restrictions on the length. Labels must be 63 characters or less.
-
-For example, the following strings identify hosts in the Internet:
-
-A.ISI.EDU XX.LCS.MIT.EDU SRI-NIC.ARPA
-
-2.3.2. Data Transmission Order
-
-The order of transmission of the header and data described in this
-document is resolved to the octet level. Whenever a diagram shows a
-
-
-
-Mockapetris [Page 8]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-group of octets, the order of transmission of those octets is the normal
-order in which they are read in English. For example, in the following
-diagram, the octets are transmitted in the order they are numbered.
-
- 0 1
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | 1 | 2 |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | 3 | 4 |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | 5 | 6 |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-Whenever an octet represents a numeric quantity, the left most bit in
-the diagram is the high order or most significant bit. That is, the bit
-labeled 0 is the most significant bit. For example, the following
-diagram represents the value 170 (decimal).
-
- 0 1 2 3 4 5 6 7
- +-+-+-+-+-+-+-+-+
- |1 0 1 0 1 0 1 0|
- +-+-+-+-+-+-+-+-+
-
-Similarly, whenever a multi-octet field represents a numeric quantity
-the left most bit of the whole field is the most significant bit. When
-a multi-octet quantity is transmitted the most significant octet is
-transmitted first.
-
-2.3.3. Character Case
-
-For all parts of the DNS that are part of the official protocol, all
-comparisons between character strings (e.g., labels, domain names, etc.)
-are done in a case-insensitive manner. At present, this rule is in
-force throughout the domain system without exception. However, future
-additions beyond current usage may need to use the full binary octet
-capabilities in names, so attempts to store domain names in 7-bit ASCII
-or use of special bytes to terminate labels, etc., should be avoided.
-
-When data enters the domain system, its original case should be
-preserved whenever possible. In certain circumstances this cannot be
-done. For example, if two RRs are stored in a database, one at x.y and
-one at X.Y, they are actually stored at the same place in the database,
-and hence only one casing would be preserved. The basic rule is that
-case can be discarded only when data is used to define structure in a
-database, and two names are identical when compared in a case
-insensitive manner.
-
-
-
-
-Mockapetris [Page 9]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-Loss of case sensitive data must be minimized. Thus while data for x.y
-and X.Y may both be stored under a single location x.y or X.Y, data for
-a.x and B.X would never be stored under A.x, A.X, b.x, or b.X. In
-general, this preserves the case of the first label of a domain name,
-but forces standardization of interior node labels.
-
-Systems administrators who enter data into the domain database should
-take care to represent the data they supply to the domain system in a
-case-consistent manner if their system is case-sensitive. The data
-distribution system in the domain system will ensure that consistent
-representations are preserved.
-
-2.3.4. Size limits
-
-Various objects and parameters in the DNS have size limits. They are
-listed below. Some could be easily changed, others are more
-fundamental.
-
-labels 63 octets or less
-
-names 255 octets or less
-
-TTL positive values of a signed 32 bit number.
-
-UDP messages 512 octets or less
-
-3. DOMAIN NAME SPACE AND RR DEFINITIONS
-
-3.1. Name space definitions
-
-Domain names in messages are expressed in terms of a sequence of labels.
-Each label is represented as a one octet length field followed by that
-number of octets. Since every domain name ends with the null label of
-the root, a domain name is terminated by a length byte of zero. The
-high order two bits of every length octet must be zero, and the
-remaining six bits of the length field limit the label to 63 octets or
-less.
-
-To simplify implementations, the total length of a domain name (i.e.,
-label octets and label length octets) is restricted to 255 octets or
-less.
-
-Although labels can contain any 8 bit values in octets that make up a
-label, it is strongly recommended that labels follow the preferred
-syntax described elsewhere in this memo, which is compatible with
-existing host naming conventions. Name servers and resolvers must
-compare labels in a case-insensitive manner (i.e., A=a), assuming ASCII
-with zero parity. Non-alphabetic codes must match exactly.
-
-
-
-Mockapetris [Page 10]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-3.2. RR definitions
-
-3.2.1. Format
-
-All RRs have the same top level format shown below:
-
- 1 1 1 1 1 1
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | |
- / /
- / NAME /
- | |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | TYPE |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | CLASS |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | TTL |
- | |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | RDLENGTH |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
- / RDATA /
- / /
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
-
-where:
-
-NAME an owner name, i.e., the name of the node to which this
- resource record pertains.
-
-TYPE two octets containing one of the RR TYPE codes.
-
-CLASS two octets containing one of the RR CLASS codes.
-
-TTL a 32 bit signed integer that specifies the time interval
- that the resource record may be cached before the source
- of the information should again be consulted. Zero
- values are interpreted to mean that the RR can only be
- used for the transaction in progress, and should not be
- cached. For example, SOA records are always distributed
- with a zero TTL to prohibit caching. Zero values can
- also be used for extremely volatile data.
-
-RDLENGTH an unsigned 16 bit integer that specifies the length in
- octets of the RDATA field.
-
-
-
-Mockapetris [Page 11]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-RDATA a variable length string of octets that describes the
- resource. The format of this information varies
- according to the TYPE and CLASS of the resource record.
-
-3.2.2. TYPE values
-
-TYPE fields are used in resource records. Note that these types are a
-subset of QTYPEs.
-
-TYPE value and meaning
-
-A 1 a host address
-
-NS 2 an authoritative name server
-
-MD 3 a mail destination (Obsolete - use MX)
-
-MF 4 a mail forwarder (Obsolete - use MX)
-
-CNAME 5 the canonical name for an alias
-
-SOA 6 marks the start of a zone of authority
-
-MB 7 a mailbox domain name (EXPERIMENTAL)
-
-MG 8 a mail group member (EXPERIMENTAL)
-
-MR 9 a mail rename domain name (EXPERIMENTAL)
-
-NULL 10 a null RR (EXPERIMENTAL)
-
-WKS 11 a well known service description
-
-PTR 12 a domain name pointer
-
-HINFO 13 host information
-
-MINFO 14 mailbox or mail list information
-
-MX 15 mail exchange
-
-TXT 16 text strings
-
-3.2.3. QTYPE values
-
-QTYPE fields appear in the question part of a query. QTYPES are a
-superset of TYPEs, hence all TYPEs are valid QTYPEs. In addition, the
-following QTYPEs are defined:
-
-
-
-Mockapetris [Page 12]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-AXFR 252 A request for a transfer of an entire zone
-
-MAILB 253 A request for mailbox-related records (MB, MG or MR)
-
-MAILA 254 A request for mail agent RRs (Obsolete - see MX)
-
-* 255 A request for all records
-
-3.2.4. CLASS values
-
-CLASS fields appear in resource records. The following CLASS mnemonics
-and values are defined:
-
-IN 1 the Internet
-
-CS 2 the CSNET class (Obsolete - used only for examples in
- some obsolete RFCs)
-
-CH 3 the CHAOS class
-
-HS 4 Hesiod [Dyer 87]
-
-3.2.5. QCLASS values
-
-QCLASS fields appear in the question section of a query. QCLASS values
-are a superset of CLASS values; every CLASS is a valid QCLASS. In
-addition to CLASS values, the following QCLASSes are defined:
-
-* 255 any class
-
-3.3. Standard RRs
-
-The following RR definitions are expected to occur, at least
-potentially, in all classes. In particular, NS, SOA, CNAME, and PTR
-will be used in all classes, and have the same format in all classes.
-Because their RDATA format is known, all domain names in the RDATA
-section of these RRs may be compressed.
-
-<domain-name> is a domain name represented as a series of labels, and
-terminated by a label with zero length. <character-string> is a single
-length octet followed by that number of characters. <character-string>
-is treated as binary information, and can be up to 256 characters in
-length (including the length octet).
-
-
-
-
-
-
-
-
-Mockapetris [Page 13]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-3.3.1. CNAME RDATA format
-
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- / CNAME /
- / /
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
-where:
-
-CNAME A <domain-name> which specifies the canonical or primary
- name for the owner. The owner name is an alias.
-
-CNAME RRs cause no additional section processing, but name servers may
-choose to restart the query at the canonical name in certain cases. See
-the description of name server logic in [RFC-1034] for details.
-
-3.3.2. HINFO RDATA format
-
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- / CPU /
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- / OS /
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
-where:
-
-CPU A <character-string> which specifies the CPU type.
-
-OS A <character-string> which specifies the operating
- system type.
-
-Standard values for CPU and OS can be found in [RFC-1010].
-
-HINFO records are used to acquire general information about a host. The
-main use is for protocols such as FTP that can use special procedures
-when talking between machines or operating systems of the same type.
-
-3.3.3. MB RDATA format (EXPERIMENTAL)
-
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- / MADNAME /
- / /
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
-where:
-
-MADNAME A <domain-name> which specifies a host which has the
- specified mailbox.
-
-
-
-Mockapetris [Page 14]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-MB records cause additional section processing which looks up an A type
-RRs corresponding to MADNAME.
-
-3.3.4. MD RDATA format (Obsolete)
-
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- / MADNAME /
- / /
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
-where:
-
-MADNAME A <domain-name> which specifies a host which has a mail
- agent for the domain which should be able to deliver
- mail for the domain.
-
-MD records cause additional section processing which looks up an A type
-record corresponding to MADNAME.
-
-MD is obsolete. See the definition of MX and [RFC-974] for details of
-the new scheme. The recommended policy for dealing with MD RRs found in
-a master file is to reject them, or to convert them to MX RRs with a
-preference of 0.
-
-3.3.5. MF RDATA format (Obsolete)
-
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- / MADNAME /
- / /
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
-where:
-
-MADNAME A <domain-name> which specifies a host which has a mail
- agent for the domain which will accept mail for
- forwarding to the domain.
-
-MF records cause additional section processing which looks up an A type
-record corresponding to MADNAME.
-
-MF is obsolete. See the definition of MX and [RFC-974] for details ofw
-the new scheme. The recommended policy for dealing with MD RRs found in
-a master file is to reject them, or to convert them to MX RRs with a
-preference of 10.
-
-
-
-
-
-
-
-Mockapetris [Page 15]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-3.3.6. MG RDATA format (EXPERIMENTAL)
-
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- / MGMNAME /
- / /
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
-where:
-
-MGMNAME A <domain-name> which specifies a mailbox which is a
- member of the mail group specified by the domain name.
-
-MG records cause no additional section processing.
-
-3.3.7. MINFO RDATA format (EXPERIMENTAL)
-
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- / RMAILBX /
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- / EMAILBX /
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
-where:
-
-RMAILBX A <domain-name> which specifies a mailbox which is
- responsible for the mailing list or mailbox. If this
- domain name names the root, the owner of the MINFO RR is
- responsible for itself. Note that many existing mailing
- lists use a mailbox X-request for the RMAILBX field of
- mailing list X, e.g., Msgroup-request for Msgroup. This
- field provides a more general mechanism.
-
-
-EMAILBX A <domain-name> which specifies a mailbox which is to
- receive error messages related to the mailing list or
- mailbox specified by the owner of the MINFO RR (similar
- to the ERRORS-TO: field which has been proposed). If
- this domain name names the root, errors should be
- returned to the sender of the message.
-
-MINFO records cause no additional section processing. Although these
-records can be associated with a simple mailbox, they are usually used
-with a mailing list.
-
-
-
-
-
-
-
-
-Mockapetris [Page 16]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-3.3.8. MR RDATA format (EXPERIMENTAL)
-
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- / NEWNAME /
- / /
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
-where:
-
-NEWNAME A <domain-name> which specifies a mailbox which is the
- proper rename of the specified mailbox.
-
-MR records cause no additional section processing. The main use for MR
-is as a forwarding entry for a user who has moved to a different
-mailbox.
-
-3.3.9. MX RDATA format
-
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | PREFERENCE |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- / EXCHANGE /
- / /
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
-where:
-
-PREFERENCE A 16 bit integer which specifies the preference given to
- this RR among others at the same owner. Lower values
- are preferred.
-
-EXCHANGE A <domain-name> which specifies a host willing to act as
- a mail exchange for the owner name.
-
-MX records cause type A additional section processing for the host
-specified by EXCHANGE. The use of MX RRs is explained in detail in
-[RFC-974].
-
-3.3.10. NULL RDATA format (EXPERIMENTAL)
-
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- / <anything> /
- / /
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
-Anything at all may be in the RDATA field so long as it is 65535 octets
-or less.
-
-
-
-
-Mockapetris [Page 17]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-NULL records cause no additional section processing. NULL RRs are not
-allowed in master files. NULLs are used as placeholders in some
-experimental extensions of the DNS.
-
-3.3.11. NS RDATA format
-
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- / NSDNAME /
- / /
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
-where:
-
-NSDNAME A <domain-name> which specifies a host which should be
- authoritative for the specified class and domain.
-
-NS records cause both the usual additional section processing to locate
-a type A record, and, when used in a referral, a special search of the
-zone in which they reside for glue information.
-
-The NS RR states that the named host should be expected to have a zone
-starting at owner name of the specified class. Note that the class may
-not indicate the protocol family which should be used to communicate
-with the host, although it is typically a strong hint. For example,
-hosts which are name servers for either Internet (IN) or Hesiod (HS)
-class information are normally queried using IN class protocols.
-
-3.3.12. PTR RDATA format
-
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- / PTRDNAME /
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
-where:
-
-PTRDNAME A <domain-name> which points to some location in the
- domain name space.
-
-PTR records cause no additional section processing. These RRs are used
-in special domains to point to some other location in the domain space.
-These records are simple data, and don't imply any special processing
-similar to that performed by CNAME, which identifies aliases. See the
-description of the IN-ADDR.ARPA domain for an example.
-
-
-
-
-
-
-
-
-Mockapetris [Page 18]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-3.3.13. SOA RDATA format
-
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- / MNAME /
- / /
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- / RNAME /
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | SERIAL |
- | |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | REFRESH |
- | |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | RETRY |
- | |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | EXPIRE |
- | |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | MINIMUM |
- | |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
-where:
-
-MNAME The <domain-name> of the name server that was the
- original or primary source of data for this zone.
-
-RNAME A <domain-name> which specifies the mailbox of the
- person responsible for this zone.
-
-SERIAL The unsigned 32 bit version number of the original copy
- of the zone. Zone transfers preserve this value. This
- value wraps and should be compared using sequence space
- arithmetic.
-
-REFRESH A 32 bit time interval before the zone should be
- refreshed.
-
-RETRY A 32 bit time interval that should elapse before a
- failed refresh should be retried.
-
-EXPIRE A 32 bit time value that specifies the upper limit on
- the time interval that can elapse before the zone is no
- longer authoritative.
-
-
-
-
-
-Mockapetris [Page 19]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-MINIMUM The unsigned 32 bit minimum TTL field that should be
- exported with any RR from this zone.
-
-SOA records cause no additional section processing.
-
-All times are in units of seconds.
-
-Most of these fields are pertinent only for name server maintenance
-operations. However, MINIMUM is used in all query operations that
-retrieve RRs from a zone. Whenever a RR is sent in a response to a
-query, the TTL field is set to the maximum of the TTL field from the RR
-and the MINIMUM field in the appropriate SOA. Thus MINIMUM is a lower
-bound on the TTL field for all RRs in a zone. Note that this use of
-MINIMUM should occur when the RRs are copied into the response and not
-when the zone is loaded from a master file or via a zone transfer. The
-reason for this provison is to allow future dynamic update facilities to
-change the SOA RR with known semantics.
-
-
-3.3.14. TXT RDATA format
-
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- / TXT-DATA /
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
-where:
-
-TXT-DATA One or more <character-string>s.
-
-TXT RRs are used to hold descriptive text. The semantics of the text
-depends on the domain where it is found.
-
-3.4. Internet specific RRs
-
-3.4.1. A RDATA format
-
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | ADDRESS |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
-where:
-
-ADDRESS A 32 bit Internet address.
-
-Hosts that have multiple Internet addresses will have multiple A
-records.
-
-
-
-
-
-Mockapetris [Page 20]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-A records cause no additional section processing. The RDATA section of
-an A line in a master file is an Internet address expressed as four
-decimal numbers separated by dots without any imbedded spaces (e.g.,
-"10.2.0.52" or "192.0.5.6").
-
-3.4.2. WKS RDATA format
-
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | ADDRESS |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | PROTOCOL | |
- +--+--+--+--+--+--+--+--+ |
- | |
- / <BIT MAP> /
- / /
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
-where:
-
-ADDRESS An 32 bit Internet address
-
-PROTOCOL An 8 bit IP protocol number
-
-<BIT MAP> A variable length bit map. The bit map must be a
- multiple of 8 bits long.
-
-The WKS record is used to describe the well known services supported by
-a particular protocol on a particular internet address. The PROTOCOL
-field specifies an IP protocol number, and the bit map has one bit per
-port of the specified protocol. The first bit corresponds to port 0,
-the second to port 1, etc. If the bit map does not include a bit for a
-protocol of interest, that bit is assumed zero. The appropriate values
-and mnemonics for ports and protocols are specified in [RFC-1010].
-
-For example, if PROTOCOL=TCP (6), the 26th bit corresponds to TCP port
-25 (SMTP). If this bit is set, a SMTP server should be listening on TCP
-port 25; if zero, SMTP service is not supported on the specified
-address.
-
-The purpose of WKS RRs is to provide availability information for
-servers for TCP and UDP. If a server supports both TCP and UDP, or has
-multiple Internet addresses, then multiple WKS RRs are used.
-
-WKS RRs cause no additional section processing.
-
-In master files, both ports and protocols are expressed using mnemonics
-or decimal numbers.
-
-
-
-
-Mockapetris [Page 21]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-3.5. IN-ADDR.ARPA domain
-
-The Internet uses a special domain to support gateway location and
-Internet address to host mapping. Other classes may employ a similar
-strategy in other domains. The intent of this domain is to provide a
-guaranteed method to perform host address to host name mapping, and to
-facilitate queries to locate all gateways on a particular network in the
-Internet.
-
-Note that both of these services are similar to functions that could be
-performed by inverse queries; the difference is that this part of the
-domain name space is structured according to address, and hence can
-guarantee that the appropriate data can be located without an exhaustive
-search of the domain space.
-
-The domain begins at IN-ADDR.ARPA and has a substructure which follows
-the Internet addressing structure.
-
-Domain names in the IN-ADDR.ARPA domain are defined to have up to four
-labels in addition to the IN-ADDR.ARPA suffix. Each label represents
-one octet of an Internet address, and is expressed as a character string
-for a decimal value in the range 0-255 (with leading zeros omitted
-except in the case of a zero octet which is represented by a single
-zero).
-
-Host addresses are represented by domain names that have all four labels
-specified. Thus data for Internet address 10.2.0.52 is located at
-domain name 52.0.2.10.IN-ADDR.ARPA. The reversal, though awkward to
-read, allows zones to be delegated which are exactly one network of
-address space. For example, 10.IN-ADDR.ARPA can be a zone containing
-data for the ARPANET, while 26.IN-ADDR.ARPA can be a separate zone for
-MILNET. Address nodes are used to hold pointers to primary host names
-in the normal domain space.
-
-Network numbers correspond to some non-terminal nodes at various depths
-in the IN-ADDR.ARPA domain, since Internet network numbers are either 1,
-2, or 3 octets. Network nodes are used to hold pointers to the primary
-host names of gateways attached to that network. Since a gateway is, by
-definition, on more than one network, it will typically have two or more
-network nodes which point at it. Gateways will also have host level
-pointers at their fully qualified addresses.
-
-Both the gateway pointers at network nodes and the normal host pointers
-at full address nodes use the PTR RR to point back to the primary domain
-names of the corresponding hosts.
-
-For example, the IN-ADDR.ARPA domain will contain information about the
-ISI gateway between net 10 and 26, an MIT gateway from net 10 to MIT's
-
-
-
-Mockapetris [Page 22]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-net 18, and hosts A.ISI.EDU and MULTICS.MIT.EDU. Assuming that ISI
-gateway has addresses 10.2.0.22 and 26.0.0.103, and a name MILNET-
-GW.ISI.EDU, and the MIT gateway has addresses 10.0.0.77 and 18.10.0.4
-and a name GW.LCS.MIT.EDU, the domain database would contain:
-
- 10.IN-ADDR.ARPA. PTR MILNET-GW.ISI.EDU.
- 10.IN-ADDR.ARPA. PTR GW.LCS.MIT.EDU.
- 18.IN-ADDR.ARPA. PTR GW.LCS.MIT.EDU.
- 26.IN-ADDR.ARPA. PTR MILNET-GW.ISI.EDU.
- 22.0.2.10.IN-ADDR.ARPA. PTR MILNET-GW.ISI.EDU.
- 103.0.0.26.IN-ADDR.ARPA. PTR MILNET-GW.ISI.EDU.
- 77.0.0.10.IN-ADDR.ARPA. PTR GW.LCS.MIT.EDU.
- 4.0.10.18.IN-ADDR.ARPA. PTR GW.LCS.MIT.EDU.
- 103.0.3.26.IN-ADDR.ARPA. PTR A.ISI.EDU.
- 6.0.0.10.IN-ADDR.ARPA. PTR MULTICS.MIT.EDU.
-
-Thus a program which wanted to locate gateways on net 10 would originate
-a query of the form QTYPE=PTR, QCLASS=IN, QNAME=10.IN-ADDR.ARPA. It
-would receive two RRs in response:
-
- 10.IN-ADDR.ARPA. PTR MILNET-GW.ISI.EDU.
- 10.IN-ADDR.ARPA. PTR GW.LCS.MIT.EDU.
-
-The program could then originate QTYPE=A, QCLASS=IN queries for MILNET-
-GW.ISI.EDU. and GW.LCS.MIT.EDU. to discover the Internet addresses of
-these gateways.
-
-A resolver which wanted to find the host name corresponding to Internet
-host address 10.0.0.6 would pursue a query of the form QTYPE=PTR,
-QCLASS=IN, QNAME=6.0.0.10.IN-ADDR.ARPA, and would receive:
-
- 6.0.0.10.IN-ADDR.ARPA. PTR MULTICS.MIT.EDU.
-
-Several cautions apply to the use of these services:
- - Since the IN-ADDR.ARPA special domain and the normal domain
- for a particular host or gateway will be in different zones,
- the possibility exists that that the data may be inconsistent.
-
- - Gateways will often have two names in separate domains, only
- one of which can be primary.
-
- - Systems that use the domain database to initialize their
- routing tables must start with enough gateway information to
- guarantee that they can access the appropriate name server.
-
- - The gateway data only reflects the existence of a gateway in a
- manner equivalent to the current HOSTS.TXT file. It doesn't
- replace the dynamic availability information from GGP or EGP.
-
-
-
-Mockapetris [Page 23]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-3.6. Defining new types, classes, and special namespaces
-
-The previously defined types and classes are the ones in use as of the
-date of this memo. New definitions should be expected. This section
-makes some recommendations to designers considering additions to the
-existing facilities. The mailing list NAMEDROPPERS at SRI-NIC.ARPA is the
-forum where general discussion of design issues takes place.
-
-In general, a new type is appropriate when new information is to be
-added to the database about an existing object, or we need new data
-formats for some totally new object. Designers should accept to define
-types and their RDATA formats that are generally applicable to all
-classes, and which avoid duplication of information. New classes are
-appropriate when the DNS is to be used for a new protocol, etc which
-requires new class-specific data formats, or when a copy of the existing
-name space is desired, but a separate management domain is necessary.
-
-New types and classes need mnemonics for master files; the format of the
-master files requires that the mnemonics for type and class be disjoint.
-
-TYPE and CLASS values must be a proper subset of QTYPEs and QCLASSes
-respectively.
-
-The present system uses multiple RRs to represent multiple values of a
-type rather than storing multiple values in the RDATA section of a
-single RR. This is less efficient for most applications, but does keep
-RRs shorter. The multiple RRs assumption is incorporated in some
-experimental work on dynamic update methods.
-
-The present system attempts to minimize the duplication of data in the
-database in order to insure consistency. Thus, in order to find the
-address of the host for a mail exchange, you map the mail domain name to
-a host name, then the host name to addresses, rather than a direct
-mapping to host address. This approach is preferred because it avoids
-the opportunity for inconsistency.
-
-In defining a new type of data, multiple RR types should not be used to
-create an ordering between entries or express different formats for
-equivalent bindings, instead this information should be carried in the
-body of the RR and a single type used. This policy avoids problems with
-caching multiple types and defining QTYPEs to match multiple types.
-
-For example, the original form of mail exchange binding used two RR
-types one to represent a "closer" exchange (MD) and one to represent a
-"less close" exchange (MF). The difficulty is that the presence of one
-RR type in a cache doesn't convey any information about the other
-because the query which acquired the cached information might have used
-a QTYPE of MF, MD, or MAILA (which matched both). The redesigned
-
-
-
-Mockapetris [Page 24]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-service used a single type (MX) with a "preference" value in the RDATA
-section which can order different RRs. However, if any MX RRs are found
-in the cache, then all should be there.
-
-4. MESSAGES
-
-4.1. Format
-
-All communications inside of the domain protocol are carried in a single
-format called a message. The top level format of message is divided
-into 5 sections (some of which are empty in certain cases) shown below:
-
- +---------------------+
- | Header |
- +---------------------+
- | Question | the question for the name server
- +---------------------+
- | Answer | RRs answering the question
- +---------------------+
- | Authority | RRs pointing toward an authority
- +---------------------+
- | Additional | RRs holding additional information
- +---------------------+
-
-The header section is always present. The header includes fields that
-specify which of the remaining sections are present, and also specify
-whether the message is a query or a response, a standard query or some
-other opcode, etc.
-
-The names of the sections after the header are derived from their use in
-standard queries. The question section contains fields that describe a
-question to a name server. These fields are a query type (QTYPE), a
-query class (QCLASS), and a query domain name (QNAME). The last three
-sections have the same format: a possibly empty list of concatenated
-resource records (RRs). The answer section contains RRs that answer the
-question; the authority section contains RRs that point toward an
-authoritative name server; the additional records section contains RRs
-which relate to the query, but are not strictly answers for the
-question.
-
-
-
-
-
-
-
-
-
-
-
-
-Mockapetris [Page 25]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-4.1.1. Header section format
-
-The header contains the following fields:
-
- 1 1 1 1 1 1
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | ID |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- |QR| Opcode |AA|TC|RD|RA| Z | RCODE |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | QDCOUNT |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | ANCOUNT |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | NSCOUNT |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | ARCOUNT |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
-where:
-
-ID A 16 bit identifier assigned by the program that
- generates any kind of query. This identifier is copied
- the corresponding reply and can be used by the requester
- to match up replies to outstanding queries.
-
-QR A one bit field that specifies whether this message is a
- query (0), or a response (1).
-
-OPCODE A four bit field that specifies kind of query in this
- message. This value is set by the originator of a query
- and copied into the response. The values are:
-
- 0 a standard query (QUERY)
-
- 1 an inverse query (IQUERY)
-
- 2 a server status request (STATUS)
-
- 3-15 reserved for future use
-
-AA Authoritative Answer - this bit is valid in responses,
- and specifies that the responding name server is an
- authority for the domain name in question section.
-
- Note that the contents of the answer section may have
- multiple owner names because of aliases. The AA bit
-
-
-
-Mockapetris [Page 26]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
- corresponds to the name which matches the query name, or
- the first owner name in the answer section.
-
-TC TrunCation - specifies that this message was truncated
- due to length greater than that permitted on the
- transmission channel.
-
-RD Recursion Desired - this bit may be set in a query and
- is copied into the response. If RD is set, it directs
- the name server to pursue the query recursively.
- Recursive query support is optional.
-
-RA Recursion Available - this be is set or cleared in a
- response, and denotes whether recursive query support is
- available in the name server.
-
-Z Reserved for future use. Must be zero in all queries
- and responses.
-
-RCODE Response code - this 4 bit field is set as part of
- responses. The values have the following
- interpretation:
-
- 0 No error condition
-
- 1 Format error - The name server was
- unable to interpret the query.
-
- 2 Server failure - The name server was
- unable to process this query due to a
- problem with the name server.
-
- 3 Name Error - Meaningful only for
- responses from an authoritative name
- server, this code signifies that the
- domain name referenced in the query does
- not exist.
-
- 4 Not Implemented - The name server does
- not support the requested kind of query.
-
- 5 Refused - The name server refuses to
- perform the specified operation for
- policy reasons. For example, a name
- server may not wish to provide the
- information to the particular requester,
- or a name server may not wish to perform
- a particular operation (e.g., zone
-
-
-
-Mockapetris [Page 27]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
- transfer) for particular data.
-
- 6-15 Reserved for future use.
-
-QDCOUNT an unsigned 16 bit integer specifying the number of
- entries in the question section.
-
-ANCOUNT an unsigned 16 bit integer specifying the number of
- resource records in the answer section.
-
-NSCOUNT an unsigned 16 bit integer specifying the number of name
- server resource records in the authority records
- section.
-
-ARCOUNT an unsigned 16 bit integer specifying the number of
- resource records in the additional records section.
-
-4.1.2. Question section format
-
-The question section is used to carry the "question" in most queries,
-i.e., the parameters that define what is being asked. The section
-contains QDCOUNT (usually 1) entries, each of the following format:
-
- 1 1 1 1 1 1
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | |
- / QNAME /
- / /
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | QTYPE |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | QCLASS |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
-where:
-
-QNAME a domain name represented as a sequence of labels, where
- each label consists of a length octet followed by that
- number of octets. The domain name terminates with the
- zero length octet for the null label of the root. Note
- that this field may be an odd number of octets; no
- padding is used.
-
-QTYPE a two octet code which specifies the type of the query.
- The values for this field include all codes valid for a
- TYPE field, together with some more general codes which
- can match more than one type of RR.
-
-
-
-Mockapetris [Page 28]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-QCLASS a two octet code that specifies the class of the query.
- For example, the QCLASS field is IN for the Internet.
-
-4.1.3. Resource record format
-
-The answer, authority, and additional sections all share the same
-format: a variable number of resource records, where the number of
-records is specified in the corresponding count field in the header.
-Each resource record has the following format:
- 1 1 1 1 1 1
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | |
- / /
- / NAME /
- | |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | TYPE |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | CLASS |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | TTL |
- | |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | RDLENGTH |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
- / RDATA /
- / /
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
-where:
-
-NAME a domain name to which this resource record pertains.
-
-TYPE two octets containing one of the RR type codes. This
- field specifies the meaning of the data in the RDATA
- field.
-
-CLASS two octets which specify the class of the data in the
- RDATA field.
-
-TTL a 32 bit unsigned integer that specifies the time
- interval (in seconds) that the resource record may be
- cached before it should be discarded. Zero values are
- interpreted to mean that the RR can only be used for the
- transaction in progress, and should not be cached.
-
-
-
-
-
-Mockapetris [Page 29]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-RDLENGTH an unsigned 16 bit integer that specifies the length in
- octets of the RDATA field.
-
-RDATA a variable length string of octets that describes the
- resource. The format of this information varies
- according to the TYPE and CLASS of the resource record.
- For example, the if the TYPE is A and the CLASS is IN,
- the RDATA field is a 4 octet ARPA Internet address.
-
-4.1.4. Message compression
-
-In order to reduce the size of messages, the domain system utilizes a
-compression scheme which eliminates the repetition of domain names in a
-message. In this scheme, an entire domain name or a list of labels at
-the end of a domain name is replaced with a pointer to a prior occurance
-of the same name.
-
-The pointer takes the form of a two octet sequence:
-
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- | 1 1| OFFSET |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
-The first two bits are ones. This allows a pointer to be distinguished
-from a label, since the label must begin with two zero bits because
-labels are restricted to 63 octets or less. (The 10 and 01 combinations
-are reserved for future use.) The OFFSET field specifies an offset from
-the start of the message (i.e., the first octet of the ID field in the
-domain header). A zero offset specifies the first byte of the ID field,
-etc.
-
-The compression scheme allows a domain name in a message to be
-represented as either:
-
- - a sequence of labels ending in a zero octet
-
- - a pointer
-
- - a sequence of labels ending with a pointer
-
-Pointers can only be used for occurances of a domain name where the
-format is not class specific. If this were not the case, a name server
-or resolver would be required to know the format of all RRs it handled.
-As yet, there are no such cases, but they may occur in future RDATA
-formats.
-
-If a domain name is contained in a part of the message subject to a
-length field (such as the RDATA section of an RR), and compression is
-
-
-
-Mockapetris [Page 30]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-used, the length of the compressed name is used in the length
-calculation, rather than the length of the expanded name.
-
-Programs are free to avoid using pointers in messages they generate,
-although this will reduce datagram capacity, and may cause truncation.
-However all programs are required to understand arriving messages that
-contain pointers.
-
-For example, a datagram might need to use the domain names F.ISI.ARPA,
-FOO.F.ISI.ARPA, ARPA, and the root. Ignoring the other fields of the
-message, these domain names might be represented as:
-
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- 20 | 1 | F |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- 22 | 3 | I |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- 24 | S | I |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- 26 | 4 | A |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- 28 | R | P |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- 30 | A | 0 |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- 40 | 3 | F |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- 42 | O | O |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- 44 | 1 1| 20 |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- 64 | 1 1| 26 |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- 92 | 0 | |
- +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
-The domain name for F.ISI.ARPA is shown at offset 20. The domain name
-FOO.F.ISI.ARPA is shown at offset 40; this definition uses a pointer to
-concatenate a label for FOO to the previously defined F.ISI.ARPA. The
-domain name ARPA is defined at offset 64 using a pointer to the ARPA
-component of the name F.ISI.ARPA at 20; note that this pointer relies on
-ARPA being the last label in the string at 20. The root domain name is
-
-
-
-Mockapetris [Page 31]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-defined by a single octet of zeros at 92; the root domain name has no
-labels.
-
-4.2. Transport
-
-The DNS assumes that messages will be transmitted as datagrams or in a
-byte stream carried by a virtual circuit. While virtual circuits can be
-used for any DNS activity, datagrams are preferred for queries due to
-their lower overhead and better performance. Zone refresh activities
-must use virtual circuits because of the need for reliable transfer.
-
-The Internet supports name server access using TCP [RFC-793] on server
-port 53 (decimal) as well as datagram access using UDP [RFC-768] on UDP
-port 53 (decimal).
-
-4.2.1. UDP usage
-
-Messages sent using UDP user server port 53 (decimal).
-
-Messages carried by UDP are restricted to 512 bytes (not counting the IP
-or UDP headers). Longer messages are truncated and the TC bit is set in
-the header.
-
-UDP is not acceptable for zone transfers, but is the recommended method
-for standard queries in the Internet. Queries sent using UDP may be
-lost, and hence a retransmission strategy is required. Queries or their
-responses may be reordered by the network, or by processing in name
-servers, so resolvers should not depend on them being returned in order.
-
-The optimal UDP retransmission policy will vary with performance of the
-Internet and the needs of the client, but the following are recommended:
-
- - The client should try other servers and server addresses
- before repeating a query to a specific address of a server.
-
- - The retransmission interval should be based on prior
- statistics if possible. Too aggressive retransmission can
- easily slow responses for the community at large. Depending
- on how well connected the client is to its expected servers,
- the minimum retransmission interval should be 2-5 seconds.
-
-More suggestions on server selection and retransmission policy can be
-found in the resolver section of this memo.
-
-4.2.2. TCP usage
-
-Messages sent over TCP connections use server port 53 (decimal). The
-message is prefixed with a two byte length field which gives the message
-
-
-
-Mockapetris [Page 32]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-length, excluding the two byte length field. This length field allows
-the low-level processing to assemble a complete message before beginning
-to parse it.
-
-Several connection management policies are recommended:
-
- - The server should not block other activities waiting for TCP
- data.
-
- - The server should support multiple connections.
-
- - The server should assume that the client will initiate
- connection closing, and should delay closing its end of the
- connection until all outstanding client requests have been
- satisfied.
-
- - If the server needs to close a dormant connection to reclaim
- resources, it should wait until the connection has been idle
- for a period on the order of two minutes. In particular, the
- server should allow the SOA and AXFR request sequence (which
- begins a refresh operation) to be made on a single connection.
- Since the server would be unable to answer queries anyway, a
- unilateral close or reset may be used instead of a graceful
- close.
-
-5. MASTER FILES
-
-Master files are text files that contain RRs in text form. Since the
-contents of a zone can be expressed in the form of a list of RRs a
-master file is most often used to define a zone, though it can be used
-to list a cache's contents. Hence, this section first discusses the
-format of RRs in a master file, and then the special considerations when
-a master file is used to create a zone in some name server.
-
-5.1. Format
-
-The format of these files is a sequence of entries. Entries are
-predominantly line-oriented, though parentheses can be used to continue
-a list of items across a line boundary, and text literals can contain
-CRLF within the text. Any combination of tabs and spaces act as a
-delimiter between the separate items that make up an entry. The end of
-any line in the master file can end with a comment. The comment starts
-with a ";" (semicolon).
-
-The following entries are defined:
-
- <blank>[<comment>]
-
-
-
-
-Mockapetris [Page 33]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
- $ORIGIN <domain-name> [<comment>]
-
- $INCLUDE <file-name> [<domain-name>] [<comment>]
-
- <domain-name><rr> [<comment>]
-
- <blank><rr> [<comment>]
-
-Blank lines, with or without comments, are allowed anywhere in the file.
-
-Two control entries are defined: $ORIGIN and $INCLUDE. $ORIGIN is
-followed by a domain name, and resets the current origin for relative
-domain names to the stated name. $INCLUDE inserts the named file into
-the current file, and may optionally specify a domain name that sets the
-relative domain name origin for the included file. $INCLUDE may also
-have a comment. Note that a $INCLUDE entry never changes the relative
-origin of the parent file, regardless of changes to the relative origin
-made within the included file.
-
-The last two forms represent RRs. If an entry for an RR begins with a
-blank, then the RR is assumed to be owned by the last stated owner. If
-an RR entry begins with a <domain-name>, then the owner name is reset.
-
-<rr> contents take one of the following forms:
-
- [<TTL>] [<class>] <type> <RDATA>
-
- [<class>] [<TTL>] <type> <RDATA>
-
-The RR begins with optional TTL and class fields, followed by a type and
-RDATA field appropriate to the type and class. Class and type use the
-standard mnemonics, TTL is a decimal integer. Omitted class and TTL
-values are default to the last explicitly stated values. Since type and
-class mnemonics are disjoint, the parse is unique. (Note that this
-order is different from the order used in examples and the order used in
-the actual RRs; the given order allows easier parsing and defaulting.)
-
-<domain-name>s make up a large share of the data in the master file.
-The labels in the domain name are expressed as character strings and
-separated by dots. Quoting conventions allow arbitrary characters to be
-stored in domain names. Domain names that end in a dot are called
-absolute, and are taken as complete. Domain names which do not end in a
-dot are called relative; the actual domain name is the concatenation of
-the relative part with an origin specified in a $ORIGIN, $INCLUDE, or as
-an argument to the master file loading routine. A relative name is an
-error when no origin is available.
-
-
-
-
-
-Mockapetris [Page 34]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-<character-string> is expressed in one or two ways: as a contiguous set
-of characters without interior spaces, or as a string beginning with a "
-and ending with a ". Inside a " delimited string any character can
-occur, except for a " itself, which must be quoted using \ (back slash).
-
-Because these files are text files several special encodings are
-necessary to allow arbitrary data to be loaded. In particular:
-
- of the root.
-
-@ A free standing @ is used to denote the current origin.
-
-\X where X is any character other than a digit (0-9), is
- used to quote that character so that its special meaning
- does not apply. For example, "\." can be used to place
- a dot character in a label.
-
-\DDD where each D is a digit is the octet corresponding to
- the decimal number described by DDD. The resulting
- octet is assumed to be text and is not checked for
- special meaning.
-
-( ) Parentheses are used to group data that crosses a line
- boundary. In effect, line terminations are not
- recognized within parentheses.
-
-; Semicolon is used to start a comment; the remainder of
- the line is ignored.
-
-5.2. Use of master files to define zones
-
-When a master file is used to load a zone, the operation should be
-suppressed if any errors are encountered in the master file. The
-rationale for this is that a single error can have widespread
-consequences. For example, suppose that the RRs defining a delegation
-have syntax errors; then the server will return authoritative name
-errors for all names in the subzone (except in the case where the
-subzone is also present on the server).
-
-Several other validity checks that should be performed in addition to
-insuring that the file is syntactically correct:
-
- 1. All RRs in the file should have the same class.
-
- 2. Exactly one SOA RR should be present at the top of the zone.
-
- 3. If delegations are present and glue information is required,
- it should be present.
-
-
-
-Mockapetris [Page 35]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
- 4. Information present outside of the authoritative nodes in the
- zone should be glue information, rather than the result of an
- origin or similar error.
-
-5.3. Master file example
-
-The following is an example file which might be used to define the
-ISI.EDU zone.and is loaded with an origin of ISI.EDU:
-
-@ IN SOA VENERA Action\.domains (
- 20 ; SERIAL
- 7200 ; REFRESH
- 600 ; RETRY
- 3600000; EXPIRE
- 60) ; MINIMUM
-
- NS A.ISI.EDU.
- NS VENERA
- NS VAXA
- MX 10 VENERA
- MX 20 VAXA
-
-A A 26.3.0.103
-
-VENERA A 10.1.0.52
- A 128.9.0.32
-
-VAXA A 10.2.0.27
- A 128.9.0.33
-
-
-$INCLUDE <SUBSYS>ISI-MAILBOXES.TXT
-
-Where the file <SUBSYS>ISI-MAILBOXES.TXT is:
-
- MOE MB A.ISI.EDU.
- LARRY MB A.ISI.EDU.
- CURLEY MB A.ISI.EDU.
- STOOGES MG MOE
- MG LARRY
- MG CURLEY
-
-Note the use of the \ character in the SOA RR to specify the responsible
-person mailbox "Action.domains at E.ISI.EDU".
-
-
-
-
-
-
-
-Mockapetris [Page 36]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-6. NAME SERVER IMPLEMENTATION
-
-6.1. Architecture
-
-The optimal structure for the name server will depend on the host
-operating system and whether the name server is integrated with resolver
-operations, either by supporting recursive service, or by sharing its
-database with a resolver. This section discusses implementation
-considerations for a name server which shares a database with a
-resolver, but most of these concerns are present in any name server.
-
-6.1.1. Control
-
-A name server must employ multiple concurrent activities, whether they
-are implemented as separate tasks in the host's OS or multiplexing
-inside a single name server program. It is simply not acceptable for a
-name server to block the service of UDP requests while it waits for TCP
-data for refreshing or query activities. Similarly, a name server
-should not attempt to provide recursive service without processing such
-requests in parallel, though it may choose to serialize requests from a
-single client, or to regard identical requests from the same client as
-duplicates. A name server should not substantially delay requests while
-it reloads a zone from master files or while it incorporates a newly
-refreshed zone into its database.
-
-6.1.2. Database
-
-While name server implementations are free to use any internal data
-structures they choose, the suggested structure consists of three major
-parts:
-
- - A "catalog" data structure which lists the zones available to
- this server, and a "pointer" to the zone data structure. The
- main purpose of this structure is to find the nearest ancestor
- zone, if any, for arriving standard queries.
-
- - Separate data structures for each of the zones held by the
- name server.
-
- - A data structure for cached data. (or perhaps separate caches
- for different classes)
-
-All of these data structures can be implemented an identical tree
-structure format, with different data chained off the nodes in different
-parts: in the catalog the data is pointers to zones, while in the zone
-and cache data structures, the data will be RRs. In designing the tree
-framework the designer should recognize that query processing will need
-to traverse the tree using case-insensitive label comparisons; and that
-
-
-
-Mockapetris [Page 37]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-in real data, a few nodes have a very high branching factor (100-1000 or
-more), but the vast majority have a very low branching factor (0-1).
-
-One way to solve the case problem is to store the labels for each node
-in two pieces: a standardized-case representation of the label where all
-ASCII characters are in a single case, together with a bit mask that
-denotes which characters are actually of a different case. The
-branching factor diversity can be handled using a simple linked list for
-a node until the branching factor exceeds some threshold, and
-transitioning to a hash structure after the threshold is exceeded. In
-any case, hash structures used to store tree sections must insure that
-hash functions and procedures preserve the casing conventions of the
-DNS.
-
-The use of separate structures for the different parts of the database
-is motivated by several factors:
-
- - The catalog structure can be an almost static structure that
- need change only when the system administrator changes the
- zones supported by the server. This structure can also be
- used to store parameters used to control refreshing
- activities.
-
- - The individual data structures for zones allow a zone to be
- replaced simply by changing a pointer in the catalog. Zone
- refresh operations can build a new structure and, when
- complete, splice it into the database via a simple pointer
- replacement. It is very important that when a zone is
- refreshed, queries should not use old and new data
- simultaneously.
-
- - With the proper search procedures, authoritative data in zones
- will always "hide", and hence take precedence over, cached
- data.
-
- - Errors in zone definitions that cause overlapping zones, etc.,
- may cause erroneous responses to queries, but problem
- determination is simplified, and the contents of one "bad"
- zone can't corrupt another.
-
- - Since the cache is most frequently updated, it is most
- vulnerable to corruption during system restarts. It can also
- become full of expired RR data. In either case, it can easily
- be discarded without disturbing zone data.
-
-A major aspect of database design is selecting a structure which allows
-the name server to deal with crashes of the name server's host. State
-information which a name server should save across system crashes
-
-
-
-Mockapetris [Page 38]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-includes the catalog structure (including the state of refreshing for
-each zone) and the zone data itself.
-
-6.1.3. Time
-
-Both the TTL data for RRs and the timing data for refreshing activities
-depends on 32 bit timers in units of seconds. Inside the database,
-refresh timers and TTLs for cached data conceptually "count down", while
-data in the zone stays with constant TTLs.
-
-A recommended implementation strategy is to store time in two ways: as
-a relative increment and as an absolute time. One way to do this is to
-use positive 32 bit numbers for one type and negative numbers for the
-other. The RRs in zones use relative times; the refresh timers and
-cache data use absolute times. Absolute numbers are taken with respect
-to some known origin and converted to relative values when placed in the
-response to a query. When an absolute TTL is negative after conversion
-to relative, then the data is expired and should be ignored.
-
-6.2. Standard query processing
-
-The major algorithm for standard query processing is presented in
-[RFC-1034].
-
-When processing queries with QCLASS=*, or some other QCLASS which
-matches multiple classes, the response should never be authoritative
-unless the server can guarantee that the response covers all classes.
-
-When composing a response, RRs which are to be inserted in the
-additional section, but duplicate RRs in the answer or authority
-sections, may be omitted from the additional section.
-
-When a response is so long that truncation is required, the truncation
-should start at the end of the response and work forward in the
-datagram. Thus if there is any data for the authority section, the
-answer section is guaranteed to be unique.
-
-The MINIMUM value in the SOA should be used to set a floor on the TTL of
-data distributed from a zone. This floor function should be done when
-the data is copied into a response. This will allow future dynamic
-update protocols to change the SOA MINIMUM field without ambiguous
-semantics.
-
-6.3. Zone refresh and reload processing
-
-In spite of a server's best efforts, it may be unable to load zone data
-from a master file due to syntax errors, etc., or be unable to refresh a
-zone within the its expiration parameter. In this case, the name server
-
-
-
-Mockapetris [Page 39]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-should answer queries as if it were not supposed to possess the zone.
-
-If a master is sending a zone out via AXFR, and a new version is created
-during the transfer, the master should continue to send the old version
-if possible. In any case, it should never send part of one version and
-part of another. If completion is not possible, the master should reset
-the connection on which the zone transfer is taking place.
-
-6.4. Inverse queries (Optional)
-
-Inverse queries are an optional part of the DNS. Name servers are not
-required to support any form of inverse queries. If a name server
-receives an inverse query that it does not support, it returns an error
-response with the "Not Implemented" error set in the header. While
-inverse query support is optional, all name servers must be at least
-able to return the error response.
-
-6.4.1. The contents of inverse queries and responses Inverse
-queries reverse the mappings performed by standard query operations;
-while a standard query maps a domain name to a resource, an inverse
-query maps a resource to a domain name. For example, a standard query
-might bind a domain name to a host address; the corresponding inverse
-query binds the host address to a domain name.
-
-Inverse queries take the form of a single RR in the answer section of
-the message, with an empty question section. The owner name of the
-query RR and its TTL are not significant. The response carries
-questions in the question section which identify all names possessing
-the query RR WHICH THE NAME SERVER KNOWS. Since no name server knows
-about all of the domain name space, the response can never be assumed to
-be complete. Thus inverse queries are primarily useful for database
-management and debugging activities. Inverse queries are NOT an
-acceptable method of mapping host addresses to host names; use the IN-
-ADDR.ARPA domain instead.
-
-Where possible, name servers should provide case-insensitive comparisons
-for inverse queries. Thus an inverse query asking for an MX RR of
-"Venera.isi.edu" should get the same response as a query for
-"VENERA.ISI.EDU"; an inverse query for HINFO RR "IBM-PC UNIX" should
-produce the same result as an inverse query for "IBM-pc unix". However,
-this cannot be guaranteed because name servers may possess RRs that
-contain character strings but the name server does not know that the
-data is character.
-
-When a name server processes an inverse query, it either returns:
-
- 1. zero, one, or multiple domain names for the specified
- resource as QNAMEs in the question section
-
-
-
-Mockapetris [Page 40]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
- 2. an error code indicating that the name server doesn't support
- inverse mapping of the specified resource type.
-
-When the response to an inverse query contains one or more QNAMEs, the
-owner name and TTL of the RR in the answer section which defines the
-inverse query is modified to exactly match an RR found at the first
-QNAME.
-
-RRs returned in the inverse queries cannot be cached using the same
-mechanism as is used for the replies to standard queries. One reason
-for this is that a name might have multiple RRs of the same type, and
-only one would appear. For example, an inverse query for a single
-address of a multiply homed host might create the impression that only
-one address existed.
-
-6.4.2. Inverse query and response example The overall structure
-of an inverse query for retrieving the domain name that corresponds to
-Internet address 10.1.0.52 is shown below:
-
- +-----------------------------------------+
- Header | OPCODE=IQUERY, ID=997 |
- +-----------------------------------------+
- Question | <empty> |
- +-----------------------------------------+
- Answer | <anyname> A IN 10.1.0.52 |
- +-----------------------------------------+
- Authority | <empty> |
- +-----------------------------------------+
- Additional | <empty> |
- +-----------------------------------------+
-
-This query asks for a question whose answer is the Internet style
-address 10.1.0.52. Since the owner name is not known, any domain name
-can be used as a placeholder (and is ignored). A single octet of zero,
-signifying the root, is usually used because it minimizes the length of
-the message. The TTL of the RR is not significant. The response to
-this query might be:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Mockapetris [Page 41]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
- +-----------------------------------------+
- Header | OPCODE=RESPONSE, ID=997 |
- +-----------------------------------------+
- Question |QTYPE=A, QCLASS=IN, QNAME=VENERA.ISI.EDU |
- +-----------------------------------------+
- Answer | VENERA.ISI.EDU A IN 10.1.0.52 |
- +-----------------------------------------+
- Authority | <empty> |
- +-----------------------------------------+
- Additional | <empty> |
- +-----------------------------------------+
-
-Note that the QTYPE in a response to an inverse query is the same as the
-TYPE field in the answer section of the inverse query. Responses to
-inverse queries may contain multiple questions when the inverse is not
-unique. If the question section in the response is not empty, then the
-RR in the answer section is modified to correspond to be an exact copy
-of an RR at the first QNAME.
-
-6.4.3. Inverse query processing
-
-Name servers that support inverse queries can support these operations
-through exhaustive searches of their databases, but this becomes
-impractical as the size of the database increases. An alternative
-approach is to invert the database according to the search key.
-
-For name servers that support multiple zones and a large amount of data,
-the recommended approach is separate inversions for each zone. When a
-particular zone is changed during a refresh, only its inversions need to
-be redone.
-
-Support for transfer of this type of inversion may be included in future
-versions of the domain system, but is not supported in this version.
-
-6.5. Completion queries and responses
-
-The optional completion services described in RFC-882 and RFC-883 have
-been deleted. Redesigned services may become available in the future.
-
-
-
-
-
-
-
-
-
-
-
-
-
-Mockapetris [Page 42]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-7. RESOLVER IMPLEMENTATION
-
-The top levels of the recommended resolver algorithm are discussed in
-[RFC-1034]. This section discusses implementation details assuming the
-database structure suggested in the name server implementation section
-of this memo.
-
-7.1. Transforming a user request into a query
-
-The first step a resolver takes is to transform the client's request,
-stated in a format suitable to the local OS, into a search specification
-for RRs at a specific name which match a specific QTYPE and QCLASS.
-Where possible, the QTYPE and QCLASS should correspond to a single type
-and a single class, because this makes the use of cached data much
-simpler. The reason for this is that the presence of data of one type
-in a cache doesn't confirm the existence or non-existence of data of
-other types, hence the only way to be sure is to consult an
-authoritative source. If QCLASS=* is used, then authoritative answers
-won't be available.
-
-Since a resolver must be able to multiplex multiple requests if it is to
-perform its function efficiently, each pending request is usually
-represented in some block of state information. This state block will
-typically contain:
-
- - A timestamp indicating the time the request began.
- The timestamp is used to decide whether RRs in the database
- can be used or are out of date. This timestamp uses the
- absolute time format previously discussed for RR storage in
- zones and caches. Note that when an RRs TTL indicates a
- relative time, the RR must be timely, since it is part of a
- zone. When the RR has an absolute time, it is part of a
- cache, and the TTL of the RR is compared against the timestamp
- for the start of the request.
-
- Note that using the timestamp is superior to using a current
- time, since it allows RRs with TTLs of zero to be entered in
- the cache in the usual manner, but still used by the current
- request, even after intervals of many seconds due to system
- load, query retransmission timeouts, etc.
-
- - Some sort of parameters to limit the amount of work which will
- be performed for this request.
-
- The amount of work which a resolver will do in response to a
- client request must be limited to guard against errors in the
- database, such as circular CNAME references, and operational
- problems, such as network partition which prevents the
-
-
-
-Mockapetris [Page 43]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
- resolver from accessing the name servers it needs. While
- local limits on the number of times a resolver will retransmit
- a particular query to a particular name server address are
- essential, the resolver should have a global per-request
- counter to limit work on a single request. The counter should
- be set to some initial value and decremented whenever the
- resolver performs any action (retransmission timeout,
- retransmission, etc.) If the counter passes zero, the request
- is terminated with a temporary error.
-
- Note that if the resolver structure allows one request to
- start others in parallel, such as when the need to access a
- name server for one request causes a parallel resolve for the
- name server's addresses, the spawned request should be started
- with a lower counter. This prevents circular references in
- the database from starting a chain reaction of resolver
- activity.
-
- - The SLIST data structure discussed in [RFC-1034].
-
- This structure keeps track of the state of a request if it
- must wait for answers from foreign name servers.
-
-7.2. Sending the queries
-
-As described in [RFC-1034], the basic task of the resolver is to
-formulate a query which will answer the client's request and direct that
-query to name servers which can provide the information. The resolver
-will usually only have very strong hints about which servers to ask, in
-the form of NS RRs, and may have to revise the query, in response to
-CNAMEs, or revise the set of name servers the resolver is asking, in
-response to delegation responses which point the resolver to name
-servers closer to the desired information. In addition to the
-information requested by the client, the resolver may have to call upon
-its own services to determine the address of name servers it wishes to
-contact.
-
-In any case, the model used in this memo assumes that the resolver is
-multiplexing attention between multiple requests, some from the client,
-and some internally generated. Each request is represented by some
-state information, and the desired behavior is that the resolver
-transmit queries to name servers in a way that maximizes the probability
-that the request is answered, minimizes the time that the request takes,
-and avoids excessive transmissions. The key algorithm uses the state
-information of the request to select the next name server address to
-query, and also computes a timeout which will cause the next action
-should a response not arrive. The next action will usually be a
-transmission to some other server, but may be a temporary error to the
-
-
-
-Mockapetris [Page 44]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-client.
-
-The resolver always starts with a list of server names to query (SLIST).
-This list will be all NS RRs which correspond to the nearest ancestor
-zone that the resolver knows about. To avoid startup problems, the
-resolver should have a set of default servers which it will ask should
-it have no current NS RRs which are appropriate. The resolver then adds
-to SLIST all of the known addresses for the name servers, and may start
-parallel requests to acquire the addresses of the servers when the
-resolver has the name, but no addresses, for the name servers.
-
-To complete initialization of SLIST, the resolver attaches whatever
-history information it has to the each address in SLIST. This will
-usually consist of some sort of weighted averages for the response time
-of the address, and the batting average of the address (i.e., how often
-the address responded at all to the request). Note that this
-information should be kept on a per address basis, rather than on a per
-name server basis, because the response time and batting average of a
-particular server may vary considerably from address to address. Note
-also that this information is actually specific to a resolver address /
-server address pair, so a resolver with multiple addresses may wish to
-keep separate histories for each of its addresses. Part of this step
-must deal with addresses which have no such history; in this case an
-expected round trip time of 5-10 seconds should be the worst case, with
-lower estimates for the same local network, etc.
-
-Note that whenever a delegation is followed, the resolver algorithm
-reinitializes SLIST.
-
-The information establishes a partial ranking of the available name
-server addresses. Each time an address is chosen and the state should
-be altered to prevent its selection again until all other addresses have
-been tried. The timeout for each transmission should be 50-100% greater
-than the average predicted value to allow for variance in response.
-
-Some fine points:
-
- - The resolver may encounter a situation where no addresses are
- available for any of the name servers named in SLIST, and
- where the servers in the list are precisely those which would
- normally be used to look up their own addresses. This
- situation typically occurs when the glue address RRs have a
- smaller TTL than the NS RRs marking delegation, or when the
- resolver caches the result of a NS search. The resolver
- should detect this condition and restart the search at the
- next ancestor zone, or alternatively at the root.
-
-
-
-
-
-Mockapetris [Page 45]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
- - If a resolver gets a server error or other bizarre response
- from a name server, it should remove it from SLIST, and may
- wish to schedule an immediate transmission to the next
- candidate server address.
-
-7.3. Processing responses
-
-The first step in processing arriving response datagrams is to parse the
-response. This procedure should include:
-
- - Check the header for reasonableness. Discard datagrams which
- are queries when responses are expected.
-
- - Parse the sections of the message, and insure that all RRs are
- correctly formatted.
-
- - As an optional step, check the TTLs of arriving data looking
- for RRs with excessively long TTLs. If a RR has an
- excessively long TTL, say greater than 1 week, either discard
- the whole response, or limit all TTLs in the response to 1
- week.
-
-The next step is to match the response to a current resolver request.
-The recommended strategy is to do a preliminary matching using the ID
-field in the domain header, and then to verify that the question section
-corresponds to the information currently desired. This requires that
-the transmission algorithm devote several bits of the domain ID field to
-a request identifier of some sort. This step has several fine points:
-
- - Some name servers send their responses from different
- addresses than the one used to receive the query. That is, a
- resolver cannot rely that a response will come from the same
- address which it sent the corresponding query to. This name
- server bug is typically encountered in UNIX systems.
-
- - If the resolver retransmits a particular request to a name
- server it should be able to use a response from any of the
- transmissions. However, if it is using the response to sample
- the round trip time to access the name server, it must be able
- to determine which transmission matches the response (and keep
- transmission times for each outgoing message), or only
- calculate round trip times based on initial transmissions.
-
- - A name server will occasionally not have a current copy of a
- zone which it should have according to some NS RRs. The
- resolver should simply remove the name server from the current
- SLIST, and continue.
-
-
-
-
-Mockapetris [Page 46]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-7.4. Using the cache
-
-In general, we expect a resolver to cache all data which it receives in
-responses since it may be useful in answering future client requests.
-However, there are several types of data which should not be cached:
-
- - When several RRs of the same type are available for a
- particular owner name, the resolver should either cache them
- all or none at all. When a response is truncated, and a
- resolver doesn't know whether it has a complete set, it should
- not cache a possibly partial set of RRs.
-
- - Cached data should never be used in preference to
- authoritative data, so if caching would cause this to happen
- the data should not be cached.
-
- - The results of an inverse query should not be cached.
-
- - The results of standard queries where the QNAME contains "*"
- labels if the data might be used to construct wildcards. The
- reason is that the cache does not necessarily contain existing
- RRs or zone boundary information which is necessary to
- restrict the application of the wildcard RRs.
-
- - RR data in responses of dubious reliability. When a resolver
- receives unsolicited responses or RR data other than that
- requested, it should discard it without caching it. The basic
- implication is that all sanity checks on a packet should be
- performed before any of it is cached.
-
-In a similar vein, when a resolver has a set of RRs for some name in a
-response, and wants to cache the RRs, it should check its cache for
-already existing RRs. Depending on the circumstances, either the data
-in the response or the cache is preferred, but the two should never be
-combined. If the data in the response is from authoritative data in the
-answer section, it is always preferred.
-
-8. MAIL SUPPORT
-
-The domain system defines a standard for mapping mailboxes into domain
-names, and two methods for using the mailbox information to derive mail
-routing information. The first method is called mail exchange binding
-and the other method is mailbox binding. The mailbox encoding standard
-and mail exchange binding are part of the DNS official protocol, and are
-the recommended method for mail routing in the Internet. Mailbox
-binding is an experimental feature which is still under development and
-subject to change.
-
-
-
-
-Mockapetris [Page 47]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-The mailbox encoding standard assumes a mailbox name of the form
-"<local-part>@<mail-domain>". While the syntax allowed in each of these
-sections varies substantially between the various mail internets, the
-preferred syntax for the ARPA Internet is given in [RFC-822].
-
-The DNS encodes the <local-part> as a single label, and encodes the
-<mail-domain> as a domain name. The single label from the <local-part>
-is prefaced to the domain name from <mail-domain> to form the domain
-name corresponding to the mailbox. Thus the mailbox HOSTMASTER at SRI-
-NIC.ARPA is mapped into the domain name HOSTMASTER.SRI-NIC.ARPA. If the
-<local-part> contains dots or other special characters, its
-representation in a master file will require the use of backslash
-quoting to ensure that the domain name is properly encoded. For
-example, the mailbox Action.domains at ISI.EDU would be represented as
-Action\.domains.ISI.EDU.
-
-8.1. Mail exchange binding
-
-Mail exchange binding uses the <mail-domain> part of a mailbox
-specification to determine where mail should be sent. The <local-part>
-is not even consulted. [RFC-974] specifies this method in detail, and
-should be consulted before attempting to use mail exchange support.
-
-One of the advantages of this method is that it decouples mail
-destination naming from the hosts used to support mail service, at the
-cost of another layer of indirection in the lookup function. However,
-the addition layer should eliminate the need for complicated "%", "!",
-etc encodings in <local-part>.
-
-The essence of the method is that the <mail-domain> is used as a domain
-name to locate type MX RRs which list hosts willing to accept mail for
-<mail-domain>, together with preference values which rank the hosts
-according to an order specified by the administrators for <mail-domain>.
-
-In this memo, the <mail-domain> ISI.EDU is used in examples, together
-with the hosts VENERA.ISI.EDU and VAXA.ISI.EDU as mail exchanges for
-ISI.EDU. If a mailer had a message for Mockapetris at ISI.EDU, it would
-route it by looking up MX RRs for ISI.EDU. The MX RRs at ISI.EDU name
-VENERA.ISI.EDU and VAXA.ISI.EDU, and type A queries can find the host
-addresses.
-
-8.2. Mailbox binding (Experimental)
-
-In mailbox binding, the mailer uses the entire mail destination
-specification to construct a domain name. The encoded domain name for
-the mailbox is used as the QNAME field in a QTYPE=MAILB query.
-
-Several outcomes are possible for this query:
-
-
-
-Mockapetris [Page 48]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
- 1. The query can return a name error indicating that the mailbox
- does not exist as a domain name.
-
- In the long term, this would indicate that the specified
- mailbox doesn't exist. However, until the use of mailbox
- binding is universal, this error condition should be
- interpreted to mean that the organization identified by the
- global part does not support mailbox binding. The
- appropriate procedure is to revert to exchange binding at
- this point.
-
- 2. The query can return a Mail Rename (MR) RR.
-
- The MR RR carries new mailbox specification in its RDATA
- field. The mailer should replace the old mailbox with the
- new one and retry the operation.
-
- 3. The query can return a MB RR.
-
- The MB RR carries a domain name for a host in its RDATA
- field. The mailer should deliver the message to that host
- via whatever protocol is applicable, e.g., b,SMTP.
-
- 4. The query can return one or more Mail Group (MG) RRs.
-
- This condition means that the mailbox was actually a mailing
- list or mail group, rather than a single mailbox. Each MG RR
- has a RDATA field that identifies a mailbox that is a member
- of the group. The mailer should deliver a copy of the
- message to each member.
-
- 5. The query can return a MB RR as well as one or more MG RRs.
-
- This condition means the the mailbox was actually a mailing
- list. The mailer can either deliver the message to the host
- specified by the MB RR, which will in turn do the delivery to
- all members, or the mailer can use the MG RRs to do the
- expansion itself.
-
-In any of these cases, the response may include a Mail Information
-(MINFO) RR. This RR is usually associated with a mail group, but is
-legal with a MB. The MINFO RR identifies two mailboxes. One of these
-identifies a responsible person for the original mailbox name. This
-mailbox should be used for requests to be added to a mail group, etc.
-The second mailbox name in the MINFO RR identifies a mailbox that should
-receive error messages for mail failures. This is particularly
-appropriate for mailing lists when errors in member names should be
-reported to a person other than the one who sends a message to the list.
-
-
-
-Mockapetris [Page 49]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-New fields may be added to this RR in the future.
-
-
-9. REFERENCES and BIBLIOGRAPHY
-
-[Dyer 87] S. Dyer, F. Hsu, "Hesiod", Project Athena
- Technical Plan - Name Service, April 1987, version 1.9.
-
- Describes the fundamentals of the Hesiod name service.
-
-[IEN-116] J. Postel, "Internet Name Server", IEN-116,
- USC/Information Sciences Institute, August 1979.
-
- A name service obsoleted by the Domain Name System, but
- still in use.
-
-[Quarterman 86] J. Quarterman, and J. Hoskins, "Notable Computer Networks",
- Communications of the ACM, October 1986, volume 29, number
- 10.
-
-[RFC-742] K. Harrenstien, "NAME/FINGER", RFC-742, Network
- Information Center, SRI International, December 1977.
-
-[RFC-768] J. Postel, "User Datagram Protocol", RFC-768,
- USC/Information Sciences Institute, August 1980.
-
-[RFC-793] J. Postel, "Transmission Control Protocol", RFC-793,
- USC/Information Sciences Institute, September 1981.
-
-[RFC-799] D. Mills, "Internet Name Domains", RFC-799, COMSAT,
- September 1981.
-
- Suggests introduction of a hierarchy in place of a flat
- name space for the Internet.
-
-[RFC-805] J. Postel, "Computer Mail Meeting Notes", RFC-805,
- USC/Information Sciences Institute, February 1982.
-
-[RFC-810] E. Feinler, K. Harrenstien, Z. Su, and V. White, "DOD
- Internet Host Table Specification", RFC-810, Network
- Information Center, SRI International, March 1982.
-
- Obsolete. See RFC-952.
-
-[RFC-811] K. Harrenstien, V. White, and E. Feinler, "Hostnames
- Server", RFC-811, Network Information Center, SRI
- International, March 1982.
-
-
-
-
-Mockapetris [Page 50]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
- Obsolete. See RFC-953.
-
-[RFC-812] K. Harrenstien, and V. White, "NICNAME/WHOIS", RFC-812,
- Network Information Center, SRI International, March
- 1982.
-
-[RFC-819] Z. Su, and J. Postel, "The Domain Naming Convention for
- Internet User Applications", RFC-819, Network
- Information Center, SRI International, August 1982.
-
- Early thoughts on the design of the domain system.
- Current implementation is completely different.
-
-[RFC-821] J. Postel, "Simple Mail Transfer Protocol", RFC-821,
- USC/Information Sciences Institute, August 1980.
-
-[RFC-830] Z. Su, "A Distributed System for Internet Name Service",
- RFC-830, Network Information Center, SRI International,
- October 1982.
-
- Early thoughts on the design of the domain system.
- Current implementation is completely different.
-
-[RFC-882] P. Mockapetris, "Domain names - Concepts and
- Facilities," RFC-882, USC/Information Sciences
- Institute, November 1983.
-
- Superceeded by this memo.
-
-[RFC-883] P. Mockapetris, "Domain names - Implementation and
- Specification," RFC-883, USC/Information Sciences
- Institute, November 1983.
-
- Superceeded by this memo.
-
-[RFC-920] J. Postel and J. Reynolds, "Domain Requirements",
- RFC-920, USC/Information Sciences Institute,
- October 1984.
-
- Explains the naming scheme for top level domains.
-
-[RFC-952] K. Harrenstien, M. Stahl, E. Feinler, "DoD Internet Host
- Table Specification", RFC-952, SRI, October 1985.
-
- Specifies the format of HOSTS.TXT, the host/address
- table replaced by the DNS.
-
-
-
-
-
-Mockapetris [Page 51]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-[RFC-953] K. Harrenstien, M. Stahl, E. Feinler, "HOSTNAME Server",
- RFC-953, SRI, October 1985.
-
- This RFC contains the official specification of the
- hostname server protocol, which is obsoleted by the DNS.
- This TCP based protocol accesses information stored in
- the RFC-952 format, and is used to obtain copies of the
- host table.
-
-[RFC-973] P. Mockapetris, "Domain System Changes and
- Observations", RFC-973, USC/Information Sciences
- Institute, January 1986.
-
- Describes changes to RFC-882 and RFC-883 and reasons for
- them.
-
-[RFC-974] C. Partridge, "Mail routing and the domain system",
- RFC-974, CSNET CIC BBN Labs, January 1986.
-
- Describes the transition from HOSTS.TXT based mail
- addressing to the more powerful MX system used with the
- domain system.
-
-[RFC-1001] NetBIOS Working Group, "Protocol standard for a NetBIOS
- service on a TCP/UDP transport: Concepts and Methods",
- RFC-1001, March 1987.
-
- This RFC and RFC-1002 are a preliminary design for
- NETBIOS on top of TCP/IP which proposes to base NetBIOS
- name service on top of the DNS.
-
-[RFC-1002] NetBIOS Working Group, "Protocol standard for a NetBIOS
- service on a TCP/UDP transport: Detailed
- Specifications", RFC-1002, March 1987.
-
-[RFC-1010] J. Reynolds, and J. Postel, "Assigned Numbers", RFC-1010,
- USC/Information Sciences Institute, May 1987.
-
- Contains socket numbers and mnemonics for host names,
- operating systems, etc.
-
-[RFC-1031] W. Lazear, "MILNET Name Domain Transition", RFC-1031,
- November 1987.
-
- Describes a plan for converting the MILNET to the DNS.
-
-[RFC-1032] M. Stahl, "Establishing a Domain - Guidelines for
- Administrators", RFC-1032, November 1987.
-
-
-
-Mockapetris [Page 52]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
- Describes the registration policies used by the NIC to
- administer the top level domains and delegate subzones.
-
-[RFC-1033] M. Lottor, "Domain Administrators Operations Guide",
- RFC-1033, November 1987.
-
- A cookbook for domain administrators.
-
-[Solomon 82] M. Solomon, L. Landweber, and D. Neuhengen, "The CSNET
- Name Server", Computer Networks, vol 6, nr 3, July 1982.
-
- Describes a name service for CSNET which is independent
- from the DNS and DNS use in the CSNET.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Mockapetris [Page 53]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
-Index
-
- * 13
-
- ; 33, 35
-
- <character-string> 35
- <domain-name> 34
-
- @ 35
-
- \ 35
-
- A 12
-
- Byte order 8
-
- CH 13
- Character case 9
- CLASS 11
- CNAME 12
- Completion 42
- CS 13
-
- Hesiod 13
- HINFO 12
- HS 13
-
- IN 13
- IN-ADDR.ARPA domain 22
- Inverse queries 40
-
- Mailbox names 47
- MB 12
- MD 12
- MF 12
- MG 12
- MINFO 12
- MINIMUM 20
- MR 12
- MX 12
-
- NS 12
- NULL 12
-
- Port numbers 32
- Primary server 5
- PTR 12, 18
-
-
-
-Mockapetris [Page 54]
-
-RFC 1035 Domain Implementation and Specification November 1987
-
-
- QCLASS 13
- QTYPE 12
-
- RDATA 12
- RDLENGTH 11
-
- Secondary server 5
- SOA 12
- Stub resolvers 7
-
- TCP 32
- TXT 12
- TYPE 11
-
- UDP 32
-
- WKS 12
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Mockapetris [Page 55]
-
-
-Html markup produced by rfcmarkup 1.77, available from http://tools.ietf.org/tools/rfcmarkup/
\ No newline at end of file
diff --git a/reference/rfc1049 Content-Type Header Field for Internet Messages.txt b/reference/rfc1049 Content-Type Header Field for Internet Messages.txt
deleted file mode 100644
index 151afc9..0000000
--- a/reference/rfc1049 Content-Type Header Field for Internet Messages.txt
+++ /dev/null
@@ -1,451 +0,0 @@
-
-
-
-
-
-
-Network Working Group M. Sirbu
-Request for Comments: 1049 CMU
- March 1988
-
- A CONTENT-TYPE HEADER FIELD FOR INTERNET MESSAGES
-
-STATUS OF THIS MEMO
-
- This RFC suggests proposed additions to the Internet Mail Protocol,
- RFC-822, for the Internet community, and requests discussion and
- suggestions for improvements. Distribution of this memo is
- unlimited.
-
-ABSTRACT
-
- A standardized Content-type field allows mail reading systems to
- automatically identify the type of a structured message body and to
- process it for display accordingly. The structured message body must
- still conform to the RFC-822 requirements concerning allowable
- characters. A mail reading system need not take any specific action
- upon receiving a message with a valid Content-Type header field. The
- ability to recognize this field and invoke the appropriate display
- process accordingly will, however, improve the readability of
- messages, and allow the exchange of messages containing mathematical
- symbols, or foreign language characters.
-
- Table of Contents
-
- 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 1
- 2. Problems with Structured Messages . . . . . . . . . . . . . . . 3
- 3. The Content-type Header Field . . . . . . . . . . . . . . . . . 5
- 3.1. Type Values . . . . . . . . . . . . . . . . . . . . . . 5
- 3.2. Version Number . . . . . . . . . . . . . . . . . . . . . 6
- 3.3. Resource Reference . . . . . . . . . . . . . . . . . . . 6
- 3.4. Comment. . . . . . . . . . . . . . . . . . . . . . . . . 7
- 4. Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . 7
-
-1. Introduction
-
- As defined in RFC-822, [2], an electronic mail message consists of a
- number of defined header fields, some containing structured
- information (e.g., date, addresses), and a message body consisting of
- an unstructured string of ASCII characters.
-
- The success of the Internet mail system has led to a desire to use
- the mail system for sending around information with a greater degree
- of structure, while remaining within the constraints imposed by the
- limited character set. A prime example is the use of mail to send a
-
-
-
-Sirbu [Page 1]
-
-RFC 1049 Mail Content Type March 1988
-
-
- document with embedded TROFF formatting commands. A more
- sophisticated example would be a message body encoded in a Page
- Description Language (PDL) such as Postscript. In both cases, simply
- mapping the ASCII characters to the screen or printer in the usual
- fashion will not render the document image intended by the sender; an
- additional processing step is required to produce an image of the
- message text on a display device or a piece of paper.
-
- In both of these examples, the message body contains only the legal
- character set, but the content has a structure which produces some
- desirable result after appropriate processing by the recipient. If a
- message header field could be used to indicate the structuring
- technique used in the message body, then a sophisticated mail system
- could use such a field to automatically invoke the appropriate
- processing of the message body. For example, a header field which
- indicated that the message body was encoded using Postscript could be
- used to direct a mail system running under Sun Microsystem's NEWS
- window manager to process the Postscript to produce the appropriate
- page image on the screen.
-
- Private header fields (beginning with "X-") are already being used by
- some systems to affect such a result (e.g., the Andrew Message System
- developed at Carnegie Mellon University). However, the widespread
- use of such techniques will require general agreement on the name and
- allowed parameter values for a header field to be used for this
- purpose.
-
- We propose that a new header field, "Content-type:" be recognized as
- the standard field for indicating the structure of the message body.
- The contents of the "Content-Type:" field are parameters which
- specify what type of structure is used in the message body.
-
- Note that we are not proposing that the message body contain anything
- other than ASCII characters as specified in RFC-822. Whatever
- structuring is contained in the message body must be represented
- using only the allowed ASCII characters. Thus, this proposal should
- have no impact on existing mailers, only on mail reading systems.
-
- At the same time, this restriction eliminates the use of more general
- structuring techniques such as Abstract Syntax Notation, (CCITT
- Recommendation X.409) as used in the X.400 messaging standard, which
- are octet-oriented.
-
- This is not the first proposal for structuring message bodies.
- RFC-767 discusses a proposed technique for structuring multi-media
- mail messages. We are also aware that many users already employ mail
- to send TROFF, SCRIBE, TEX, Postscript or other structured
- information. Such postprocessing as is required must be invoked
-
-
-
-Sirbu [Page 2]
-
-RFC 1049 Mail Content Type March 1988
-
-
- manually by the message recipient who looks at the message text
- displayed as conventional ASCII and recognizes that it is structured
- in some way that requires additional processing to be properly
- rendered. Our proposal is designed to facilitate automatic
- processing of messages by a mail reading system.
-
-2. Problems with Structured Messages
-
- Once we introduce the notion that a message body might require some
- processing other than simply painting the characters to the screen we
- raise a number of fundamental questions. These generally arise due
- to the certainty that some receiving systems will have the facilities
- to process the received message and some will not. The problem is
- what to do in the presence of systems with different levels of
- capability.
-
- First, we must recognize that the purpose of structured messages is
- to be able to send types of information, ultimately intended for
- human consumption, not expressable in plain ASCII. Thus, there is no
- way in plain ASCII to send the italics, boldface, or greek characters
- that can be expressed in Postscript. If some different processing is
- necessary to render these glyphs, then that is the minimum price to
- be paid in order to send them at all.
-
- Second, by insisting that the message body contain only ASCII, we
- insure that it will not "break" current mail reading systems which
- are not equipped to process the structure; the result on the screen
- may not be readily interpretable by the human reader, however.
-
- If a message sender knows that the recipient cannot process
- Postscript, he or she may prefer that the message be revised to
- eliminate the use of italics and boldface, rather than appear
- incomprehensible. If Postscript is being used because the message
- contains passages in Greek, there may be no suitable ASCII
- equivalent, however.
-
- Ideally, the details of structuring the message (or not) to conform
- to the capabilities of the recipient system could be completely
- hidden from the message sender. The distributed Internet mail system
- would somehow determine the capabilities of the recipient system, and
- convert the message automatically; or, if there was no way to send
- Greek text in ASCII, inform the sender that his message could not be
- transmitted.
-
-
-
-
-
-
-
-
-Sirbu [Page 3]
-
-RFC 1049 Mail Content Type March 1988
-
-
- In practice, this is a difficult task. There are three possible
- approaches:
-
- 1. Each mail system maintains a database of capabilities of
- remote systems it knows how to send to. Such a database
- would be very difficult to keep up to date.
-
- 2. The mail transport service negotiates with the receiving
- system as to its capabilities. If the receiving system
- cannot support the specified content type, the mail is
- transformed into conventional ASCII before transmission.
- This would require changes to all existing SMTP
- implementations, and could not be implemented in the case
- where RFC-822 type messages are being forwarded via Bitnet or
- other networks which do not implement SMTP.
-
- 3. An expanded directory service maintains information on mail
- processing capabilities of receiving hosts. This eliminates
- the need for real-time negotiation with the final
- destination, but still requires direct interaction with the
- directory service. Since directory querying is part of mail
- sending as opposed to mail composing/reading systems, this
- requires changes to existing mailers as well as a major
- change to the domain name directory service.
-
- We note in passing that the X.400 protocol implements approach number
- 2, and that the Draft Recommendations for X.DS, the Directory
- Service, would support option 3.
-
- In the interest of facilitating early usage of structured messages,
- we choose not to recommend any of the three approaches described
- above at the present time. In a forthcoming RFC we will propose a
- solution based on option 2, requiring modification to mailers to
- support negotiation over capabilities. For the present, then, users
- would be obliged to keep their own private list of capabilities of
- recipients and to take care that they do not send Postscript, TROFF
- or other structured messages to recipients who cannot process them.
- The penalty for failure to do so will be the frustration of the
- recipient in trying to read a raw Postscript or TROFF file painted on
- his or her screen. Some System Administrators may attempt to
- implement option 1 for the benefit of their users, but this does not
- impose a requirement for changes on any other mail system.
-
- We recognize that the long-term solution must require changes to
- mailers. However, in order to begin now to standardize the header
- fields, and to facilitate experimentation, we issue the present RFC.
-
-
-
-
-
-Sirbu [Page 4]
-
-RFC 1049 Mail Content Type March 1988
-
-
-3. The Content-type Header Field
-
- Whatever structuring technique is specified by the Content-type
- field, it must be known precisely to both the sender and the
- recipient of the message in order for the message to be properly
- interpreted. In general, this means that the allowed parameter
- values for the Content-type: field must identify a well-defined,
- standardized, document structuring technique. We do not preclude,
- however, the use of a Content-type: parameter value to specify a
- private structuring technique known only to the sender and the
- recipient.
-
- More precisely, we propose that the Content-type: header field
- consist of up to four parameter values. The first, or type parameter
- names the structuring technique; the second, optional, parameter is a
- version number, ver-num, which indicates a particular version or
- revision of the standardized structuring technique. The third
- parameter is a resource reference, resource-ref, which may indicate a
- standard database of information to be used in interpreting the
- structured document. The last parameter is a comment.
-
- In the Extended Backus Naur Form of RFC-822, we have:
-
- Content-Type:= type [";" ver-num [";" 1#resource-ref]] [comment]
-
-3.1. Type Values
-
- Initially, the type parameter would be limited to the following set
- of values:
-
- type:= "POSTSCRIPT"/"SCRIBE"/"SGML"/"TEX"/"TROFF"/
- "DVI"/"X-"atom
-
- These values are not case sensitive. POSTSCRIPT, Postscript, and
- POStscriPT are all equivalent.
-
- POSTSCRIPT Indicates the enclosed document consists of
- information encoded using the Postscript Page
- Definition Language developed by Adobe Systems,
- Inc. [1]
-
- SCRIBE Indicates the document contains embedded formatting
- information according to the syntax used by the
- Scribe document formatting language distributed by
- the Unilogic Corporation. [6]
-
- SGML Indicates the document contains structuring
- information to according the rules specified for
-
-
-
-Sirbu [Page 5]
-
-RFC 1049 Mail Content Type March 1988
-
-
- the Standard Generalized Markup Language, IS 8879,
- as published by the International Organization for
- Standardization. [3] Documents structured according
- to the ISO DIS 8613--Office Docment Architecture and
- Interchange Format--may also be encoded using SGML
- syntax.
-
- TEX Indicates the document contains embedded formatting
- information according to the syntax of the TEX
- document production language. [4]
-
- TROFF Indicates the document contains embedded formatting
- information according to the syntax specified for the
- TROFF formatting package developed by AT&T Bell
- Laboratories. [5]
-
- DVI Indicates the document contains information according
- to the device independent file format produced by
- TROFF or TEX.
-
- "X-"atom Any type value beginning with the characters "X-" is
- a private value.
-
-3.2. Version Number
-
- Since standard structuring techniques in fact evolve over time, we
- leave room for specifying a version number for the content type.
- Valid values will depend upon the type parameter.
-
- ver-num:= local-part
-
- In particular, we have the following valid values:
-
- For type=POSTSCRIPT
-
- ver-num:= "1.0"/"2.0"/"null"
-
- For type=SCRIBE
-
- ver-num:= "3"/"4"/"5"/"null"
-
- For type=SGML
-
- ver-num:="IS.8879.1986"/"null"
-
-3.3. Resource Reference
-
- resource-ref:= local-part
-
-
-
-Sirbu [Page 6]
-
-RFC 1049 Mail Content Type March 1988
-
-
- As Apple has demonstrated with their implementation of the
- Laserwriter, a very general document structuring technique can be
- made more efficient by defining a set of macros or other similar
- resources to be used in interpreting any transmitted stream. The
- Macintosh transmits a LaserPrep file to the Laserwriter containing
- font and macro definitions which can be called upon by subsequent
- documents. The result is that documents as sent to the Laserwriter
- are considerably more compact than if they had to include the
- LaserPrep file each time. The Resource Reference parameter allows
- specification of a well known resource, such as a LaserPrep file,
- which should be used by the receiving system when processing the
- message.
-
- Resource references could also include macro packages for use with
- TEX or references to preprocessors such as eqn and tbl for use with
- troff. Allowed values will vary according to the type parameter.
-
- In particular, we propose the following values:
-
- For type = POSTSCRIPT
-
- resource-ref:= "laserprep2.9"/"laserprep3.0"/"laserprep3.1"/
- "laserprep4.0"/local-part
-
- For type = TROFF
-
- resource-ref:= "eqn"/"tbl"/"me"/local-part
-
-3.4. Comment
-
- The comment field can be any additional comment text the user
- desires. Comments are enclosed in parentheses as specified in
- RFC-822.
-
-4. Conclusion
-
- A standardized Content-type field allows mail reading systems to
- automatically identify the type of a structured message body and to
- process it for display accordingly. The strcutured message body must
- still conform to the RFC-822 requirements concerning allowable
- characters. A mail reading system need not take any specific action
- upon receiving a message with valid Content-Type header field. The
- ability to recognize this field and invoke the appropriate display
- process accordingly will, however, improve the readability of
- messages, and allow the exchange of messages containing mathematical
- symbols, or foreign language characters.
-
-
-
-
-
-Sirbu [Page 7]
-
-RFC 1049 Mail Content Type March 1988
-
-
- In the near term, the major use of a Content-Type: header field is
- likely to be for designating the message body as containing a Page
- Definition Language representation such as Postscript.
-
- Additional type values shall be registered with Internet Assigned
- Numbers Coordinator at USC-ISI. Please contact:
-
- Joyce K. Reynolds
- USC Information Sciences Institute
- 4676 Admiralty Way
- Marina del Rey, CA 90292-6695
-
- 213-822-1511 JKReynolds at ISI.EDU
-
- REFERENCES
-
- 1. Adobe Systems, Inc. Postscript Language Reference Manual.
- Addison-Wesley, Reading, Mass., 1985.
-
- 2. Crocker, David H. RFC-822: Standard for the Format of ARPA
- Internet Text Messages. Network Information Center,
- August 13, 1982.
-
- 3. ISO TC97/SC18. Standard Generalized Markup Language.
- Tech. Rept. DIS 8879, ISO, 1986.
-
- 4. Knuth, Donald E. The TEXbook. Addison-Wesley, Reading, Mass.,
- 1984.
-
- 5. Ossanna, Joseph F. NROFF/TROFF User's Manual. Bell
- Laboratories, Murray Hill, New Jersey, 1976. Computing Science
- Technical Report No.54.
-
- 6. Unilogic. SCRIBE Document Production Software. Unilogic, 1985.
- Fourth Edition.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Sirbu [Page 8]
-
\ No newline at end of file
diff --git a/reference/rfc1344 Implications of MIME for Internet Mail Gateways.txt b/reference/rfc1344 Implications of MIME for Internet Mail Gateways.txt
deleted file mode 100644
index fc59dfa..0000000
--- a/reference/rfc1344 Implications of MIME for Internet Mail Gateways.txt
+++ /dev/null
@@ -1,586 +0,0 @@
-
-
-
-
-
-
- Network Working Group N. Borenstein, Bellcore
- Request for Comments: 1344 June 1992
-
- Implications of MIME for Internet Mail Gateways
-
-
- Status of This Memo
-
- This is an informational memo for the Internet community,
- and requests discussion and suggestions for improvements.
- This memo does not specify an Internet standard.
- Distribution of this memo is unlimited.
-
- Abstract
-
- The recent development of MIME (Multipurpose Internet Mail
- Extensions) offers a wide range of new opportunities for
- electronic mail system systems. Most of these opportunites
- are relevant only to user agents, the programs that interact
- with human users when they send and receive mail. However,
- some opportunities are also opened up for mail transport
- systems. While MIME was carefully designed so that it does
- not require any changes to Internet electronic message
- transport facilities, there are several ways in which
- message transport systems may want to take advantage of
- MIME. These opportunities are the subject of this memo.
-
- Background -- The MIME Format
-
- Recently, a new standardized format has been defined for
- enhanced electronic mail messages on the Internet. This
- format, known as MIME, permits messages to include, in a
- standardized manner, non-ASCII text, images, audio, and a
- variety of other kinds of interesting data.
-
- The MIME effort was explicitly focused on requiring
- absolutely no changes at the message transport level.
- Because of this fact, MIME-format mail runs transparently on
- all known Internet or Internet-style mail systems. This
- means that those concerned solely with the maintenance and
- development of message transport services can safely ignore
- MIME completely, if they so choose.
-
- However, the fact that MIME can be ignored, for the purpose
- of message transport, does not necessarily mean that it
- should be ignored. In particular, MIME offers several
- features that should be of interest to those responsible for
- message transport services. By exploiting these features,
- transport systems can provide certain additional kinds of
- service that are currently unavailable, and can alleviate a
- few existing problems.
-
- The remainder of this document is an attempt to briefly
- point out and summarize some important ways in which MIME
-
-
-
- Borenstein [Page 1]
-
-
-
-
- RFC 1344 MIME and Mail Gateways June 1992
-
-
- may be of use for message transport systems. This document
- makes no attempt to present a complete technical description
- of MIME, however. For that, the reader is refered to the
- MIME document itself [RFC-1341].
-
- Mail Transport and Gateway Services: A Key Distinction
-
- Before implementing any of the mechanisms discussed in this
- memo, one should be familiar with the distinction between
- mail transport service and mail gateway service. Basically,
- mail transport software is responsible for moving a message
- within a homogeneous electronic mail service network. Mail
- gateways, on the other hand, exchange mail between two
- significantly different mail environments, including via
- non-electronic services, such as postal mail.
-
- In general, it is widely considered unacceptable for mail
- transport services to alter the contents of messages. In
- the case of mail gateways, however, such alteration is often
- inevitable. Thus, strictly speaking, many of the mechanisms
- described here apply only to gateways, and should not be
- used in simple mail transport systems. However, it is
- possible that some very special situations -- e.g., an SMTP
- relay that transports mail across extremely expensive
- intercontinental network links -- might need to modify
- messages, in order to provide appropriate service for those
- situations, and hence must redefine its role to be that of a
- gateway.
-
- In this memo, it is assumed that transformations which alter
- a message's contents will be performed only by gateways, but
- it is recognized that some existing mail transport agents
- may choose to reclassify themselves as gateways in order to
- perform the functions described here.
-
- Rejected Messages
-
- An unfortunately frequent duty of message transport services
- is the rejection of mail to the sender. This may happen
- because the mail was undeliverable, or because it did not
- conform to the requirements of a gateway (e.g., it was too
- large).
-
- There has never been a standard format for rejected messages
- in the past. This has been an annoyance, but not a major
- problem for text messages. For non-text messages, however,
- the lack of a standard rejection format is more crucial,
- because rejected messages typically appear to be text, and
- the user who finds himself viewing images or audio as if
- they were text is rarely happy with the result.
-
- MIME makes it very easy to encapsulate messages in such a
- way that their semantics are completely preserved. The
- simplest way to do this is to make each rejection notice a
-
-
-
- Borenstein [Page 2]
-
-
-
-
- RFC 1344 MIME and Mail Gateways June 1992
-
-
- MIME "multipart/mixed" message. That multipart message
- would contain two parts, a text part explaining the reason
- for the rejection, and an encapsulated message part that
- contained the rejected message itself.
-
- It should be stressed that the transport software does not
- need to understand the structure of the rejected message at
- all. It merely needs to encapsulate it properly. The
- following, for example, shows how any MIME message may be
- encapsulated in a rejection message in such a way that all
- information will be immediately visible in the correct form
- if the recipient reads it with a MIME-conformant mail
- reader:
-
- From: Mailer-Daemon <daemon at somewhere.com>
- Subject: Rejected Message
- Content-type: multipart/mixed; boundary=unique-boundary
-
- --unique-boundary
- Content-type: text/plain; charset=us-ascii
-
- A mail message you sent was rejected. The details of
- the rejected message are as follows:
-
- From: Nathainel Borenstein <nsb at bellcore.com>
- Message-ID: <12345 at bellcore.com>
- To: bush at whitehouse.gov
- Subject: I know my rights!
- Rejection-reason: No mail from libertarians is
- accepted.
-
- The original message follows below.
- --unique-boundary
- Content-type: message/rfc822
-
- The ENTIRE REJECTED MESSAGE, starting with the headers,
- goes here.
-
- --unique-boundary--
- In the above example, the ONLY thing that is not
- 'boilerplate" is the choice of boundary string. The phrase
- "unique-boundary" should be replaced by a string that does
- not appear (prefixed by two hyphens) in any of the body
- parts.
-
- Encapsulating a message in this manner is very easily done,
- and will constitute a significant service that message
- transport services can perform for MIME users.
-
- IMPORTANT NOTE: The format given above is simply one of
- many possible ways to format a rejection message using MIME.
- Independent IETF efforts are needed in order to standardize
- the format of rejections and acknowledgements.
-
-
-
-
- Borenstein [Page 3]
-
-
-
-
- RFC 1344 MIME and Mail Gateways June 1992
-
-
- Fragmenting and Reassembling Large Messages
-
- One problem that occurs with increasing frequency in
- Internet mail is the rejection of messages because of size
- limitations. This problem can be expected to grow
- substantially more severe with the acceptance of MIME, as
- MIME invites the use of very large objects such as images
- and audio clips. Fortunately, MIME also provides mechanisms
- that can help alleviate the problem.
-
- One particularly relevant MIME type is "message/partial",
- which can be used for the automatic fragmentation and
- reassembly of large mail messages. The message/partial type
- can be handled entirely at the user agent level, but message
- transport services can also make use of this type to provide
- more intelligent behavior at gateways.
-
- In particular, when gatewaying mail to or from a system or
- network known to enforce size limitations that are more or
- less stringent than are enforced locally, message transport
- services might choose either to break a large message into
- fragments, or (perhaps less likely) to reassemble fragments
- into a larger message. The combination of these two
- behaviors can make the overall Internet mail environment
- appear more complete and seamless than it actually is.
-
- Details on the message/partial format may be found in the
- MIME document. What follows is an example of how a simple
- short message might be broken into two message/partial
- messages. In practice, of course, the message/partial
- facility would only be likely to be used for much longer
- messages.
-
- The following initial message:
-
- From: Nathaniel Borenstein <nsb at bellcore.com>
- To: Ned Freed: <ned at innosoft.com>
- Subject: a test message
- Content-type: image/gif
- Content-Transfer-Encoding: base64
-
- R0lGODdhQAGMAbMAAAAAAP/u7swzIu6ZiLsiEd1EM+5VRGaI3WYAAO67qkRV
- uwARd6q7/ywAAAAAQAGMAUME/hDISau9OOvNu/9gKI6kRJwoUa5s675wLM90l
- XW5YKxqPyKRygxv2dr4czwlMCZrQLFTYHBJ2hlyQYFiaz+i0WWBou7fOq1x8vXWfU
- qU1fJ2qEhYaHGjhZQmJ2QT1xBW1ak1xUdV0/VjtsbpUEDaEJCQOIpqeoNV+LXo5W
- fVN3dZKceAQPvgyhwQ2lqcXGxx5wja59eJIGUNCszF90sYp50CoqFZ4DoqMMo6M
-
- can be transformed, invertibly, into the following two
- message/partial messages:
-
-
- From: Nathaniel Borenstein <nsb at bellcore.com>
-
-
-
-
-
- Borenstein [Page 4]
-
-
-
-
- RFC 1344 MIME and Mail Gateways June 1992
-
-
- To: Ned Freed <ned at innosoft.com>
- Subject: a test message
- Content-type: message/partial; id="xyx at host.com";
- number=1; total=2
-
- Content-type: image/gif
- Content-Transfer-Encoding: base64
-
- R0lGODdhQAGMAbMAAAAAAP/u7swzIu6ZiLsiEd1EM+5VRGaI3WYAAO67qkRV
-
- and
-
- From: Nathaniel Borenstein <nsb at bellcore.com>
- To: Ned Freed <ned at innosoft.com>
- Subject: a test message
- Content-type: message/partial; id="xyx at host.com";
- number=2; total=2
-
- uwARd6q7/ywAAAAAQAGMAUME/hDISau9OOvNu/9gKI6kRJwoUa5s675wLM90l
- XW5YKxqPyKRygxv2dr4czwlMCZrQLFTYHBJ2hlyQYFiaz+i0WWBou7fOq1x8vXWfU
- qU1fJ2qEhYaHGjhZQmJ2QT1xBW1ak1xUdV0/VjtsbpUEDaEJCQOIpqeoNV+LXo5W
- fVN3dZKceAQPvgyhwQ2lqcXGxx5wja59eJIGUNCszF90sYp50CoqFZ4DoqMMo6M
-
- Fragmenting such messages rather than rejecting them might
- be a reasonable option for some gateway services, at least
- for a certain range of message sizes. Of course, it is
- often difficult for a gateway to know what size limitations
- will be encountered "downstream", but intelligent guesses
- are often possible. Moreover, an IETF working group on SMTP
- extensions has proposed augmenting SMTP with a "SIZE" verb
- that would facilitate this process, thereby possibly
- requiring fragmentation on the fly during message
- transmission.
-
- Note also that fragmentation or reassembly might reasonably
- be performed, in differing circumstances, by either the
- sending or receiving gateway systems, depending on which
- system knew more about the capabilities of the other.
-
- Using or Removing External-Body Pointers
-
- Another MIME type oriented to extremely large messages is
- the "message/external-body" type. In this type of message,
- all or part of the body data is not included in the actual
- message itself. Instead, the Content-Type header field
- includes information that tells how the body data can be
- retrieved -- either via a file system, via anonymous ftp, or
- via other mechanisms.
-
- The message/external-body type provides a new option for
- mail transport services that wishes to optimize the way
- bandwidth resources are used in a given environment. For
- example, the basic use of message/external-body is to reduce
- bandwidth in email traffic. However, when email crosses a
-
-
-
- Borenstein [Page 5]
-
-
-
-
- RFC 1344 MIME and Mail Gateways June 1992
-
-
- slow and expensive boundary -- e.g., a satellite link across
- the Pacific -- it might make sense to retrieve the data
- itself and transform the external-body reference into the
- actual data. Alternately, it might make sense to copy the
- data itself to a new location, closer to the message
- recipients, and change the location pointed to in the
- message. Because the external-body specification can
- include an expiration date, message transport services can
- trade off storage and bandwidth capabilities to try to
- optimize the overall use of resources for very large
- messages.
-
- Such behaviors by a gateway require careful analysis of
- cost/benefit tradeoffs and would be a dramatic departure
- from typical mail transport services. However, the
- potential benefits are quite significant, so that such the
- appropriate use of these service options should be explored.
-
- For example, the following message includes PostScript data
- by external reference:
-
- From: Nathaniel Borenstein <nsb at bellcore.com>
- To: Ned Freed <ned at innosoft.com>
- Subject: The latest MIME draft
- Content-Type: message/external-body;
- name="BodyFormats.ps";
- site="thumper.bellcore.com";
- access-type=ANON-FTP;
- directory="pub";
- mode="image";
- expiration="Fri, 14 Jun 1991 19:13:14 -0400 (EDT)"
-
- Content-type: application/postscript
-
- A gateway to Australia might choose to copy the file to an
- Australian FTP archive, changing the relevant parameters on
- the Content-type header field. Alternately, it might choose
- simply to transform the message into one in which all the
- data were included:
-
- From: Nathaniel Borenstein <nsb at bellcore.com>
- To: Ned Freed <ned at innosoft.com>
- Subject: The latest MIME draft
- Content-type: application/postscript
-
- %!PS-Adobe-1.0
- %%Creator: greenbush:nsb (Nathaniel Borenstein,MRE 2A-
- 274,4270,9938586,21462)
- etc...
-
- This is an example which suggests both the benefits and the
- dangers. There is considerable benefit to having a copy of
- the data immediately available, but there also may be
- considerable expense involved in transporting it to all of
-
-
-
- Borenstein [Page 6]
-
-
-
-
- RFC 1344 MIME and Mail Gateways June 1992
-
-
- a the members of a list, if only a few will use the data
- anytime soon.
-
- Alternatively, instead of replacing an external-body message
- with its real contents, it might make sense to transform it
- into a "multipart/alternative" message containing both the
- external body reference and the expanded version. This
- means that only the external body part can be forwarded if
- desired, and the recipient doesn't lose the information as
- to where the data was fetched from, if they want to fetch an
- up-to-date version in the future. Such information could be
- represented, in MIME, in the following form:
-
- From: Nathaniel Borenstein <nsb at bellcore.com>
- To: Ned Freed <ned at innosoft.com>
- Subject: The latest MIME draft
- Content-type: multipart/alternative; boundary=foo
-
- --foo
- Content-Type: message/external-body;
- name="BodyFormats.ps";
- site="thumper.bellcore.com";
- access-type=ANON-FTP;
- directory="pub";
- mode="image";
- expiration="Fri, 14 Jun 1991 19:13:14 -0400 (EDT)"
-
- Content-type: application/postscript
- --foo
- Content-type: application/postscript
-
- %!PS-Adobe-1.0
- %%Creator: greenbush:nsb (Nathaniel Borenstein,MRE 2A-
- 274,4270,9938586,21462)
- etc...
- --foo--
-
- Similarly for the case where a message is copied to a local
- FTP site, one could offer two external body parts as the
- alternatives, allowing the user agent to choose which FTP
- site is preferred.
-
- Image and other Format Conversions
-
- MIME currently defines two image formats, image/gif and
- image/jpeg. The former is much more convenient for many
- users, and can be displayed more quickly on many systems.
- The latter is a much more compact representation, and
- therfore places less stress on mail transport facilities.
-
- Message transport services can optimize both transport
- bandwidth and user convenience by intelligent translation
- between these formats (and other formats that might be added
- later). When a message of type image/gif is submitted for
-
-
-
- Borenstein [Page 7]
-
-
-
-
- RFC 1344 MIME and Mail Gateways June 1992
-
-
- long-haul delivery, it might reasonably be translated to
- image/jpeg. Conversely, when image/jpeg data is received
- for final delivery on a system with adequate storage
- resources, it might be translated to image/gif for the
- convenience of the recipient. Software to perform these
- translations is widely available. It should be noted,
- however, that performance of such conversions presumes
- support for the new format by the recipient.
-
- Although MIME currently only defines one audio format, more
- are likely to be defined and registered with IANA in the
- future. In that case, similar format conversion facilities
- might be appropriate for audio.
-
- If format conversion is done, it is STRONGLY RECOMMENDED
- that some kind of trace information (probably in the form of
- a Received header field) should be added to a message to
- document the conversion that has been performed.
-
- Some people have expressed concerns, or even the opinion
- that conversions should never be done. To accomodate the
- desires of those who dislike the idea of automatic format
- conversion. For this reason, it is suggested that such
- transformations be generally restricted to gateways rather
- than general message transport services, and that services
- which perform such conversions should be sensitive to a
- header field that indicates that the sender does not wish to
- have any such conversions performed. A suggested value for
- this header field is:
-
- Content-Conversion: prohibited
-
- User agents that wish to explicitly indicate a willingness
- for such conversions to be performed may use:
-
- Content-Conversion: permitted
-
- However, this will be the default assumption of many
- gateways, so this header field is not strictly necessary.
- It also should be noted that such control of conversion
- would only be available to the sender, rather than to any of
- the recipients.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Borenstein [Page 8]
-
-
-
-
- RFC 1344 MIME and Mail Gateways June 1992
-
-
- Robust Encoding of Data
-
- In addition to all the reasons given above for possible
- transformation of body data, it will sometimes be the case
- that a gateway can tell that the body data, as given, will
- not robustly survive the next step of transport. For
- example, mail crossing an ASCII-to-EBCDIC gateway will lose
- information if certain characters are used. In such cases,
- a gateway can make the data more robust simply by applying
- one of the MIME Content-Transfer-Encoding algorithms (base64
- or quoted-printable) to the body or body part. This will
- generally be a loss-less transformation, but care must be
- taken to ensure that the resulting message is MIME-
- conformant if the inital message was not. (For example, a
- MIME-Version header field may need to be added.)
-
- User-oriented concerns
-
- If a gateway is going to perform major transformations on a
- mail message, such as translating image formats or mapping
- between included data and external-reference data, it seems
- inevitable that there will be situations in which users will
- object to these transformations. This is, in large part, an
- implementation issue, but it seems advisable, wherever
- possible, to provide a mechanism whereby users can specify,
- to the transport system, whether or not they want such
- services performed automatically on their behalf. The use of
- the "Content-Conversion" header field, as mentioned above,
- is suggested for this purpose, since it it least provides
- some control by the sender, if not the recipient.
-
- References
-
- [RFC-1341] Borenstein, N., and N. Freed, "MIME
- (Multipurpose Internet Mail Extensions): Mechanisms for
- Specifying and Describing the Format of Internet Message
- Bodies", RFC 1341, Bellcore, June, 1992.
-
- Security Considerations
-
- Security issues are not discussed in this memo.
-
- Author's Address
-
- Nathaniel S. Borenstein
- MRE 2D-296, Bellcore
- 445 South St.
- Morristown, NJ 07962-1910
-
- Email: nsb at bellcore.com
- Phone: +1 201 829 4270
- Fax: +1 201 829 7019
-
-
-
-
-
- Borenstein [Page 9]
-
-
\ No newline at end of file
diff --git a/reference/rfc1345 Character Mnemonics and Character Sets.txt b/reference/rfc1345 Character Mnemonics and Character Sets.txt
deleted file mode 100644
index 5babe0c..0000000
--- a/reference/rfc1345 Character Mnemonics and Character Sets.txt
+++ /dev/null
@@ -1,5761 +0,0 @@
-
-
-
-
-Network Working Group K. Simonsen
-Request for Comments: 1345 Rationel Almen Planlaegning
- June 1992
-
-
- Character Mnemonics & Character Sets
-
-Status of the Memo
-
- This memo provides information for the Internet community. It does
- not specify an Internet standard. Distribution of this memo is
- unlimited.
-
-Summary
-
- This memo lists a selection of characters and their presence in some
- coded character sets. To facilitate the coded character set
- tabulations an unambiguous mnemonic for each character is used, and a
- format for tabulating the coded character sets is defined. The coded
- character sets are given names for easy reference. A family of coded
- character sets called the mnemonic character sets and conversion
- between these coded character set without information loss is
- defined.
-
- The character set names are registered with the Internet Assigned
- Numbers Authority (IANA). Additional character sets not described in
- this memo should be registered with the IANA. This memo may be
- updated periodically, or additional specifications may be published,
- to reflect other coded character sets.
-
- Please send any comments including comments about the accuracy of the
- tables to the author, Keld Simonsen <Keld.Simonsen at dkuug.dk>.
-
-1. INTRODUCTION
-
- With the growing internationalization of the Internet, support for
- many coded character sets is required. It is the intention of this
- memo to document precisely the mapping between all characters and
- their corresponding coded representations in various coded character
- sets, and give names to these coded character sets, so they can be
- referenced unambiguously in Internet standards.
-
- This memo does not indicate anything about the validity of using
- these specifications in any Internet standard, so you should consult
- each individual Internet standard to see which coded character sets
- and names are allowed there.
-
- Unambiguous character mnemonics are specified, which provide a
- practical way of identifying a character, without reference to a
- coded character set and its code in this coded character set. The
- mnemonics are written in a minimal set of characters, namely the
- invariant 83 graphical characters of ISO 646, which is a kind of
- greatest common subset to be found between the majority of coded
-
-Simonsen [Page 1]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- character sets, including ASCII, national variants of the ISO 646 7-
- bit character set and various EBCDICs. In addition, the numeric
- value of the coded representations of all these characters are the
- same in all coded character sets compatible with ISO standards. All
- of them except two, EXCLAMATION MARK and QUOTATION MARK, have the
- same coded representation in all variants of EBCDIC. This minimal
- set of characters is called the reference character set in this memo.
-
- The mnemonics can be used in Internet standards for easy and
- unambiguous reference, and they can also serve as a fallback
- representation in various Internet specifications.
-
- The coded character sets covered include all parts of ISO 8859, ISO
- 6937-2 and all ISO 646 conforming coded character sets in the ISO
- character set registry managed by ECMA according to ISO 2375. Almost
- all graphic coded character sets in the ECMA registry (1) are
- covered. The graphic coded character sets not included are registry
- numbers 31, 38, 39, 53, 59, 68, 71, 72, 129 and 137. In addition
- many vendor defined character sets are covered, including PC
- codepages (4), (7), (8), many EBCDIC character sets (4), (5), (6) and
- HP, DEC and Apple character sets (8), (9), (10), (13), (14). The
- East-Asian 16-bit character sets from the ECMA registry is also
- included in this memo.
-
-2. CHARACTER MNEMONICS
-
-2.1 General Syntax
-
- The character mnemonics are taken from the ISO committee draft (CD)
- of the POSIX.2 standard (3). They are classified into two groups:
-
-
- 1. A group with two-character mnemonics
- - Primarily intended for alphabetic scripts like Latin, Greek,
- Cyrillic, Hebrew and Arabic, and special characters.
- 2. A group with variable-length mnemonics
- - primarily intended for non-alphabetic scripts like Japanese and
- Chinese, but also used for some accented letters and special
- characters.
-
- In the two-character mnemonics, all invariant graphic character in
- the ISO 646 character codes except "&" are used, i.e. the following
- characters:
-
- ! " % ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- A B C D E F G H I J K L M N O P Q R S T U V W X Y Z _
- a b c d e f g h i j k l m n o p q r s t u v w x y z
-
- The character "_" is not used as the first character.
-
- In the variable-length mnemonics, the character "_" is not used as
- the first character. If it is used in a name, its presence is
- doubled.
-
-Simonsen [Page 2]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- The mnemonics can be used in several different ways for different
- purposes. One of these is description of coded character sets, which
- is detailed in section 3. Another is for extending a given coded
- character set to a mnemonic character set. This is described in
- section 4. The restrictions on the use of the characters "&" and "_"
- are due to demands of the compositional methods of these techniques.
-
-2.2 ISO Official Long Descriptive Character Name
-
- For all mnemonics, the character for which it stands is indicated in
- the following table by a long descriptive name. This name is
- identical to the ISO name of the character as given in reference (2).
- For a few characters that are not included there, descriptive names
- of the same kind are introduced in this memo. The source of each
- character is stated in the table after the name and should be
- consulted for a reliable identification of the character.
-
- These long descriptive names consists only of the capital Latin
- letters of the invariant part of ISO 646, the digits, "-", and SPACE.
- Digits are only used in names of ideographic and Hangul characters
- and never as the first character.
-
-2.3 The 2-character Mnemonics
-
- The two-character mnemonics include various accented Latin letters,
- Greek, Cyrillic, Hebrew, Arabic, Hiragana and Katakana. Also a fair
- number of special characters are included. Almost all ISO or ISO
- registered 7- and 8-bit graphical coded character sets are covered
- with these two-character mnemonics.
-
- The two characters are chosen so the graphical appearance in the
- reference set resembles as much as possible (within the possibilities
- available) the graphical appearance of the character. The basic
- character set of ISO 646 is used as the reference set, as mentioned
- above.
-
- The characters in the reference character set are chosen to represent
- themselves.
-
- For control characters from ISO 646 the two-character acronyms of ISO
- 2047 are used as mnemonics. For the other control characters of ISO
- 6429, two-character mnemonics have been selected based on the
- variable-length acronyms used in that standard.
-
- Letters, including Greek, Cyrillic, Arabic and Hebrew, are
- represented with the base letter as the first letter, and the second
- letter represents an accent or relation to a non-Latin script. Non-
- Latin letters are transliterated to Latin letters, following
- transliteration standards as closely as possible. This is also done
- with the Latin letters such as ETH and THORN, and the
- Danish/Norwegian/Swedish letter A WITH RING ABOVE is transliterated
- into "aa".
-
-
-Simonsen [Page 3]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- After a letter, the second character signifies the following:
-
- Exclamation mark ! Grave
- Apostrophe ' Acute accent
- Greater-Than sign > Circumflex accent
- Question Mark ? tilde
- Hyphen-Minus - Macron
- Left parenthesis ( Breve
- Full Stop . Dot Above
- Colon : Diaeresis
- Comma , Cedilla
- Underline _ Underline
- Solidus / Stroke
- Quotation mark " Double acute accent
- Semicolon ; Ogonek
- Less-Than sign < Caron
- Zero 0 Ring above
- Two 2 Hook
- Nine 9 Horn
-
- Equals = Cyrillic
- Asterisk * Greek
- Percent sign % Greek/Cyrillic special
- Plus + smalls: Arabic, capitals: Hebrew
- Three 3 some Latin/Greek/Cyrillic letters
- Four 4 Bopomofo
- Five 5 Hiragana
- Six 6 Katakana
-
- In designing the mnemonics the following special characters were
- reserved: The ampersand is reserved as an intro character, indicating
- that the following string is in the mnemonic character set. The
- underline character is reserved for the variable-length mnemonics.
- This use does not eliminate usage as an accent or language
- identifier.
-
- Special characters are encoded with some mnemonic value. These are
- not systematic thruout, but most mnemonics start with a related
- special character of the reference set.
-
-2.4 The Variable-length Character Mnemonics
-
- The Variable-length Character Mnemonics are primarily meant for the
- ideographic characters in larger Asian character sets, but are also
- used for accented characters with several accents and some special
- characters. To have the mnemonics as short as possible, which both
- saves storage and is easier to input, a quite short name is
- preferred. Considering the Chinese standard GB 2312-1980, the
- Japanese standards JIS X0208 and JIS X0212, and the Korean standard
- KS C 5601, they are all given by row and column numbers between 1 and
- 94. So two positions for row and column and a character set
- identifier of one character would be almost as short as possible.
- The following character set identifiers are defined:
-
-Simonsen [Page 4]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- c GB 2312-1980
- j JIS X0208-1990
- J JIS X0212-1990
- k KS C 5601-1987
-
- This system for the representation of ideographic characters and
- Hangul characters is not truly mnemonic, but it provides short
- representations that are easy to connect to the corresponding
- character by means of the code table of an official character set
- standard. Alternative methods based on the graphic appearance or the
- pronunciation of the characters are thought to be unfeasible.
-
- One prominent character in the reference character set is reserved
- for identifying variable-length mnemonics, namely the underline
- character "_". This character is intended as a delimiter both in the
- front and in the end of the mnemonic. An example of its use would be:
- (&=intro):
-
- &_j3210_ &_j4436_&_j6530_
-
-3. CHARACTER MNEMONIC TABLE
-
- The following table contains the character mnemonic and the encoding
- and long descriptive name of ISO 2DIS 10646 (2). Although the ISO
- 10646 is only at DIS stage at this moment of writing and there is
- quite some debate about it, the long descriptive naming in the DIS is
- considered to be stable and the best official ISO reference to
- character names. The 2-octet encoded value of the ISO 2DIS 10646 is
- also used, but only as an identification of the character, and it
- should only be used for identification purposes as the coded
- representation may be changed in the final 10646 international
- standard. Some characters not in the ISO 2DIS 10646 are allocated
- values in the private use zone and given names and references to a
- character set where it is used.
-
- The format of the table is:
-
- 1st field is the character mnemonic (mostly 2 characters).
- 2nd field is the ISO 2DIS 10646 code in hexadecimal.
- 3rd field is the long descriptive name of ISO 2DIS 10646.
-
- SP 0020 SPACE
- ! 0021 EXCLAMATION MARK
- " 0022 QUOTATION MARK
- Nb 0023 NUMBER SIGN
- DO 0024 DOLLAR SIGN
- % 0025 PERCENT SIGN
- & 0026 AMPERSAND
- ' 0027 APOSTROPHE
- ( 0028 LEFT PARENTHESIS
- ) 0029 RIGHT PARENTHESIS
- * 002a ASTERISK
- + 002b PLUS SIGN
-
-Simonsen [Page 5]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- , 002c COMMA
- - 002d HYPHEN-MINUS
- . 002e FULL STOP
- / 002f SOLIDUS
- 0 0030 DIGIT ZERO
- 1 0031 DIGIT ONE
- 2 0032 DIGIT TWO
- 3 0033 DIGIT THREE
- 4 0034 DIGIT FOUR
- 5 0035 DIGIT FIVE
- 6 0036 DIGIT SIX
- 7 0037 DIGIT SEVEN
- 8 0038 DIGIT EIGHT
- 9 0039 DIGIT NINE
- : 003a COLON
- ; 003b SEMICOLON
- < 003c LESS-THAN SIGN
- = 003d EQUALS SIGN
- > 003e GREATER-THAN SIGN
- ? 003f QUESTION MARK
- At 0040 COMMERCIAL AT
- A 0041 LATIN CAPITAL LETTER A
- B 0042 LATIN CAPITAL LETTER B
- C 0043 LATIN CAPITAL LETTER C
- D 0044 LATIN CAPITAL LETTER D
- E 0045 LATIN CAPITAL LETTER E
- F 0046 LATIN CAPITAL LETTER F
- G 0047 LATIN CAPITAL LETTER G
- H 0048 LATIN CAPITAL LETTER H
- I 0049 LATIN CAPITAL LETTER I
- J 004a LATIN CAPITAL LETTER J
- K 004b LATIN CAPITAL LETTER K
- L 004c LATIN CAPITAL LETTER L
- M 004d LATIN CAPITAL LETTER M
- N 004e LATIN CAPITAL LETTER N
- O 004f LATIN CAPITAL LETTER O
- P 0050 LATIN CAPITAL LETTER P
- Q 0051 LATIN CAPITAL LETTER Q
- R 0052 LATIN CAPITAL LETTER R
- S 0053 LATIN CAPITAL LETTER S
- T 0054 LATIN CAPITAL LETTER T
- U 0055 LATIN CAPITAL LETTER U
- V 0056 LATIN CAPITAL LETTER V
- W 0057 LATIN CAPITAL LETTER W
- X 0058 LATIN CAPITAL LETTER X
- Y 0059 LATIN CAPITAL LETTER Y
- Z 005a LATIN CAPITAL LETTER Z
- <( 005b LEFT SQUARE BRACKET
- // 005c REVERSE SOLIDUS
- )> 005d RIGHT SQUARE BRACKET
- '> 005e CIRCUMFLEX ACCENT
- _ 005f LOW LINE
- '! 0060 GRAVE ACCENT
-
-Simonsen [Page 6]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- a 0061 LATIN SMALL LETTER A
- b 0062 LATIN SMALL LETTER B
- c 0063 LATIN SMALL LETTER C
- d 0064 LATIN SMALL LETTER D
- e 0065 LATIN SMALL LETTER E
- f 0066 LATIN SMALL LETTER F
- g 0067 LATIN SMALL LETTER G
- h 0068 LATIN SMALL LETTER H
- i 0069 LATIN SMALL LETTER I
- j 006a LATIN SMALL LETTER J
- k 006b LATIN SMALL LETTER K
- l 006c LATIN SMALL LETTER L
- m 006d LATIN SMALL LETTER M
- n 006e LATIN SMALL LETTER N
- o 006f LATIN SMALL LETTER O
- p 0070 LATIN SMALL LETTER P
- q 0071 LATIN SMALL LETTER Q
- r 0072 LATIN SMALL LETTER R
- s 0073 LATIN SMALL LETTER S
- t 0074 LATIN SMALL LETTER T
- u 0075 LATIN SMALL LETTER U
- v 0076 LATIN SMALL LETTER V
- w 0077 LATIN SMALL LETTER W
- x 0078 LATIN SMALL LETTER X
- y 0079 LATIN SMALL LETTER Y
- z 007a LATIN SMALL LETTER Z
- (! 007b LEFT CURLY BRACKET
- !! 007c VERTICAL LINE
- !) 007d RIGHT CURLY BRACKET
- '? 007e TILDE
- NS 00a0 NO-BREAK SPACE
- !I 00a1 INVERTED EXCLAMATION MARK
- Ct 00a2 CENT SIGN
- Pd 00a3 POUND SIGN
- Cu 00a4 CURRENCY SIGN
- Ye 00a5 YEN SIGN
- BB 00a6 BROKEN BAR
- SE 00a7 SECTION SIGN
- ': 00a8 DIAERESIS
- Co 00a9 COPYRIGHT SIGN
- -a 00aa FEMININE ORDINAL INDICATOR
- << 00ab LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
- NO 00ac NOT SIGN
- -- 00ad SOFT HYPHEN
- Rg 00ae REGISTERED SIGN
- 'm 00af MACRON
- DG 00b0 DEGREE SIGN
- +- 00b1 PLUS-MINUS SIGN
- 2S 00b2 SUPERSCRIPT TWO
- 3S 00b3 SUPERSCRIPT THREE
- '' 00b4 ACUTE ACCENT
- My 00b5 MICRO SIGN
- PI 00b6 PILCROW SIGN
-
-Simonsen [Page 7]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- .M 00b7 MIDDLE DOT
- ', 00b8 CEDILLA
- 1S 00b9 SUPERSCRIPT ONE
- -o 00ba MASCULINE ORDINAL INDICATOR
- >> 00bb RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
- 14 00bc VULGAR FRACTION ONE QUARTER
- 12 00bd VULGAR FRACTION ONE HALF
- 34 00be VULGAR FRACTION THREE QUARTERS
- ?I 00bf INVERTED QUESTION MARK
- A! 00c0 LATIN CAPITAL LETTER A WITH GRAVE
- A' 00c1 LATIN CAPITAL LETTER A WITH ACUTE
- A> 00c2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
- A? 00c3 LATIN CAPITAL LETTER A WITH TILDE
- A: 00c4 LATIN CAPITAL LETTER A WITH DIAERESIS
- AA 00c5 LATIN CAPITAL LETTER A WITH RING ABOVE
- AE 00c6 LATIN CAPITAL LETTER AE
- C, 00c7 LATIN CAPITAL LETTER C WITH CEDILLA
- E! 00c8 LATIN CAPITAL LETTER E WITH GRAVE
- E' 00c9 LATIN CAPITAL LETTER E WITH ACUTE
- E> 00ca LATIN CAPITAL LETTER E WITH CIRCUMFLEX
- E: 00cb LATIN CAPITAL LETTER E WITH DIAERESIS
- I! 00cc LATIN CAPITAL LETTER I WITH GRAVE
- I' 00cd LATIN CAPITAL LETTER I WITH ACUTE
- I> 00ce LATIN CAPITAL LETTER I WITH CIRCUMFLEX
- I: 00cf LATIN CAPITAL LETTER I WITH DIAERESIS
- D- 00d0 LATIN CAPITAL LETTER ETH (Icelandic)
- N? 00d1 LATIN CAPITAL LETTER N WITH TILDE
- O! 00d2 LATIN CAPITAL LETTER O WITH GRAVE
- O' 00d3 LATIN CAPITAL LETTER O WITH ACUTE
- O> 00d4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
- O? 00d5 LATIN CAPITAL LETTER O WITH TILDE
- O: 00d6 LATIN CAPITAL LETTER O WITH DIAERESIS
- *X 00d7 MULTIPLICATION SIGN
- O/ 00d8 LATIN CAPITAL LETTER O WITH STROKE
- U! 00d9 LATIN CAPITAL LETTER U WITH GRAVE
- U' 00da LATIN CAPITAL LETTER U WITH ACUTE
- U> 00db LATIN CAPITAL LETTER U WITH CIRCUMFLEX
- U: 00dc LATIN CAPITAL LETTER U WITH DIAERESIS
- Y' 00dd LATIN CAPITAL LETTER Y WITH ACUTE
- TH 00de LATIN CAPITAL LETTER THORN (Icelandic)
- ss 00df LATIN SMALL LETTER SHARP S (German)
- a! 00e0 LATIN SMALL LETTER A WITH GRAVE
- a' 00e1 LATIN SMALL LETTER A WITH ACUTE
- a> 00e2 LATIN SMALL LETTER A WITH CIRCUMFLEX
- a? 00e3 LATIN SMALL LETTER A WITH TILDE
- a: 00e4 LATIN SMALL LETTER A WITH DIAERESIS
- aa 00e5 LATIN SMALL LETTER A WITH RING ABOVE
- ae 00e6 LATIN SMALL LETTER AE
- c, 00e7 LATIN SMALL LETTER C WITH CEDILLA
- e! 00e8 LATIN SMALL LETTER E WITH GRAVE
- e' 00e9 LATIN SMALL LETTER E WITH ACUTE
- e> 00ea LATIN SMALL LETTER E WITH CIRCUMFLEX
- e: 00eb LATIN SMALL LETTER E WITH DIAERESIS
-
-Simonsen [Page 8]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- i! 00ec LATIN SMALL LETTER I WITH GRAVE
- i' 00ed LATIN SMALL LETTER I WITH ACUTE
- i> 00ee LATIN SMALL LETTER I WITH CIRCUMFLEX
- i: 00ef LATIN SMALL LETTER I WITH DIAERESIS
- d- 00f0 LATIN SMALL LETTER ETH (Icelandic)
- n? 00f1 LATIN SMALL LETTER N WITH TILDE
- o! 00f2 LATIN SMALL LETTER O WITH GRAVE
- o' 00f3 LATIN SMALL LETTER O WITH ACUTE
- o> 00f4 LATIN SMALL LETTER O WITH CIRCUMFLEX
- o? 00f5 LATIN SMALL LETTER O WITH TILDE
- o: 00f6 LATIN SMALL LETTER O WITH DIAERESIS
- -: 00f7 DIVISION SIGN
- o/ 00f8 LATIN SMALL LETTER O WITH STROKE
- u! 00f9 LATIN SMALL LETTER U WITH GRAVE
- u' 00fa LATIN SMALL LETTER U WITH ACUTE
- u> 00fb LATIN SMALL LETTER U WITH CIRCUMFLEX
- u: 00fc LATIN SMALL LETTER U WITH DIAERESIS
- y' 00fd LATIN SMALL LETTER Y WITH ACUTE
- th 00fe LATIN SMALL LETTER THORN (Icelandic)
- y: 00ff LATIN SMALL LETTER Y WITH DIAERESIS
- A- 0100 LATIN CAPITAL LETTER A WITH MACRON
- a- 0101 LATIN SMALL LETTER A WITH MACRON
- A( 0102 LATIN CAPITAL LETTER A WITH BREVE
- a( 0103 LATIN SMALL LETTER A WITH BREVE
- A; 0104 LATIN CAPITAL LETTER A WITH OGONEK
- a; 0105 LATIN SMALL LETTER A WITH OGONEK
- C' 0106 LATIN CAPITAL LETTER C WITH ACUTE
- c' 0107 LATIN SMALL LETTER C WITH ACUTE
- C> 0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX
- c> 0109 LATIN SMALL LETTER C WITH CIRCUMFLEX
- C. 010a LATIN CAPITAL LETTER C WITH DOT ABOVE
- c. 010b LATIN SMALL LETTER C WITH DOT ABOVE
- C< 010c LATIN CAPITAL LETTER C WITH CARON
- c< 010d LATIN SMALL LETTER C WITH CARON
- D< 010e LATIN CAPITAL LETTER D WITH CARON
- d< 010f LATIN SMALL LETTER D WITH CARON
- D/ 0110 LATIN CAPITAL LETTER D WITH STROKE
- d/ 0111 LATIN SMALL LETTER D WITH STROKE
- E- 0112 LATIN CAPITAL LETTER E WITH MACRON
- e- 0113 LATIN SMALL LETTER E WITH MACRON
- E( 0114 LATIN CAPITAL LETTER E WITH BREVE
- e( 0115 LATIN SMALL LETTER E WITH BREVE
- E. 0116 LATIN CAPITAL LETTER E WITH DOT ABOVE
- e. 0117 LATIN SMALL LETTER E WITH DOT ABOVE
- E; 0118 LATIN CAPITAL LETTER E WITH OGONEK
- e; 0119 LATIN SMALL LETTER E WITH OGONEK
- E< 011a LATIN CAPITAL LETTER E WITH CARON
- e< 011b LATIN SMALL LETTER E WITH CARON
- G> 011c LATIN CAPITAL LETTER G WITH CIRCUMFLEX
- g> 011d LATIN SMALL LETTER G WITH CIRCUMFLEX
- G( 011e LATIN CAPITAL LETTER G WITH BREVE
- g( 011f LATIN SMALL LETTER G WITH BREVE
- G. 0120 LATIN CAPITAL LETTER G WITH DOT ABOVE
-
-Simonsen [Page 9]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- g. 0121 LATIN SMALL LETTER G WITH DOT ABOVE
- G, 0122 LATIN CAPITAL LETTER G WITH CEDILLA
- g, 0123 LATIN SMALL LETTER G WITH CEDILLA
- H> 0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX
- h> 0125 LATIN SMALL LETTER H WITH CIRCUMFLEX
- H/ 0126 LATIN CAPITAL LETTER H WITH STROKE
- h/ 0127 LATIN SMALL LETTER H WITH STROKE
- I? 0128 LATIN CAPITAL LETTER I WITH TILDE
- i? 0129 LATIN SMALL LETTER I WITH TILDE
- I- 012a LATIN CAPITAL LETTER I WITH MACRON
- i- 012b LATIN SMALL LETTER I WITH MACRON
- I( 012c LATIN CAPITAL LETTER I WITH BREVE
- i( 012d LATIN SMALL LETTER I WITH BREVE
- I; 012e LATIN CAPITAL LETTER I WITH OGONEK
- i; 012f LATIN SMALL LETTER I WITH OGONEK
- I. 0130 LATIN CAPITAL LETTER I WITH DOT ABOVE
- i. 0131 LATIN SMALL LETTER I DOTLESS
- IJ 0132 LATIN CAPITAL LIGATURE IJ
- ij 0133 LATIN SMALL LIGATURE IJ
- J> 0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX
- j> 0135 LATIN SMALL LETTER J WITH CIRCUMFLEX
- K, 0136 LATIN CAPITAL LETTER K WITH CEDILLA
- k, 0137 LATIN SMALL LETTER K WITH CEDILLA
- kk 0138 LATIN SMALL LETTER KRA (Greenlandic)
- L' 0139 LATIN CAPITAL LETTER L WITH ACUTE
- l' 013a LATIN SMALL LETTER L WITH ACUTE
- L, 013b LATIN CAPITAL LETTER L WITH CEDILLA
- l, 013c LATIN SMALL LETTER L WITH CEDILLA
- L< 013d LATIN CAPITAL LETTER L WITH CARON
- l< 013e LATIN SMALL LETTER L WITH CARON
- L. 013f LATIN CAPITAL LETTER L WITH MIDDLE DOT
- l. 0140 LATIN SMALL LETTER L WITH MIDDLE DOT
- L/ 0141 LATIN CAPITAL LETTER L WITH STROKE
- l/ 0142 LATIN SMALL LETTER L WITH STROKE
- N' 0143 LATIN CAPITAL LETTER N WITH ACUTE
- n' 0144 LATIN SMALL LETTER N WITH ACUTE
- N, 0145 LATIN CAPITAL LETTER N WITH CEDILLA
- n, 0146 LATIN SMALL LETTER N WITH CEDILLA
- N< 0147 LATIN CAPITAL LETTER N WITH CARON
- n< 0148 LATIN SMALL LETTER N WITH CARON
- 'n 0149 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
- NG 014a LATIN CAPITAL LETTER ENG (Lappish)
- ng 014b LATIN SMALL LETTER ENG (Lappish)
- O- 014c LATIN CAPITAL LETTER O WITH MACRON
- o- 014d LATIN SMALL LETTER O WITH MACRON
- O( 014e LATIN CAPITAL LETTER O WITH BREVE
- o( 014f LATIN SMALL LETTER O WITH BREVE
- O" 0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
- o" 0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE
- OE 0152 LATIN CAPITAL LIGATURE OE
- oe 0153 LATIN SMALL LIGATURE OE
- R' 0154 LATIN CAPITAL LETTER R WITH ACUTE
- r' 0155 LATIN SMALL LETTER R WITH ACUTE
-
-Simonsen [Page 10]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- R, 0156 LATIN CAPITAL LETTER R WITH CEDILLA
- r, 0157 LATIN SMALL LETTER R WITH CEDILLA
- R< 0158 LATIN CAPITAL LETTER R WITH CARON
- r< 0159 LATIN SMALL LETTER R WITH CARON
- S' 015a LATIN CAPITAL LETTER S WITH ACUTE
- s' 015b LATIN SMALL LETTER S WITH ACUTE
- S> 015c LATIN CAPITAL LETTER S WITH CIRCUMFLEX
- s> 015d LATIN SMALL LETTER S WITH CIRCUMFLEX
- S, 015e LATIN CAPITAL LETTER S WITH CEDILLA
- s, 015f LATIN SMALL LETTER S WITH CEDILLA
- S< 0160 LATIN CAPITAL LETTER S WITH CARON
- s< 0161 LATIN SMALL LETTER S WITH CARON
- T, 0162 LATIN CAPITAL LETTER T WITH CEDILLA
- t, 0163 LATIN SMALL LETTER T WITH CEDILLA
- T< 0164 LATIN CAPITAL LETTER T WITH CARON
- t< 0165 LATIN SMALL LETTER T WITH CARON
- T/ 0166 LATIN CAPITAL LETTER T WITH STROKE
- t/ 0167 LATIN SMALL LETTER T WITH STROKE
- U? 0168 LATIN CAPITAL LETTER U WITH TILDE
- u? 0169 LATIN SMALL LETTER U WITH TILDE
- U- 016a LATIN CAPITAL LETTER U WITH MACRON
- u- 016b LATIN SMALL LETTER U WITH MACRON
- U( 016c LATIN CAPITAL LETTER U WITH BREVE
- u( 016d LATIN SMALL LETTER U WITH BREVE
- U0 016e LATIN CAPITAL LETTER U WITH RING ABOVE
- u0 016f LATIN SMALL LETTER U WITH RING ABOVE
- U" 0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
- u" 0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE
- U; 0172 LATIN CAPITAL LETTER U WITH OGONEK
- u; 0173 LATIN SMALL LETTER U WITH OGONEK
- W> 0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX
- w> 0175 LATIN SMALL LETTER W WITH CIRCUMFLEX
- Y> 0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
- y> 0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX
- Y: 0178 LATIN CAPITAL LETTER Y WITH DIAERESIS
- Z' 0179 LATIN CAPITAL LETTER Z WITH ACUTE
- z' 017a LATIN SMALL LETTER Z WITH ACUTE
- Z. 017b LATIN CAPITAL LETTER Z WITH DOT ABOVE
- z. 017c LATIN SMALL LETTER Z WITH DOT ABOVE
- Z< 017d LATIN CAPITAL LETTER Z WITH CARON
- z< 017e LATIN SMALL LETTER Z WITH CARON
- O9 01a0 LATIN CAPITAL LETTER O WITH HORN
- o9 01a1 LATIN SMALL LETTER O WITH HORN
- OI 01a2 LATIN CAPITAL LETTER OI
- oi 01a3 LATIN SMALL LETTER OI
- yr 01a6 LATIN LETTER YR
- U9 01af LATIN CAPITAL LETTER U WITH HORN
- u9 01b0 LATIN SMALL LETTER U WITH HORN
- Z/ 01b5 LATIN CAPITAL LETTER Z WITH STROKE
- z/ 01b6 LATIN SMALL LETTER Z WITH STROKE
- ED 01b7 LATIN CAPITAL LETTER EZH
- A< 01cd LATIN CAPITAL LETTER A WITH CARON
- a< 01ce LATIN SMALL LETTER A WITH CARON
-
-Simonsen [Page 11]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- I< 01cf LATIN CAPITAL LETTER I WITH CARON
- i< 01d0 LATIN SMALL LETTER I WITH CARON
- O< 01d1 LATIN CAPITAL LETTER O WITH CARON
- o< 01d2 LATIN SMALL LETTER O WITH CARON
- U< 01d3 LATIN CAPITAL LETTER U WITH CARON
- u< 01d4 LATIN SMALL LETTER U WITH CARON
- U:- 01d5 LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
- u:- 01d6 LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
- U:' 01d7 LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
- u:' 01d8 LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
- U:< 01d9 LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
- u:< 01da LATIN SMALL LETTER U WITH DIAERESIS AND CARON
- U:! 01db LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
- u:! 01dc LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
- A1 01de LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
- a1 01df LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
- A7 01e0 LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
- a7 01e1 LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
- A3 01e2 LATIN CAPITAL LETTER AE WITH MACRON
- a3 01e3 LATIN SMALL LETTER AE WITH MACRON
- G/ 01e4 LATIN CAPITAL LETTER G WITH STROKE
- g/ 01e5 LATIN SMALL LETTER G WITH STROKE
- G< 01e6 LATIN CAPITAL LETTER G WITH CARON
- g< 01e7 LATIN SMALL LETTER G WITH CARON
- K< 01e8 LATIN CAPITAL LETTER K WITH CARON
- k< 01e9 LATIN SMALL LETTER K WITH CARON
- O; 01ea LATIN CAPITAL LETTER O WITH OGONEK
- o; 01eb LATIN SMALL LETTER O WITH OGONEK
- O1 01ec LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
- o1 01ed LATIN SMALL LETTER O WITH OGONEK AND MACRON
- EZ 01ee LATIN CAPITAL LETTER EZH WITH CARON
- ez 01ef LATIN SMALL LETTER EZH WITH CARON
- j< 01f0 LATIN SMALL LETTER J WITH CARON
- G' 01f4 LATIN CAPITAL LETTER G WITH ACUTE
- g' 01f5 LATIN SMALL LETTER G WITH ACUTE
- AA' 01fa LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
- aa' 01fb LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
- AE' 01fc LATIN CAPITAL LETTER AE WITH ACUTE
- ae' 01fd LATIN SMALL LETTER AE WITH ACUTE
- O/' 01fe LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
- o/' 01ff LATIN SMALL LETTER O WITH STROKE AND ACUTE
- ;S 02bf MODIFIER LETTER LEFT HALF RING
- '< 02c7 CARON
- '( 02d8 BREVE
- '. 02d9 DOT ABOVE
- '0 02da RING ABOVE
- '; 02db OGONEK
- '" 02dd DOUBLE ACUTE ACCENT
- A% 0386 GREEK CAPITAL LETTER ALPHA WITH ACUTE
- E% 0388 GREEK CAPITAL LETTER EPSILON WITH ACUTE
- Y% 0389 GREEK CAPITAL LETTER ETA WITH ACUTE
- I% 038a GREEK CAPITAL LETTER IOTA WITH ACUTE
- O% 038c GREEK CAPITAL LETTER OMICRON WITH ACUTE
-
-Simonsen [Page 12]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- U% 038e GREEK CAPITAL LETTER UPSILON WITH ACUTE
- W% 038f GREEK CAPITAL LETTER OMEGA WITH ACUTE
- i3 0390 GREEK SMALL LETTER IOTA WITH ACUTE AND DIAERESIS
- A* 0391 GREEK CAPITAL LETTER ALPHA
- B* 0392 GREEK CAPITAL LETTER BETA
- G* 0393 GREEK CAPITAL LETTER GAMMA
- D* 0394 GREEK CAPITAL LETTER DELTA
- E* 0395 GREEK CAPITAL LETTER EPSILON
- Z* 0396 GREEK CAPITAL LETTER ZETA
- Y* 0397 GREEK CAPITAL LETTER ETA
- H* 0398 GREEK CAPITAL LETTER THETA
- I* 0399 GREEK CAPITAL LETTER IOTA
- K* 039a GREEK CAPITAL LETTER KAPPA
- L* 039b GREEK CAPITAL LETTER LAMDA
- M* 039c GREEK CAPITAL LETTER MU
- N* 039d GREEK CAPITAL LETTER NU
- C* 039e GREEK CAPITAL LETTER XI
- O* 039f GREEK CAPITAL LETTER OMICRON
- P* 03a0 GREEK CAPITAL LETTER PI
- R* 03a1 GREEK CAPITAL LETTER RHO
- S* 03a3 GREEK CAPITAL LETTER SIGMA
- T* 03a4 GREEK CAPITAL LETTER TAU
- U* 03a5 GREEK CAPITAL LETTER UPSILON
- F* 03a6 GREEK CAPITAL LETTER PHI
- X* 03a7 GREEK CAPITAL LETTER CHI
- Q* 03a8 GREEK CAPITAL LETTER PSI
- W* 03a9 GREEK CAPITAL LETTER OMEGA
- J* 03aa GREEK CAPITAL LETTER IOTA WITH DIAERESIS
- V* 03ab GREEK CAPITAL LETTER UPSILON WITH DIAERESIS
- a% 03ac GREEK SMALL LETTER ALPHA WITH ACUTE
- e% 03ad GREEK SMALL LETTER EPSILON WITH ACUTE
- y% 03ae GREEK SMALL LETTER ETA WITH ACUTE
- i% 03af GREEK SMALL LETTER IOTA WITH ACUTE
- u3 03b0 GREEK SMALL LETTER UPSILON WITH ACUTE AND DIAERESIS
- a* 03b1 GREEK SMALL LETTER ALPHA
- b* 03b2 GREEK SMALL LETTER BETA
- g* 03b3 GREEK SMALL LETTER GAMMA
- d* 03b4 GREEK SMALL LETTER DELTA
- e* 03b5 GREEK SMALL LETTER EPSILON
- z* 03b6 GREEK SMALL LETTER ZETA
- y* 03b7 GREEK SMALL LETTER ETA
- h* 03b8 GREEK SMALL LETTER THETA
- i* 03b9 GREEK SMALL LETTER IOTA
- k* 03ba GREEK SMALL LETTER KAPPA
- l* 03bb GREEK SMALL LETTER LAMDA
- m* 03bc GREEK SMALL LETTER MU
- n* 03bd GREEK SMALL LETTER NU
- c* 03be GREEK SMALL LETTER XI
- o* 03bf GREEK SMALL LETTER OMICRON
- p* 03c0 GREEK SMALL LETTER PI
- r* 03c1 GREEK SMALL LETTER RHO
- *s 03c2 GREEK SMALL LETTER FINAL SIGMA
- s* 03c3 GREEK SMALL LETTER SIGMA
-
-Simonsen [Page 13]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- t* 03c4 GREEK SMALL LETTER TAU
- u* 03c5 GREEK SMALL LETTER UPSILON
- f* 03c6 GREEK SMALL LETTER PHI
- x* 03c7 GREEK SMALL LETTER CHI
- q* 03c8 GREEK SMALL LETTER PSI
- w* 03c9 GREEK SMALL LETTER OMEGA
- j* 03ca GREEK SMALL LETTER IOTA WITH DIAERESIS
- v* 03cb GREEK SMALL LETTER UPSILON WITH DIAERESIS
- o% 03cc GREEK SMALL LETTER OMICRON WITH ACUTE
- u% 03cd GREEK SMALL LETTER UPSILON WITH ACUTE
- w% 03ce GREEK SMALL LETTER OMEGA WITH ACUTE
- 'G 03d8 GREEK NUMERAL SIGN
- ,G 03d9 GREEK LOWER NUMERAL SIGN
- T3 03da GREEK CAPITAL LETTER STIGMA
- t3 03db GREEK SMALL LETTER STIGMA
- M3 03dc GREEK CAPITAL LETTER DIGAMMA
- m3 03dd GREEK SMALL LETTER DIGAMMA
- K3 03de GREEK CAPITAL LETTER KOPPA
- k3 03df GREEK SMALL LETTER KOPPA
- P3 03e0 GREEK CAPITAL LETTER SAMPI
- p3 03e1 GREEK SMALL LETTER SAMPI
- '% 03f4 ACUTE ACCENT AND DIAERESIS (Tonos and Dialytika)
- j3 03f5 GREEK IOTA BELOW
- IO 0401 CYRILLIC CAPITAL LETTER IO
- D% 0402 CYRILLIC CAPITAL LETTER DJE (Serbocroatian)
- G% 0403 CYRILLIC CAPITAL LETTER GJE (Macedonian)
- IE 0404 CYRILLIC CAPITAL LETTER UKRAINIAN IE
- DS 0405 CYRILLIC CAPITAL LETTER DZE (Macedonian)
- II 0406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
- YI 0407 CYRILLIC CAPITAL LETTER YI (Ukrainian)
- J% 0408 CYRILLIC CAPITAL LETTER JE
- LJ 0409 CYRILLIC CAPITAL LETTER LJE
- NJ 040a CYRILLIC CAPITAL LETTER NJE
- Ts 040b CYRILLIC CAPITAL LETTER TSHE (Serbocroatian)
- KJ 040c CYRILLIC CAPITAL LETTER KJE (Macedonian)
- V% 040e CYRILLIC CAPITAL LETTER SHORT U (Byelorussian)
- DZ 040f CYRILLIC CAPITAL LETTER DZHE
- A= 0410 CYRILLIC CAPITAL LETTER A
- B= 0411 CYRILLIC CAPITAL LETTER BE
- V= 0412 CYRILLIC CAPITAL LETTER VE
- G= 0413 CYRILLIC CAPITAL LETTER GHE
- D= 0414 CYRILLIC CAPITAL LETTER DE
- E= 0415 CYRILLIC CAPITAL LETTER IE
- Z% 0416 CYRILLIC CAPITAL LETTER ZHE
- Z= 0417 CYRILLIC CAPITAL LETTER ZE
- I= 0418 CYRILLIC CAPITAL LETTER I
- J= 0419 CYRILLIC CAPITAL LETTER SHORT I
- K= 041a CYRILLIC CAPITAL LETTER KA
- L= 041b CYRILLIC CAPITAL LETTER EL
- M= 041c CYRILLIC CAPITAL LETTER EM
- N= 041d CYRILLIC CAPITAL LETTER EN
- O= 041e CYRILLIC CAPITAL LETTER O
- P= 041f CYRILLIC CAPITAL LETTER PE
-
-Simonsen [Page 14]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- R= 0420 CYRILLIC CAPITAL LETTER ER
- S= 0421 CYRILLIC CAPITAL LETTER ES
- T= 0422 CYRILLIC CAPITAL LETTER TE
- U= 0423 CYRILLIC CAPITAL LETTER U
- F= 0424 CYRILLIC CAPITAL LETTER EF
- H= 0425 CYRILLIC CAPITAL LETTER HA
- C= 0426 CYRILLIC CAPITAL LETTER TSE
- C% 0427 CYRILLIC CAPITAL LETTER CHE
- S% 0428 CYRILLIC CAPITAL LETTER SHA
- Sc 0429 CYRILLIC CAPITAL LETTER SHCHA
- =" 042a CYRILLIC CAPITAL LETTER HARD SIGN
- Y= 042b CYRILLIC CAPITAL LETTER YERU
- %" 042c CYRILLIC CAPITAL LETTER SOFT SIGN
- JE 042d CYRILLIC CAPITAL LETTER E
- JU 042e CYRILLIC CAPITAL LETTER YU
- JA 042f CYRILLIC CAPITAL LETTER YA
- a= 0430 CYRILLIC SMALL LETTER A
- b= 0431 CYRILLIC SMALL LETTER BE
- v= 0432 CYRILLIC SMALL LETTER VE
- g= 0433 CYRILLIC SMALL LETTER GHE
- d= 0434 CYRILLIC SMALL LETTER DE
- e= 0435 CYRILLIC SMALL LETTER IE
- z% 0436 CYRILLIC SMALL LETTER ZHE
- z= 0437 CYRILLIC SMALL LETTER ZE
- i= 0438 CYRILLIC SMALL LETTER I
- j= 0439 CYRILLIC SMALL LETTER SHORT I
- k= 043a CYRILLIC SMALL LETTER KA
- l= 043b CYRILLIC SMALL LETTER EL
- m= 043c CYRILLIC SMALL LETTER EM
- n= 043d CYRILLIC SMALL LETTER EN
- o= 043e CYRILLIC SMALL LETTER O
- p= 043f CYRILLIC SMALL LETTER PE
- r= 0440 CYRILLIC SMALL LETTER ER
- s= 0441 CYRILLIC SMALL LETTER ES
- t= 0442 CYRILLIC SMALL LETTER TE
- u= 0443 CYRILLIC SMALL LETTER U
- f= 0444 CYRILLIC SMALL LETTER EF
- h= 0445 CYRILLIC SMALL LETTER HA
- c= 0446 CYRILLIC SMALL LETTER TSE
- c% 0447 CYRILLIC SMALL LETTER CHE
- s% 0448 CYRILLIC SMALL LETTER SHA
- sc 0449 CYRILLIC SMALL LETTER SHCHA
- =' 044a CYRILLIC SMALL LETTER HARD SIGN
- y= 044b CYRILLIC SMALL LETTER YERU
- %' 044c CYRILLIC SMALL LETTER SOFT SIGN
- je 044d CYRILLIC SMALL LETTER E
- ju 044e CYRILLIC SMALL LETTER YU
- ja 044f CYRILLIC SMALL LETTER YA
- io 0451 CYRILLIC SMALL LETTER IO
- d% 0452 CYRILLIC SMALL LETTER DJE (Serbocroatian)
- g% 0453 CYRILLIC SMALL LETTER GJE (Macedonian)
- ie 0454 CYRILLIC SMALL LETTER UKRAINIAN IE
- ds 0455 CYRILLIC SMALL LETTER DZE (Macedonian)
-
-Simonsen [Page 15]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- ii 0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
- yi 0457 CYRILLIC SMALL LETTER YI (Ukrainian)
- j% 0458 CYRILLIC SMALL LETTER JE
- lj 0459 CYRILLIC SMALL LETTER LJE
- nj 045a CYRILLIC SMALL LETTER NJE
- ts 045b CYRILLIC SMALL LETTER TSHE (Serbocroatian)
- kj 045c CYRILLIC SMALL LETTER KJE (Macedonian)
- v% 045e CYRILLIC SMALL LETTER SHORT U (Byelorussian)
- dz 045f CYRILLIC SMALL LETTER DZHE
- Y3 0462 CYRILLIC CAPITAL LETTER YAT
- y3 0463 CYRILLIC SMALL LETTER YAT
- O3 046a CYRILLIC CAPITAL LETTER BIG YUS
- o3 046b CYRILLIC SMALL LETTER BIG YUS
- F3 0472 CYRILLIC CAPITAL LETTER FITA
- f3 0473 CYRILLIC SMALL LETTER FITA
- V3 0474 CYRILLIC CAPITAL LETTER IZHITSA
- v3 0475 CYRILLIC SMALL LETTER IZHITSA
- C3 0480 CYRILLIC CAPITAL LETTER KOPPA
- c3 0481 CYRILLIC SMALL LETTER KOPPA
- G3 0490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN
- g3 0491 CYRILLIC SMALL LETTER GHE WITH UPTURN
- A+ 05d0 HEBREW LETTER ALEF
- B+ 05d1 HEBREW LETTER BET
- G+ 05d2 HEBREW LETTER GIMEL
- D+ 05d3 HEBREW LETTER DALET
- H+ 05d4 HEBREW LETTER HE
- W+ 05d5 HEBREW LETTER VAV
- Z+ 05d6 HEBREW LETTER ZAYIN
- X+ 05d7 HEBREW LETTER HET
- Tj 05d8 HEBREW LETTER TET
- J+ 05d9 HEBREW LETTER YOD
- K% 05da HEBREW LETTER FINAL KAF
- K+ 05db HEBREW LETTER KAF
- L+ 05dc HEBREW LETTER LAMED
- M% 05dd HEBREW LETTER FINAL MEM
- M+ 05de HEBREW LETTER MEM
- N% 05df HEBREW LETTER FINAL NUN
- N+ 05e0 HEBREW LETTER NUN
- S+ 05e1 HEBREW LETTER SAMEKH
- E+ 05e2 HEBREW LETTER AYIN
- P% 05e3 HEBREW LETTER FINAL PE
- P+ 05e4 HEBREW LETTER PE
- Zj 05e5 HEBREW LETTER FINAL TSADI
- ZJ 05e6 HEBREW LETTER TSADI
- Q+ 05e7 HEBREW LETTER QOF
- R+ 05e8 HEBREW LETTER RESH
- Sh 05e9 HEBREW LETTER SHIN
- T+ 05ea HEBREW LETTER TAV
- ,+ 060c ARABIC COMMA
- ;+ 061b ARABIC SEMICOLON
- ?+ 061f ARABIC QUESTION MARK
- H' 0621 ARABIC LETTER HAMZA
- aM 0622 ARABIC LETTER ALEF WITH MADDA ABOVE
-
-Simonsen [Page 16]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- aH 0623 ARABIC LETTER ALEF WITH HAMZA ABOVE
- wH 0624 ARABIC LETTER WAW WITH HAMZA ABOVE
- ah 0625 ARABIC LETTER ALEF WITH HAMZA BELOW
- yH 0626 ARABIC LETTER YEH WITH HAMZA ABOVE
- a+ 0627 ARABIC LETTER ALEF
- b+ 0628 ARABIC LETTER BEH
- tm 0629 ARABIC LETTER TEH MARBUTA
- t+ 062a ARABIC LETTER TEH
- tk 062b ARABIC LETTER THEH
- g+ 062c ARABIC LETTER JEEM
- hk 062d ARABIC LETTER HAH
- x+ 062e ARABIC LETTER KHAH
- d+ 062f ARABIC LETTER DAL
- dk 0630 ARABIC LETTER THAL
- r+ 0631 ARABIC LETTER REH
- z+ 0632 ARABIC LETTER ZAIN
- s+ 0633 ARABIC LETTER SEEN
- sn 0634 ARABIC LETTER SHEEN
- c+ 0635 ARABIC LETTER SAD
- dd 0636 ARABIC LETTER DAD
- tj 0637 ARABIC LETTER TAH
- zH 0638 ARABIC LETTER ZAH
- e+ 0639 ARABIC LETTER AIN
- i+ 063a ARABIC LETTER GHAIN
- ++ 0640 ARABIC TATWEEL
- f+ 0641 ARABIC LETTER FEH
- q+ 0642 ARABIC LETTER QAF
- k+ 0643 ARABIC LETTER KAF
- l+ 0644 ARABIC LETTER LAM
- m+ 0645 ARABIC LETTER MEEM
- n+ 0646 ARABIC LETTER NOON
- h+ 0647 ARABIC LETTER HEH
- w+ 0648 ARABIC LETTER WAW
- j+ 0649 ARABIC LETTER ALEF MAKSURA
- y+ 064a ARABIC LETTER YEH
- :+ 064b ARABIC FATHATAN
- "+ 064c ARABIC DAMMATAN
- =+ 064d ARABIC KASRATAN
- /+ 064e ARABIC FATHA
- '+ 064f ARABIC DAMMA
- 1+ 0650 ARABIC KASRA
- 3+ 0651 ARABIC SHADDA
- 0+ 0652 ARABIC SUKUN
- aS 0670 SUPERSCRIPT ARABIC LETTER ALEF
- p+ 067e ARABIC LETTER PEH
- v+ 06a4 ARABIC LETTER VEH
- gf 06af ARABIC LETTER GAF
- 0a 06f0 EASTERN ARABIC-INDIC DIGIT ZERO
- 1a 06f1 EASTERN ARABIC-INDIC DIGIT ONE
- 2a 06f2 EASTERN ARABIC-INDIC DIGIT TWO
- 3a 06f3 EASTERN ARABIC-INDIC DIGIT THREE
- 4a 06f4 EASTERN ARABIC-INDIC DIGIT FOUR
- 5a 06f5 EASTERN ARABIC-INDIC DIGIT FIVE
-
-Simonsen [Page 17]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- 6a 06f6 EASTERN ARABIC-INDIC DIGIT SIX
- 7a 06f7 EASTERN ARABIC-INDIC DIGIT SEVEN
- 8a 06f8 EASTERN ARABIC-INDIC DIGIT EIGHT
- 9a 06f9 EASTERN ARABIC-INDIC DIGIT NINE
- A-0 1e00 LATIN CAPITAL LETTER A WITH RING BELOW
- a-0 1e01 LATIN SMALL LETTER A WITH RING BELOW
- B. 1e02 LATIN CAPITAL LETTER B WITH DOT ABOVE
- b. 1e03 LATIN SMALL LETTER B WITH DOT ABOVE
- B-. 1e04 LATIN CAPITAL LETTER B WITH DOT BELOW
- b-. 1e05 LATIN SMALL LETTER B WITH DOT BELOW
- B_ 1e06 LATIN CAPITAL LETTER B WITH LINE BELOW
- b_ 1e07 LATIN SMALL LETTER B WITH LINE BELOW
- C,' 1e08 LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
- c,' 1e09 LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
- D. 1e0a LATIN CAPITAL LETTER D WITH DOT ABOVE
- d. 1e0b LATIN SMALL LETTER D WITH DOT ABOVE
- D-. 1e0c LATIN CAPITAL LETTER D WITH DOT BELOW
- d-. 1e0d LATIN SMALL LETTER D WITH DOT BELOW
- D_ 1e0e LATIN CAPITAL LETTER D WITH LINE BELOW
- d_ 1e0f LATIN SMALL LETTER D WITH LINE BELOW
- D, 1e10 LATIN CAPITAL LETTER D WITH CEDILLA
- d, 1e11 LATIN SMALL LETTER D WITH CEDILLA
- D-> 1e12 LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
- d-> 1e13 LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
- E-! 1e14 LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
- e-! 1e15 LATIN SMALL LETTER E WITH MACRON AND GRAVE
- E-' 1e16 LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
- e-' 1e17 LATIN SMALL LETTER E WITH MACRON AND ACUTE
- E-> 1e18 LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
- e-> 1e19 LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
- E-? 1e1a LATIN CAPITAL LETTER E WITH TILDE BELOW
- e-? 1e1b LATIN SMALL LETTER E WITH TILDE BELOW
- E,( 1e1c LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
- e,( 1e1d LATIN SMALL LETTER E WITH CEDILLA AND BREVE
- F. 1e1e LATIN CAPITAL LETTER F WITH DOT ABOVE
- f. 1e1f LATIN SMALL LETTER F WITH DOT ABOVE
- G- 1e20 LATIN CAPITAL LETTER G WITH MACRON
- g- 1e21 LATIN SMALL LETTER G WITH MACRON
- H. 1e22 LATIN CAPITAL LETTER H WITH DOT ABOVE
- h. 1e23 LATIN SMALL LETTER H WITH DOT ABOVE
- H-. 1e24 LATIN CAPITAL LETTER H WITH DOT BELOW
- h-. 1e25 LATIN SMALL LETTER H WITH DOT BELOW
- H: 1e26 LATIN CAPITAL LETTER H WITH DIAERESIS
- h: 1e27 LATIN SMALL LETTER H WITH DIAERESIS
- H, 1e28 LATIN CAPITAL LETTER H WITH CEDILLA
- h, 1e29 LATIN SMALL LETTER H WITH CEDILLA
- H-( 1e2a LATIN CAPITAL LETTER H WITH BREVE BELOW
- h-( 1e2b LATIN SMALL LETTER H WITH BREVE BELOW
- I-? 1e2c LATIN CAPITAL LETTER I WITH TILDE BELOW
- i-? 1e2d LATIN SMALL LETTER I WITH TILDE BELOW
- I:' 1e2e LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
- i:' 1e2f LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
- K' 1e30 LATIN CAPITAL LETTER K WITH ACUTE
-
-Simonsen [Page 18]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- k' 1e31 LATIN SMALL LETTER K WITH ACUTE
- K-. 1e32 LATIN CAPITAL LETTER K WITH DOT BELOW
- k-. 1e33 LATIN SMALL LETTER K WITH DOT BELOW
- K_ 1e34 LATIN CAPITAL LETTER K WITH LINE BELOW
- k_ 1e35 LATIN SMALL LETTER K WITH LINE BELOW
- L-. 1e36 LATIN CAPITAL LETTER L WITH DOT BELOW
- l-. 1e37 LATIN SMALL LETTER L WITH DOT BELOW
- L--. 1e38 LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
- l--. 1e39 LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
- L_ 1e3a LATIN CAPITAL LETTER L WITH LINE BELOW
- l_ 1e3b LATIN SMALL LETTER L WITH LINE BELOW
- L-> 1e3c LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
- l-> 1e3d LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
- M' 1e3e LATIN CAPITAL LETTER M WITH ACUTE
- m' 1e3f LATIN SMALL LETTER M WITH ACUTE
- M. 1e40 LATIN CAPITAL LETTER M WITH DOT ABOVE
- m. 1e41 LATIN SMALL LETTER M WITH DOT ABOVE
- M-. 1e42 LATIN CAPITAL LETTER M WITH DOT BELOW
- m-. 1e43 LATIN SMALL LETTER M WITH DOT BELOW
- N. 1e44 LATIN CAPITAL LETTER N WITH DOT ABOVE
- n. 1e45 LATIN SMALL LETTER N WITH DOT ABOVE
- N-. 1e46 LATIN CAPITAL LETTER N WITH DOT BELOW
- n-. 1e47 LATIN SMALL LETTER N WITH DOT BELOW
- N_ 1e48 LATIN CAPITAL LETTER N WITH LINE BELOW
- n_ 1e49 LATIN SMALL LETTER N WITH LINE BELOW
- N-> 1e4a LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
- N-> 1e4b LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
- O?' 1e4c LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
- o?' 1e4d LATIN SMALL LETTER O WITH TILDE AND ACUTE
- O?: 1e4e LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
- o?: 1e4f LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
- O-! 1e50 LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
- o-! 1e51 LATIN SMALL LETTER O WITH MACRON AND GRAVE
- O-' 1e52 LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
- o-' 1e53 LATIN SMALL LETTER O WITH MACRON AND ACUTE
- P' 1e54 LATIN CAPITAL LETTER P WITH ACUTE
- p' 1e55 LATIN SMALL LETTER P WITH ACUTE
- P. 1e56 LATIN CAPITAL LETTER P WITH DOT ABOVE
- p. 1e57 LATIN SMALL LETTER P WITH DOT ABOVE
- R. 1e58 LATIN CAPITAL LETTER R WITH DOT ABOVE
- r. 1e59 LATIN SMALL LETTER R WITH DOT ABOVE
- R-. 1e5a LATIN CAPITAL LETTER R WITH DOT BELOW
- r-. 1e5b LATIN SMALL LETTER R WITH DOT BELOW
- R--. 1e5c LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
- r--. 1e5d LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
- R_ 1e5e LATIN CAPITAL LETTER R WITH LINE BELOW
- r_ 1e5f LATIN SMALL LETTER R WITH LINE BELOW
- S. 1e60 LATIN CAPITAL LETTER S WITH DOT ABOVE
- s. 1e61 LATIN SMALL LETTER S WITH DOT ABOVE
- S-. 1e62 LATIN CAPITAL LETTER S WITH DOT BELOW
- s-. 1e63 LATIN SMALL LETTER S WITH DOT BELOW
- S'. 1e64 LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
- s'. 1e65 LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
-
-Simonsen [Page 19]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- S<. 1e66 LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
- s<. 1e67 LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
- S.-. 1e68 LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
- S.-. 1e69 LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
- T. 1e6a LATIN CAPITAL LETTER T WITH DOT ABOVE
- t. 1e6b LATIN SMALL LETTER T WITH DOT ABOVE
- T-. 1e6c LATIN CAPITAL LETTER T WITH DOT BELOW
- t-. 1e6d LATIN SMALL LETTER T WITH DOT BELOW
- T_ 1e6e LATIN CAPITAL LETTER T WITH LINE BELOW
- t_ 1e6f LATIN SMALL LETTER T WITH LINE BELOW
- T-> 1e70 LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
- t-> 1e71 LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
- U--: 1e72 LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
- u--: 1e73 LATIN SMALL LETTER U WITH DIAERESIS BELOW
- U-? 1e74 LATIN CAPITAL LETTER U WITH TILDE BELOW
- u-? 1e75 LATIN SMALL LETTER U WITH TILDE BELOW
- U-> 1e76 LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
- u-> 1e77 LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
- U?' 1e78 LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
- u?' 1e79 LATIN SMALL LETTER U WITH TILDE AND ACUTE
- U-: 1e7a LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
- u-: 1e7b LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
- V? 1e7c LATIN CAPITAL LETTER V WITH TILDE
- v? 1e7d LATIN SMALL LETTER V WITH TILDE
- V-. 1e7e LATIN CAPITAL LETTER V WITH DOT BELOW
- v-. 1e7f LATIN SMALL LETTER V WITH DOT BELOW
- W! 1e80 LATIN CAPITAL LETTER W WITH GRAVE
- w! 1e81 LATIN SMALL LETTER W WITH GRAVE
- W' 1e82 LATIN CAPITAL LETTER W WITH ACUTE
- w' 1e83 LATIN SMALL LETTER W WITH ACUTE
- W: 1e84 LATIN CAPITAL LETTER W WITH DIAERESIS
- w: 1e85 LATIN SMALL LETTER W WITH DIAERESIS
- W. 1e86 LATIN CAPITAL LETTER W WITH DOT ABOVE
- w. 1e87 LATIN SMALL LETTER W WITH DOT ABOVE
- W-. 1e88 LATIN CAPITAL LETTER W WITH DOT BELOW
- w-. 1e89 LATIN SMALL LETTER W WITH DOT BELOW
- X. 1e8a LATIN CAPITAL LETTER X WITH DOT ABOVE
- x. 1e8b LATIN SMALL LETTER X WITH DOT ABOVE
- X: 1e8c LATIN CAPITAL LETTER X WITH DIAERESIS
- x: 1e8d LATIN SMALL LETTER X WITH DIAERESIS
- Y. 1e8e LATIN CAPITAL LETTER Y WITH DOT ABOVE
- y. 1e8f LATIN SMALL LETTER Y WITH DOT ABOVE
- Z> 1e90 LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
- z> 1e91 LATIN SMALL LETTER Z WITH CIRCUMFLEX
- Z-. 1e92 LATIN CAPITAL LETTER Z WITH DOT BELOW
- z-. 1e93 LATIN SMALL LETTER Z WITH DOT BELOW
- Z_ 1e94 LATIN CAPITAL LETTER Z WITH LINE BELOW
- z_ 1e95 LATIN SMALL LETTER Z WITH LINE BELOW
- h_ 1e96 LATIN SMALL LETTER H WITH LINE BELOW
- t: 1e97 LATIN SMALL LETTER T WITH DIAERESIS
- w0 1e98 LATIN SMALL LETTER W WITH RING ABOVE
- y0 1e99 LATIN SMALL LETTER Y WITH RING ABOVE
- A-. 1ea0 LATIN CAPITAL LETTER A WITH DOT BELOW
-
-Simonsen [Page 20]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- a-. 1ea1 LATIN SMALL LETTER A WITH DOT BELOW
- A2 1ea2 LATIN CAPITAL LETTER A WITH HOOK ABOVE
- a2 1ea3 LATIN SMALL LETTER A WITH HOOK ABOVE
- A>' 1ea4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
- a>' 1ea5 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
- A>! 1ea6 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
- a>! 1ea7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
- A>2 1ea8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
- a>2 1ea9 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
- A>? 1eaa LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
- a>? 1eab LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
- A>-. 1eac LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
- a>-. 1ead LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
- A(' 1eae LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
- a(' 1eaf LATIN SMALL LETTER A WITH BREVE AND ACUTE
- A(! 1eb0 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
- a(! 1eb1 LATIN SMALL LETTER A WITH BREVE AND GRAVE
- A(2 1eb2 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
- a(2 1eb3 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
- A(? 1eb4 LATIN CAPITAL LETTER A WITH BREVE AND TILDE
- a(? 1eb5 LATIN SMALL LETTER A WITH BREVE AND TILDE
- A(-. 1eb6 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
- a(-. 1eb7 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
- E-. 1eb8 LATIN CAPITAL LETTER E WITH DOT BELOW
- e-. 1eb9 LATIN SMALL LETTER E WITH DOT BELOW
- E2 1eba LATIN CAPITAL LETTER E WITH HOOK ABOVE
- e2 1ebb LATIN SMALL LETTER E WITH HOOK ABOVE
- E? 1ebc LATIN CAPITAL LETTER E WITH TILDE
- e? 1ebd LATIN SMALL LETTER E WITH TILDE
- E>' 1ebe LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
- e>' 1ebf LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
- E>! 1ec0 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
- e>! 1ec1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
- E>2 1ec2 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
- e>2 1ec3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
- E>? 1ec4 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
- e>? 1ec5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
- E>-. 1ec6 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
- e>-. 1ec7 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
- I2 1ec8 LATIN CAPITAL LETTER I WITH HOOK ABOVE
- i2 1ec9 LATIN SMALL LETTER I WITH HOOK ABOVE
- I-. 1eca LATIN CAPITAL LETTER I WITH DOT BELOW
- i-. 1ecb LATIN SMALL LETTER I WITH DOT BELOW
- O-. 1ecc LATIN CAPITAL LETTER O WITH DOT BELOW
- o-. 1ecd LATIN SMALL LETTER O WITH DOT BELOW
- O2 1ece LATIN CAPITAL LETTER O WITH HOOK ABOVE
- o2 1ecf LATIN SMALL LETTER O WITH HOOK ABOVE
- O>' 1ed0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
- o>' 1ed1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
- O>! 1ed2 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
- o>! 1ed3 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
- O>2 1ed4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
- o>2 1ed5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
-
-Simonsen [Page 21]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- O>? 1ed6 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
- o>? 1ed7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
- O>-. 1ed8 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
- o>-. 1ed9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
- O9' 1eda LATIN CAPITAL LETTER O WITH HORN AND ACUTE
- o9' 1edb LATIN SMALL LETTER O WITH HORN AND ACUTE
- O9! 1edc LATIN CAPITAL LETTER O WITH HORN AND GRAVE
- o9! 1edd LATIN SMALL LETTER O WITH HORN AND GRAVE
- O92 1ede LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
- o92 1edf LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
- O9? 1ee0 LATIN CAPITAL LETTER O WITH HORN AND TILDE
- o9? 1ee1 LATIN SMALL LETTER O WITH HORN AND TILDE
- O9-. 1ee2 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
- o9-. 1ee3 LATIN SMALL LETTER O WITH HORN AND DOT BELOW
- U-. 1ee4 LATIN CAPITAL LETTER U WITH DOT BELOW
- u-. 1ee5 LATIN SMALL LETTER U WITH DOT BELOW
- U2 1ee6 LATIN CAPITAL LETTER U WITH HOOK ABOVE
- u2 1ee7 LATIN SMALL LETTER U WITH HOOK ABOVE
- U9' 1ee8 LATIN CAPITAL LETTER U WITH HORN AND ACUTE
- u9' 1ee9 LATIN SMALL LETTER U WITH HORN AND ACUTE
- U9! 1eea LATIN CAPITAL LETTER U WITH HORN AND GRAVE
- u9! 1eeb LATIN SMALL LETTER U WITH HORN AND GRAVE
- U92 1eec LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
- u92 1eed LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
- U9? 1eee LATIN CAPITAL LETTER U WITH HORN AND TILDE
- u9? 1eef LATIN SMALL LETTER U WITH HORN AND TILDE
- U9-. 1ef0 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
- u9-. 1ef1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW
- Y! 1ef2 LATIN CAPITAL LETTER Y WITH GRAVE
- y! 1ef3 LATIN SMALL LETTER Y WITH GRAVE
- Y-. 1ef4 LATIN CAPITAL LETTER Y WITH DOT BELOW
- y-. 1ef5 LATIN SMALL LETTER Y WITH DOT BELOW
- Y2 1ef6 LATIN CAPITAL LETTER Y WITH HOOK ABOVE
- y2 1ef7 LATIN SMALL LETTER Y WITH HOOK ABOVE
- Y? 1ef8 LATIN CAPITAL LETTER Y WITH TILDE
- y? 1ef9 LATIN SMALL LETTER Y WITH TILDE
- ;' 1f00 GREEK DASIA AND ACUTE ACCENT
- ,' 1f01 GREEK PSILI AND ACUTE ACCENT
- ;! 1f02 GREEK DASIA AND VARIA
- ,! 1f03 GREEK PSILI AND VARIA
- ?; 1f04 GREEK DASIA AND PERISPOMENI
- ?, 1f05 GREEK PSILI AND PERISPOMENI
- !: 1f06 GREEK DIAERESIS AND VARIA
- ?: 1f07 GREEK DIAERESIS AND PERISPOMENI
- 1N 2002 EN SPACE
- 1M 2003 EM SPACE
- 3M 2004 THREE-PER-EM SPACE
- 4M 2005 FOUR-PER-EM SPACE
- 6M 2006 SIX-PER-EM SPACE
- 1T 2009 THIN SPACE
- 1H 200a HAIR SPACE
- -1 2010 HYPHEN
- -N 2013 EN DASH
-
-Simonsen [Page 22]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- -M 2014 EM DASH
- -3 2015 HORIZONTAL BAR
- !2 2016 DOUBLE VERTICAL LINE
- =2 2017 DOUBLE LOW LINE
- '6 2018 LEFT SINGLE QUOTATION MARK
- '9 2019 RIGHT SINGLE QUOTATION MARK
- .9 201a SINGLE LOW-9 QUOTATION MARK
- 9' 201b SINGLE HIGH-REVERSED-9 QUOTATION MARK
- "6 201c LEFT DOUBLE QUOTATION MARK
- "9 201d RIGHT DOUBLE QUOTATION MARK
- :9 201e DOUBLE LOW-9 QUOTATION MARK
- 9" 201f DOUBLE HIGH-REVERSED-9 QUOTATION MARK
- /- 2020 DAGGER
- /= 2021 DOUBLE DAGGER
- .. 2025 TWO DOT LEADER
- %0 2030 PER MILLE SIGN
- 1' 2032 PRIME
- 2' 2033 DOUBLE PRIME
- 3' 2034 TRIPLE PRIME
- 1" 2035 REVERSED PRIME
- 2" 2036 REVERSED DOUBLE PRIME
- 3" 2037 REVERSED TRIPLE PRIME
- Ca 2038 CARET
- <1 2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK
- >1 203a SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
- :X 203b REFERENCE MARK
- !*2 203c DOUBLE EXCLAMATION MARK
- '- 203e OVERLINE
- /f 2044 FRACTION SLASH
- 0S 2070 SUPERSCRIPT DIGIT ZERO
- 4S 2074 SUPERSCRIPT DIGIT FOUR
- 5S 2075 SUPERSCRIPT DIGIT FIVE
- 6S 2076 SUPERSCRIPT DIGIT SIX
- 7S 2077 SUPERSCRIPT DIGIT SEVEN
- 8S 2078 SUPERSCRIPT DIGIT EIGHT
- 9S 2079 SUPERSCRIPT DIGIT NINE
- +S 207a SUPERSCRIPT PLUS SIGN
- -S 207b SUPERSCRIPT MINUS
- =S 207c SUPERSCRIPT EQUALS SIGN
- (S 207d SUPERSCRIPT LEFT PARENTHESIS
- )S 207e SUPERSCRIPT RIGHT PARENTHESIS
- nS 207f SUPERSCRIPT LATIN SMALL LETTER N
- 0s 2080 SUBSCRIPT DIGIT ZERO
- 1s 2081 SUBSCRIPT DIGIT ONE
- 2s 2082 SUBSCRIPT DIGIT TWO
- 3s 2083 SUBSCRIPT DIGIT THREE
- 4s 2084 SUBSCRIPT DIGIT FOUR
- 5s 2085 SUBSCRIPT DIGIT FIVE
- 6s 2086 SUBSCRIPT DIGIT SIX
- 7s 2087 SUBSCRIPT DIGIT SEVEN
- 8s 2088 SUBSCRIPT DIGIT EIGHT
- 9s 2089 SUBSCRIPT DIGIT NINE
- +s 208a SUBSCRIPT PLUS SIGN
-
-Simonsen [Page 23]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- -s 208b SUBSCRIPT MINUS
- =s 208c SUBSCRIPT EQUALS SIGN
- (s 208d SUBSCRIPT LEFT PARENTHESIS
- )s 208e SUBSCRIPT RIGHT PARENTHESIS
- Li 20a4 LIRA SIGN
- Pt 20a7 PESETA SIGN
- W= 20a9 WON SIGN
- oC 2103 DEGREE CENTIGRADE
- co 2105 CARE OF
- oF 2109 DEGREE FAHRENHEIT
- N0 2116 NUMERO SIGN
- PO 2117 SOUND RECORDING COPYRIGHT
- Rx 211e PRESCRIPTION TAKE
- SM 2120 SERVICE MARK
- TM 2122 TRADE MARK SIGN
- Om 2126 OHM SIGN
- AO 212b ANGSTROEM SIGN
- 13 2153 VULGAR FRACTION ONE THIRD
- 23 2154 VULGAR FRACTION TWO THIRDS
- 15 2155 VULGAR FRACTION ONE FIFTH
- 25 2156 VULGAR FRACTION TWO FIFTHS
- 35 2157 VULGAR FRACTION THREE FIFTHS
- 45 2158 VULGAR FRACTION FOUR FIFTHS
- 16 2159 VULGAR FRACTION ONE SIXTH
- 56 215a VULGAR FRACTION FIVE SIXTHS
- 18 215b VULGAR FRACTION ONE EIGHTH
- 38 215c VULGAR FRACTION THREE EIGHTHS
- 58 215d VULGAR FRACTION FIVE EIGHTHS
- 78 215e VULGAR FRACTION SEVEN EIGHTHS
- 1R 2160 ROMAN NUMERAL ONE
- 2R 2161 ROMAN NUMERAL TWO
- 3R 2162 ROMAN NUMERAL THREE
- 4R 2163 ROMAN NUMERAL FOUR
- 5R 2164 ROMAN NUMERAL FIVE
- 6R 2165 ROMAN NUMERAL SIX
- 7R 2166 ROMAN NUMERAL SEVEN
- 8R 2167 ROMAN NUMERAL EIGHT
- 9R 2168 ROMAN NUMERAL NINE
- aR 2169 ROMAN NUMERAL TEN
- bR 216a ROMAN NUMERAL ELEVEN
- cR 216b ROMAN NUMERAL TWELVE
- 50R 216c ROMAN NUMERAL FIFTY
- 100R 216d ROMAN NUMERAL ONE HUNDRED
- 500R 216e ROMAN NUMERAL FIVE HUNDRED
- 1000R 216f ROMAN NUMERAL ONE THOUSAND
- 1r 2170 SMALL ROMAN NUMERAL ONE
- 2r 2171 SMALL ROMAN NUMERAL TWO
- 3r 2172 SMALL ROMAN NUMERAL THREE
- 4r 2173 SMALL ROMAN NUMERAL FOUR
- 5r 2174 SMALL ROMAN NUMERAL FIVE
- 6r 2175 SMALL ROMAN NUMERAL SIX
- 7r 2176 SMALL ROMAN NUMERAL SEVEN
- 8r 2177 SMALL ROMAN NUMERAL EIGHT
-
-Simonsen [Page 24]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- 9r 2178 SMALL ROMAN NUMERAL NINE
- ar 2179 SMALL ROMAN NUMERAL TEN
- br 217a SMALL ROMAN NUMERAL ELEVEN
- cr 217b SMALL ROMAN NUMERAL TWELVE
- 50r 217c SMALL ROMAN NUMERAL FIFTY
- 100r 217d SMALL ROMAN NUMERAL ONE HUNDRED
- 500r 217e SMALL ROMAN NUMERAL FIVE HUNDRED
- 1000r 217f SMALL ROMAN NUMERAL ONE THOUSAND
- 1000RCD 2180 ROMAN NUMERAL ONE THOUSAND C D
- 5000R 2181 ROMAN NUMERAL FIVE THOUSAND
- 10000R 2182 ROMAN NUMERAL TEN THOUSAND
- <- 2190 LEFTWARDS ARROW
- -! 2191 UPWARDS ARROW
- -> 2192 RIGHTWARDS ARROW
- -v 2193 DOWNWARDS ARROW
- <> 2194 LEFT RIGHT ARROW
- UD 2195 UP DOWN ARROW
- <!! 2196 NORTH WEST ARROW
- //> 2197 NORTH EAST ARROW
- !!> 2198 SOUTH EAST ARROW
- <// 2199 SOUTH WEST ARROW
- <= 21d0 LEFTWARDS DOUBLE ARROW
- => 21d2 RIGHTWARDS DOUBLE ARROW
- == 21d4 LEFT RIGHT DOUBLE ARROW
- FA 2200 FOR ALL
- dP 2202 PARTIAL DIFFERENTIAL
- TE 2203 THERE EXISTS
- /0 2205 EMPTY SET
- DE 2206 INCREMENT
- NB 2207 NABLA
- (- 2208 ELEMENT OF
- -) 220b CONTAINS AS MEMBER
- *P 220f N-ARY PRODUCT
- +Z 2211 N-ARY SUMMATION
- -2 2212 MINUS SIGN
- -+ 2213 MINUS-OR-PLUS SIGN
- *- 2217 ASTERISK OPERATOR
- Ob 2218 RING OPERATOR
- Sb 2219 BULLET OPERATOR
- RT 221a SQUARE ROOT
- 0( 221d PROPORTIONAL TO
- 00 221e INFINITY
- -L 221f RIGHT ANGLE
- -V 2220 ANGLE
- PP 2225 PARALLEL TO
- AN 2227 LOGICAL AND
- OR 2228 LOGICAL OR
- (U 2229 INTERSECTION
- )U 222a UNION
- In 222b INTEGRAL
- DI 222c DOUBLE INTEGRAL
- Io 222e CONTOUR INTEGRAL
- .: 2234 THEREFORE
-
-Simonsen [Page 25]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- :. 2235 BECAUSE
- :R 2236 RATIO
- :: 2237 PROPORTION
- ?1 223c TILDE OPERATOR
- CG 223e INVERTED LAZY S
- ?- 2243 ASYMPTOTICALLY EQUAL TO
- ?= 2245 APPROXIMATELY EQUAL TO
- ?2 2248 ALMOST EQUAL TO
- =? 224c ALL EQUAL TO
- HI 2253 IMAGE OF OR APPROXIMATELY EQUAL TO
- != 2260 NOT EQUAL TO
- =3 2261 IDENTICAL TO
- =< 2264 LESS-THAN OR EQUAL TO
- >= 2265 GREATER-THAN OR EQUAL TO
- <* 226a MUCH LESS-THAN
- *> 226b MUCH GREATER-THAN
- !< 226e NOT LESS-THAN
- !> 226f NOT GREATER-THAN
- (C 2282 SUBSET OF
- )C 2283 SUPERSET OF
- (_ 2286 SUBSET OF OR EQUAL TO
- )_ 2287 SUPERSET OF OR EQUAL TO
- 0. 2299 CIRCLED DOT OPERATOR
- 02 229a CIRCLED RING OPERATOR
- -T 22a5 UP TACK
- .P 22c5 DOT OPERATOR
- :3 22ee VERTICAL ELLIPSIS
- .3 22ef MIDLINE HORIZONTAL ELLIPSIS
- Eh 2302 HOUSE
- <7 2308 LEFT CEILING
- >7 2309 RIGHT CEILING
- 7< 230a LEFT FLOOR
- 7> 230b RIGHT FLOOR
- NI 2310 REVERSED NOT SIGN
- (A 2312 ARC
- TR 2315 TELEPHONE RECORDER
- Iu 2320 TOP HALF INTEGRAL
- Il 2321 BOTTOM HALF INTEGRAL
- </ 2329 LEFT-POINTING ANGLE BRACKET
- /> 232a RIGHT-POINTING ANGLE BRACKET
- Vs 2423 OPEN BOX
- 1h 2440 OCR HOOK
- 3h 2441 OCR CHAIR
- 2h 2442 OCR FORK
- 4h 2443 OCR INVERTED FORK
- 1j 2446 OCR BRANCH BANK IDENTIFICATION
- 2j 2447 OCR AMOUNT OF CHECK
- 3j 2448 OCR DASH
- 4j 2449 OCR CUSTOMER ACCOUNT NUMBER
- 1-o 2460 CIRCLED DIGIT ONE
- 2-o 2461 CIRCLED DIGIT TWO
- 3-o 2462 CIRCLED DIGIT THREE
- 4-o 2463 CIRCLED DIGIT FOUR
-
-Simonsen [Page 26]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- 5-o 2464 CIRCLED DIGIT FIVE
- 6-o 2465 CIRCLED DIGIT SIX
- 7-o 2466 CIRCLED DIGIT SEVEN
- 8-o 2467 CIRCLED DIGIT EIGHT
- 9-o 2468 CIRCLED DIGIT NINE
- 10-o 2469 CIRCLED NUMBER TEN
- 11-o 246a CIRCLED NUMBER ELEVEN
- 12-o 246b CIRCLED NUMBER TWELVE
- 13-o 246c CIRCLED NUMBER THIRTEEN
- 14-o 246d CIRCLED NUMBER FOURTEEN
- 15-o 246e CIRCLED NUMBER FIFTEEN
- 16-o 246f CIRCLED NUMBER SIXTEEN
- 17-o 2470 CIRCLED NUMBER SEVENTEEN
- 18-o 2471 CIRCLED NUMBER EIGHTEEN
- 19-o 2472 CIRCLED NUMBER NINETEEN
- 20-o 2473 CIRCLED NUMBER TWENTY
- (1) 2474 PARENTHESIZED DIGIT ONE
- (2) 2475 PARENTHESIZED DIGIT TWO
- (3) 2476 PARENTHESIZED DIGIT THREE
- (4) 2477 PARENTHESIZED DIGIT FOUR
- (5) 2478 PARENTHESIZED DIGIT FIVE
- (6) 2479 PARENTHESIZED DIGIT SIX
- (7) 247a PARENTHESIZED DIGIT SEVEN
- (8) 247b PARENTHESIZED DIGIT EIGHT
- (9) 247c PARENTHESIZED DIGIT NINE
- (10) 247d PARENTHESIZED NUMBER TEN
- (11) 247e PARENTHESIZED NUMBER ELEVEN
- (12) 247f PARENTHESIZED NUMBER TWELVE
- (13) 2480 PARENTHESIZED NUMBER THIRTEEN
- (14) 2481 PARENTHESIZED NUMBER FOURTEEN
- (15) 2482 PARENTHESIZED NUMBER FIFTEEN
- (16) 2483 PARENTHESIZED NUMBER SIXTEEN
- (17) 2484 PARENTHESIZED NUMBER SEVENTEEN
- (18) 2485 PARENTHESIZED NUMBER EIGHTEEN
- (19) 2486 PARENTHESIZED NUMBER NINETEEN
- (20) 2487 PARENTHESIZED NUMBER TWENTY
- 1. 2488 DIGIT ONE FULL STOP
- 2. 2489 DIGIT TWO FULL STOP
- 3. 248a DIGIT THREE FULL STOP
- 4. 248b DIGIT FOUR FULL STOP
- 5. 248c DIGIT FIVE FULL STOP
- 6. 248d DIGIT SIX FULL STOP
- 7. 248e DIGIT SEVEN FULL STOP
- 8. 248f DIGIT EIGHT FULL STOP
- 9. 2490 DIGIT NINE FULL STOP
- 10. 2491 NUMBER TEN FULL STOP
- 11. 2492 NUMBER ELEVEN FULL STOP
- 12. 2493 NUMBER TWELVE FULL STOP
- 13. 2494 NUMBER THIRTEEN FULL STOP
- 14. 2495 NUMBER FOURTEEN FULL STOP
- 15. 2496 NUMBER FIFTEEN FULL STOP
- 16. 2497 NUMBER SIXTEEN FULL STOP
- 17. 2498 NUMBER SEVENTEEN FULL STOP
-
-Simonsen [Page 27]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- 18. 2499 NUMBER EIGHTEEN FULL STOP
- 19. 249a NUMBER NINETEEN FULL STOP
- 20. 249b NUMBER TWENTY FULL STOP
- (a) 249c PARENTHESIZED LATIN SMALL LETTER A
- (b) 249d PARENTHESIZED LATIN SMALL LETTER B
- (c) 249e PARENTHESIZED LATIN SMALL LETTER C
- (d) 249f PARENTHESIZED LATIN SMALL LETTER D
- (e) 24a0 PARENTHESIZED LATIN SMALL LETTER E
- (f) 24a1 PARENTHESIZED LATIN SMALL LETTER F
- (g) 24a2 PARENTHESIZED LATIN SMALL LETTER G
- (h) 24a3 PARENTHESIZED LATIN SMALL LETTER H
- (i) 24a4 PARENTHESIZED LATIN SMALL LETTER I
- (j) 24a5 PARENTHESIZED LATIN SMALL LETTER J
- (k) 24a6 PARENTHESIZED LATIN SMALL LETTER K
- (l) 24a7 PARENTHESIZED LATIN SMALL LETTER L
- (m) 24a8 PARENTHESIZED LATIN SMALL LETTER M
- (n) 24a9 PARENTHESIZED LATIN SMALL LETTER N
- (o) 24aa PARENTHESIZED LATIN SMALL LETTER O
- (p) 24ab PARENTHESIZED LATIN SMALL LETTER P
- (q) 24ac PARENTHESIZED LATIN SMALL LETTER Q
- (r) 24ad PARENTHESIZED LATIN SMALL LETTER R
- (s) 24ae PARENTHESIZED LATIN SMALL LETTER S
- (t) 24af PARENTHESIZED LATIN SMALL LETTER T
- (u) 24b0 PARENTHESIZED LATIN SMALL LETTER U
- (v) 24b1 PARENTHESIZED LATIN SMALL LETTER V
- (w) 24b2 PARENTHESIZED LATIN SMALL LETTER W
- (x) 24b3 PARENTHESIZED LATIN SMALL LETTER X
- (y) 24b4 PARENTHESIZED LATIN SMALL LETTER Y
- (z) 24b5 PARENTHESIZED LATIN SMALL LETTER Z
- A-o 24b6 CIRCLED LATIN CAPITAL LETTER A
- B-o 24b7 CIRCLED LATIN CAPITAL LETTER B
- C-o 24b8 CIRCLED LATIN CAPITAL LETTER C
- D-o 24b9 CIRCLED LATIN CAPITAL LETTER D
- E-o 24ba CIRCLED LATIN CAPITAL LETTER E
- F-o 24bb CIRCLED LATIN CAPITAL LETTER F
- G-o 24bc CIRCLED LATIN CAPITAL LETTER G
- H-o 24bd CIRCLED LATIN CAPITAL LETTER H
- I-o 24be CIRCLED LATIN CAPITAL LETTER I
- J-o 24bf CIRCLED LATIN CAPITAL LETTER J
- K-o 24c0 CIRCLED LATIN CAPITAL LETTER K
- L-o 24c1 CIRCLED LATIN CAPITAL LETTER L
- M-o 24c2 CIRCLED LATIN CAPITAL LETTER M
- N-o 24c3 CIRCLED LATIN CAPITAL LETTER N
- O-o 24c4 CIRCLED LATIN CAPITAL LETTER O
- P-o 24c5 CIRCLED LATIN CAPITAL LETTER P
- Q-o 24c6 CIRCLED LATIN CAPITAL LETTER Q
- R-o 24c7 CIRCLED LATIN CAPITAL LETTER R
- S-o 24c8 CIRCLED LATIN CAPITAL LETTER S
- T-o 24c9 CIRCLED LATIN CAPITAL LETTER T
- U-o 24ca CIRCLED LATIN CAPITAL LETTER U
- V-o 24cb CIRCLED LATIN CAPITAL LETTER V
- W-o 24cc CIRCLED LATIN CAPITAL LETTER W
- X-o 24cd CIRCLED LATIN CAPITAL LETTER X
-
-Simonsen [Page 28]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- Y-o 24ce CIRCLED LATIN CAPITAL LETTER Y
- Z-o 24cf CIRCLED LATIN CAPITAL LETTER Z
- a-o 24d0 CIRCLED LATIN SMALL LETTER A
- b-o 24d1 CIRCLED LATIN SMALL LETTER B
- c-o 24d2 CIRCLED LATIN SMALL LETTER C
- d-o 24d3 CIRCLED LATIN SMALL LETTER D
- e-o 24d4 CIRCLED LATIN SMALL LETTER E
- f-o 24d5 CIRCLED LATIN SMALL LETTER F
- g-o 24d6 CIRCLED LATIN SMALL LETTER G
- h-o 24d7 CIRCLED LATIN SMALL LETTER H
- i-o 24d8 CIRCLED LATIN SMALL LETTER I
- j-o 24d9 CIRCLED LATIN SMALL LETTER J
- k-o 24da CIRCLED LATIN SMALL LETTER K
- l-o 24db CIRCLED LATIN SMALL LETTER L
- m-o 24dc CIRCLED LATIN SMALL LETTER M
- n-o 24dd CIRCLED LATIN SMALL LETTER N
- o-o 24de CIRCLED LATIN SMALL LETTER O
- p-o 24df CIRCLED LATIN SMALL LETTER P
- q-o 24e0 CIRCLED LATIN SMALL LETTER Q
- r-o 24e1 CIRCLED LATIN SMALL LETTER R
- s-o 24e2 CIRCLED LATIN SMALL LETTER S
- t-o 24e3 CIRCLED LATIN SMALL LETTER T
- u-o 24e4 CIRCLED LATIN SMALL LETTER U
- v-o 24e5 CIRCLED LATIN SMALL LETTER V
- w-o 24e6 CIRCLED LATIN SMALL LETTER W
- x-o 24e7 CIRCLED LATIN SMALL LETTER X
- y-o 24e8 CIRCLED LATIN SMALL LETTER Y
- z-o 24e9 CIRCLED LATIN SMALL LETTER Z
- 0-o 24ea CIRCLED DIGIT ZERO
- hh 2500 BOX DRAWINGS LIGHT HORIZONTAL
- HH 2501 BOX DRAWINGS HEAVY HORIZONTAL
- vv 2502 BOX DRAWINGS LIGHT VERTICAL
- VV 2503 BOX DRAWINGS HEAVY VERTICAL
- 3- 2504 BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
- 3_ 2505 BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
- 3! 2506 BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
- 3/ 2507 BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
- 4- 2508 BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
- 4_ 2509 BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
- 4! 250a BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
- 4/ 250b BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
- dr 250c BOX DRAWINGS LIGHT DOWN AND RIGHT
- dR 250d BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
- Dr 250e BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
- DR 250f BOX DRAWINGS HEAVY DOWN AND RIGHT
- dl 2510 BOX DRAWINGS LIGHT DOWN AND LEFT
- dL 2511 BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
- Dl 2512 BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
- LD 2513 BOX DRAWINGS HEAVY DOWN AND LEFT
- ur 2514 BOX DRAWINGS LIGHT UP AND RIGHT
- uR 2515 BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
- Ur 2516 BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
- UR 2517 BOX DRAWINGS HEAVY UP AND RIGHT
-
-Simonsen [Page 29]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- ul 2518 BOX DRAWINGS LIGHT UP AND LEFT
- uL 2519 BOX DRAWINGS UP LIGHT AND LEFT HEAVY
- Ul 251a BOX DRAWINGS UP HEAVY AND LEFT LIGHT
- UL 251b BOX DRAWINGS HEAVY UP AND LEFT
- vr 251c BOX DRAWINGS LIGHT VERTICAL AND RIGHT
- vR 251d BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
- Udr 251e BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
- uDr 251f BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
- Vr 2520 BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
- UdR 2521 BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
- uDR 2522 BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
- VR 2523 BOX DRAWINGS HEAVY VERTICAL AND RIGHT
- vl 2524 BOX DRAWINGS LIGHT VERTICAL AND LEFT
- vL 2525 BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
- Udl 2526 BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
- uDl 2527 BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
- Vl 2528 BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
- UdL 2529 BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
- uDL 252a BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
- VL 252b BOX DRAWINGS HEAVY VERTICAL AND LEFT
- dh 252c BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
- dLr 252d BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
- dlR 252e BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
- dH 252f BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
- Dh 2530 BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
- DLr 2531 BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
- DlR 2532 BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
- DH 2533 BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
- uh 2534 BOX DRAWINGS LIGHT UP AND HORIZONTAL
- uLr 2535 BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
- ulR 2536 BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
- uH 2537 BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
- Uh 2538 BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
- ULr 2539 BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
- UlR 253a BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
- UH 253b BOX DRAWINGS HEAVY UP AND HORIZONTAL
- vh 253c BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
- vLr 253d BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
- vlR 253e BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
- vH 253f BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
- Udh 2540 BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
- uDh 2541 BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
- Vh 2542 BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
- UdLr 2543 BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
- UdlR 2544 BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
- uDLr 2545 BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
- uDlR 2546 BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
- UdH 2547 BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
- uDH 2548 BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
- VLr 2549 BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
- VlR 254a BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
- VH 254b BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
- FD 2571 BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
-
-Simonsen [Page 30]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- BD 2572 BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
- TB 2580 UPPER HALF BLOCK
- LB 2584 LOWER HALF BLOCK
- FB 2588 FULL BLOCK
- lB 258c LEFT HALF BLOCK
- RB 2590 RIGHT HALF BLOCK
- .S 2591 LIGHT SHADE
- :S 2592 MEDIUM SHADE
- ?S 2593 DARK SHADE
- fS 25a0 BLACK SQUARE
- OS 25a1 WHITE SQUARE
- RO 25a2 WHITE SQUARE WITH ROUNDED CORNERS
- Rr 25a3 WHITE SQUARE CONTAINING BLACK SMALL SQUARE
- RF 25a4 SQUARE WITH HORIZONTAL FILL
- RY 25a5 SQUARE WITH VERTICAL FILL
- RH 25a6 SQUARE WITH ORTHOGONAL CROSSHATCH FILL
- RZ 25a7 SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
- RK 25a8 SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
- RX 25a9 SQUARE WITH DIAGONAL CROSSHATCH FILL
- sB 25aa BLACK SMALL SQUARE
- SR 25ac BLACK RECTANGLE
- Or 25ad WHITE RECTANGLE
- UT 25b2 BLACK UP-POINTING TRIANGLE
- uT 25b3 WHITE UP-POINTING TRIANGLE
- PR 25b6 BLACK RIGHT-POINTING TRIANGLE
- Tr 25b7 WHITE RIGHT-POINTING TRIANGLE
- Dt 25bc BLACK DOWN-POINTING TRIANGLE
- dT 25bd WHITE DOWN-POINTING TRIANGLE
- PL 25c0 BLACK LEFT-POINTING TRIANGLE
- Tl 25c1 WHITE LEFT-POINTING TRIANGLE
- Db 25c6 BLACK DIAMOND
- Dw 25c7 WHITE DIAMOND
- LZ 25ca LOZENGE
- 0m 25cb WHITE CIRCLE
- 0o 25ce BULLSEYE
- 0M 25cf BLACK CIRCLE
- 0L 25d0 CIRCLE WITH LEFT HALF BLACK
- 0R 25d1 CIRCLE WITH RIGHT HALF BLACK
- Sn 25d8 INVERSE BULLET
- Ic 25d9 INVERSE WHITE CIRCLE
- Fd 25e2 BLACK LOWER RIGHT TRIANGLE
- Bd 25e3 BLACK LOWER LEFT TRIANGLE
- *2 2605 BLACK STAR
- *1 2606 WHITE STAR
- TEL 260e BLACK TELEPHONE
- tel 260f WHITE TELEPHONE
- <H 261c WHITE LEFT POINTING INDEX
- >H 261e WHITE RIGHT POINTING INDEX
- 0u 263a WHITE SMILING FACE
- 0U 263b BLACK SMILING FACE
- SU 263c WHITE SUN WITH RAYS
- Fm 2640 FEMALE SIGN
- Ml 2642 MALE SIGN
-
-Simonsen [Page 31]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- cS 2660 BLACK SPADE SUIT
- cH 2661 WHITE HEART SUIT
- cD 2662 WHITE DIAMOND SUIT
- cC 2663 BLACK CLUB SUIT
- cS- 2664 WHITE SPADE SUIT
- cH- 2665 BLACK HEART SUIT
- cD- 2666 BLACK DIAMOND SUIT
- cC- 2667 WHITE CLUB SUIT
- Md 2669 QUARTER NOTE
- M8 266a EIGHTH NOTE
- M2 266b BARRED EIGHTH NOTES
- M16 266c BARRED SIXTEENTH NOTES
- Mb 266d MUSIC FLAT SIGN
- Mx 266e MUSIC NATURAL SIGN
- MX 266f MUSIC SHARP SIGN
- OK 2713 CHECK MARK
- XX 2717 BALLOT X
- -X 2720 MALTESE CROSS
- IS 3000 IDEOGRAPHIC SPACE
- ,_ 3001 IDEOGRAPHIC COMMA
- ._ 3002 IDEOGRAPHIC PERIOD
- +" 3003 DITTO MARK
- +_ 3004 IDEOGRAPHIC DITTO MARK
- *_ 3005 IDEOGRAPHIC ITERATION MARK
- ;_ 3006 IDEOGRAPHIC CLOSING MARK
- 0_ 3007 IDEOGRAPHIC NUMBER ZERO
- <+ 300a LEFT DOUBLE ANGLE BRACKET
- >+ 300b RIGHT DOUBLE ANGLE BRACKET
- <' 300c LEFT CORNER BRACKET
- >' 300d RIGHT CORNER BRACKET
- <" 300e LEFT WHITE CORNER BRACKET
- >" 300f RIGHT WHITE CORNER BRACKET
- (" 3010 LEFT BLACK LENTICULAR BRACKET
- )" 3011 RIGHT BLACK LENTICULAR BRACKET
- =T 3012 POSTAL MARK
- =_ 3013 GETA MARK
- (' 3014 LEFT TORTOISE SHELL BRACKET
- )' 3015 RIGHT TORTOISE SHELL BRACKET
- (I 3016 LEFT WHITE LENTICULAR BRACKET
- )I 3017 RIGHT WHITE LENTICULAR BRACKET
- -? 301c WAVE DASH
- =T:) 3020 POSTAL MARK FACE
- A5 3041 HIRAGANA LETTER SMALL A
- a5 3042 HIRAGANA LETTER A
- I5 3043 HIRAGANA LETTER SMALL I
- i5 3044 HIRAGANA LETTER I
- U5 3045 HIRAGANA LETTER SMALL U
- u5 3046 HIRAGANA LETTER U
- E5 3047 HIRAGANA LETTER SMALL E
- e5 3048 HIRAGANA LETTER E
- O5 3049 HIRAGANA LETTER SMALL O
- o5 304a HIRAGANA LETTER O
- ka 304b HIRAGANA LETTER KA
-
-Simonsen [Page 32]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- ga 304c HIRAGANA LETTER GA
- ki 304d HIRAGANA LETTER KI
- gi 304e HIRAGANA LETTER GI
- ku 304f HIRAGANA LETTER KU
- gu 3050 HIRAGANA LETTER GU
- ke 3051 HIRAGANA LETTER KE
- ge 3052 HIRAGANA LETTER GE
- ko 3053 HIRAGANA LETTER KO
- go 3054 HIRAGANA LETTER GO
- sa 3055 HIRAGANA LETTER SA
- za 3056 HIRAGANA LETTER ZA
- si 3057 HIRAGANA LETTER SI
- zi 3058 HIRAGANA LETTER ZI
- su 3059 HIRAGANA LETTER SU
- zu 305a HIRAGANA LETTER ZU
- se 305b HIRAGANA LETTER SE
- ze 305c HIRAGANA LETTER ZE
- so 305d HIRAGANA LETTER SO
- zo 305e HIRAGANA LETTER ZO
- ta 305f HIRAGANA LETTER TA
- da 3060 HIRAGANA LETTER DA
- ti 3061 HIRAGANA LETTER TI
- di 3062 HIRAGANA LETTER DI
- tU 3063 HIRAGANA LETTER SMALL TU
- tu 3064 HIRAGANA LETTER TU
- du 3065 HIRAGANA LETTER DU
- te 3066 HIRAGANA LETTER TE
- de 3067 HIRAGANA LETTER DE
- to 3068 HIRAGANA LETTER TO
- do 3069 HIRAGANA LETTER DO
- na 306a HIRAGANA LETTER NA
- ni 306b HIRAGANA LETTER NI
- nu 306c HIRAGANA LETTER NU
- ne 306d HIRAGANA LETTER NE
- no 306e HIRAGANA LETTER NO
- ha 306f HIRAGANA LETTER HA
- ba 3070 HIRAGANA LETTER BA
- pa 3071 HIRAGANA LETTER PA
- hi 3072 HIRAGANA LETTER HI
- bi 3073 HIRAGANA LETTER BI
- pi 3074 HIRAGANA LETTER PI
- hu 3075 HIRAGANA LETTER HU
- bu 3076 HIRAGANA LETTER BU
- pu 3077 HIRAGANA LETTER PU
- he 3078 HIRAGANA LETTER HE
- be 3079 HIRAGANA LETTER BE
- pe 307a HIRAGANA LETTER PE
- ho 307b HIRAGANA LETTER HO
- bo 307c HIRAGANA LETTER BO
- po 307d HIRAGANA LETTER PO
- ma 307e HIRAGANA LETTER MA
- mi 307f HIRAGANA LETTER MI
- mu 3080 HIRAGANA LETTER MU
-
-Simonsen [Page 33]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- me 3081 HIRAGANA LETTER ME
- mo 3082 HIRAGANA LETTER MO
- yA 3083 HIRAGANA LETTER SMALL YA
- ya 3084 HIRAGANA LETTER YA
- yU 3085 HIRAGANA LETTER SMALL YU
- yu 3086 HIRAGANA LETTER YU
- yO 3087 HIRAGANA LETTER SMALL YO
- yo 3088 HIRAGANA LETTER YO
- ra 3089 HIRAGANA LETTER RA
- ri 308a HIRAGANA LETTER RI
- ru 308b HIRAGANA LETTER RU
- re 308c HIRAGANA LETTER RE
- ro 308d HIRAGANA LETTER RO
- wA 308e HIRAGANA LETTER SMALL WA
- wa 308f HIRAGANA LETTER WA
- wi 3090 HIRAGANA LETTER WI
- we 3091 HIRAGANA LETTER WE
- wo 3092 HIRAGANA LETTER WO
- n5 3093 HIRAGANA LETTER N
- vu 3094 HIRAGANA LETTER VU
- "5 309b KATAKANA-HIRAGANA VOICED SOUND MARK
- 05 309c KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
- *5 309d HIRAGANA ITERATION MARK
- +5 309e HIRAGANA VOICED ITERATION MARK
- a6 30a1 KATAKANA LETTER SMALL A
- A6 30a2 KATAKANA LETTER A
- i6 30a3 KATAKANA LETTER SMALL I
- I6 30a4 KATAKANA LETTER I
- u6 30a5 KATAKANA LETTER SMALL U
- U6 30a6 KATAKANA LETTER U
- e6 30a7 KATAKANA LETTER SMALL E
- E6 30a8 KATAKANA LETTER E
- o6 30a9 KATAKANA LETTER SMALL O
- O6 30aa KATAKANA LETTER O
- Ka 30ab KATAKANA LETTER KA
- Ga 30ac KATAKANA LETTER GA
- Ki 30ad KATAKANA LETTER KI
- Gi 30ae KATAKANA LETTER GI
- Ku 30af KATAKANA LETTER KU
- Gu 30b0 KATAKANA LETTER GU
- Ke 30b1 KATAKANA LETTER KE
- Ge 30b2 KATAKANA LETTER GE
- Ko 30b3 KATAKANA LETTER KO
- Go 30b4 KATAKANA LETTER GO
- Sa 30b5 KATAKANA LETTER SA
- Za 30b6 KATAKANA LETTER ZA
- Si 30b7 KATAKANA LETTER SI
- Zi 30b8 KATAKANA LETTER ZI
- Su 30b9 KATAKANA LETTER SU
- Zu 30ba KATAKANA LETTER ZU
- Se 30bb KATAKANA LETTER SE
- Ze 30bc KATAKANA LETTER ZE
- So 30bd KATAKANA LETTER SO
-
-Simonsen [Page 34]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- Zo 30be KATAKANA LETTER ZO
- Ta 30bf KATAKANA LETTER TA
- Da 30c0 KATAKANA LETTER DA
- Ti 30c1 KATAKANA LETTER TI
- Di 30c2 KATAKANA LETTER DI
- TU 30c3 KATAKANA LETTER SMALL TU
- Tu 30c4 KATAKANA LETTER TU
- Du 30c5 KATAKANA LETTER DU
- Te 30c6 KATAKANA LETTER TE
- De 30c7 KATAKANA LETTER DE
- To 30c8 KATAKANA LETTER TO
- Do 30c9 KATAKANA LETTER DO
- Na 30ca KATAKANA LETTER NA
- Ni 30cb KATAKANA LETTER NI
- Nu 30cc KATAKANA LETTER NU
- Ne 30cd KATAKANA LETTER NE
- No 30ce KATAKANA LETTER NO
- Ha 30cf KATAKANA LETTER HA
- Ba 30d0 KATAKANA LETTER BA
- Pa 30d1 KATAKANA LETTER PA
- Hi 30d2 KATAKANA LETTER HI
- Bi 30d3 KATAKANA LETTER BI
- Pi 30d4 KATAKANA LETTER PI
- Hu 30d5 KATAKANA LETTER HU
- Bu 30d6 KATAKANA LETTER BU
- Pu 30d7 KATAKANA LETTER PU
- He 30d8 KATAKANA LETTER HE
- Be 30d9 KATAKANA LETTER BE
- Pe 30da KATAKANA LETTER PE
- Ho 30db KATAKANA LETTER HO
- Bo 30dc KATAKANA LETTER BO
- Po 30dd KATAKANA LETTER PO
- Ma 30de KATAKANA LETTER MA
- Mi 30df KATAKANA LETTER MI
- Mu 30e0 KATAKANA LETTER MU
- Me 30e1 KATAKANA LETTER ME
- Mo 30e2 KATAKANA LETTER MO
- YA 30e3 KATAKANA LETTER SMALL YA
- Ya 30e4 KATAKANA LETTER YA
- YU 30e5 KATAKANA LETTER SMALL YU
- Yu 30e6 KATAKANA LETTER YU
- YO 30e7 KATAKANA LETTER SMALL YO
- Yo 30e8 KATAKANA LETTER YO
- Ra 30e9 KATAKANA LETTER RA
- Ri 30ea KATAKANA LETTER RI
- Ru 30eb KATAKANA LETTER RU
- Re 30ec KATAKANA LETTER RE
- Ro 30ed KATAKANA LETTER RO
- WA 30ee KATAKANA LETTER SMALL WA
- Wa 30ef KATAKANA LETTER WA
- Wi 30f0 KATAKANA LETTER WI
- We 30f1 KATAKANA LETTER WE
- Wo 30f2 KATAKANA LETTER WO
-
-Simonsen [Page 35]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- N6 30f3 KATAKANA LETTER N
- Vu 30f4 KATAKANA LETTER VU
- KA 30f5 KATAKANA LETTER SMALL KA
- KE 30f6 KATAKANA LETTER SMALL KE
- Va 30f7 KATAKANA LETTER VA
- Vi 30f8 KATAKANA LETTER VI
- Ve 30f9 KATAKANA LETTER VE
- Vo 30fa KATAKANA LETTER VO
- .6 30fb KATAKANA MIDDLE DOT
- -6 30fc KATAKANA-HIRAGANA PROLONGED SOUND MARK
- *6 30fd KATAKANA ITERATION MARK
- +6 30fe KATAKANA VOICED ITERATION MARK
- b4 3105 BOPOMOFO LETTER B
- p4 3106 BOPOMOFO LETTER P
- m4 3107 BOPOMOFO LETTER M
- f4 3108 BOPOMOFO LETTER F
- d4 3109 BOPOMOFO LETTER D
- t4 310a BOPOMOFO LETTER T
- n4 310b BOPOMOFO LETTER N
- l4 310c BOPOMOFO LETTER L
- g4 310d BOPOMOFO LETTER G
- k4 310e BOPOMOFO LETTER K
- h4 310f BOPOMOFO LETTER H
- j4 3110 BOPOMOFO LETTER J
- q4 3111 BOPOMOFO LETTER Q
- x4 3112 BOPOMOFO LETTER X
- zh 3113 BOPOMOFO LETTER ZH
- ch 3114 BOPOMOFO LETTER CH
- sh 3115 BOPOMOFO LETTER SH
- r4 3116 BOPOMOFO LETTER R
- z4 3117 BOPOMOFO LETTER Z
- c4 3118 BOPOMOFO LETTER C
- s4 3119 BOPOMOFO LETTER S
- a4 311a BOPOMOFO LETTER A
- o4 311b BOPOMOFO LETTER O
- e4 311c BOPOMOFO LETTER E
- eh4 311d BOPOMOFO LETTER EH
- ai 311e BOPOMOFO LETTER AI
- ei 311f BOPOMOFO LETTER EI
- au 3120 BOPOMOFO LETTER AU
- ou 3121 BOPOMOFO LETTER OU
- an 3122 BOPOMOFO LETTER AN
- en 3123 BOPOMOFO LETTER EN
- aN 3124 BOPOMOFO LETTER ANG
- eN 3125 BOPOMOFO LETTER ENG
- er 3126 BOPOMOFO LETTER ER
- i4 3127 BOPOMOFO LETTER I
- u4 3128 BOPOMOFO LETTER U
- iu 3129 BOPOMOFO LETTER IU
- v4 312a BOPOMOFO LETTER V
- nG 312b BOPOMOFO LETTER NG
- gn 312c BOPOMOFO LETTER GN
- (JU) 321c PARENTHESIZED HANGUL JU
-
-Simonsen [Page 36]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- 1c 3220 PARENTHESIZED IDEOGRAPH ONE
- 2c 3221 PARENTHESIZED IDEOGRAPH TWO
- 3c 3222 PARENTHESIZED IDEOGRAPH THREE
- 4c 3223 PARENTHESIZED IDEOGRAPH FOUR
- 5c 3224 PARENTHESIZED IDEOGRAPH FIVE
- 6c 3225 PARENTHESIZED IDEOGRAPH SIX
- 7c 3226 PARENTHESIZED IDEOGRAPH SEVEN
- 8c 3227 PARENTHESIZED IDEOGRAPH EIGHT
- 9c 3228 PARENTHESIZED IDEOGRAPH NINE
- 10c 3229 PARENTHESIZED IDEOGRAPH TEN
- KSC 327f KOREAN STANDARD SYMBOL
- ff fb00 LATIN SMALL LIGATURE FF
- fi fb01 LATIN SMALL LIGATURE FI
- fl fb02 LATIN SMALL LIGATURE FL
- ffi fb03 LATIN SMALL LIGATURE FFI
- ffl fb04 LATIN SMALL LIGATURE FFL
- ft fb05 LATIN SMALL LIGATURE FT
- st fb06 LATIN SMALL LIGATURE ST
- 3+; fe7d ARABIC SHADDA MEDIAL FORM
- aM. fe82 ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
- aH. fe84 ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
- a+- fe8d ARABIC LETTER ALEF ISOLATED FORM
- a+. fe8e ARABIC LETTER ALEF FINAL FORM
- b+- fe8f ARABIC LETTER BEH ISOLATED FORM
- b+, fe90 ARABIC LETTER BEH INITIAL FORM
- b+; fe91 ARABIC LETTER BEH MEDIAL FORM
- b+. fe92 ARABIC LETTER BEH FINAL FORM
- tm- fe93 ARABIC LETTER TEH MARBUTA ISOLATED FORM
- tm. fe94 ARABIC LETTER TEH MARBUTA FINAL FORM
- t+- fe95 ARABIC LETTER TEH ISOLATED FORM
- t+, fe96 ARABIC LETTER TEH INITIAL FORM
- t+; fe97 ARABIC LETTER TEH MEDIAL FORM
- t+. fe98 ARABIC LETTER TEH FINAL FORM
- tk- fe99 ARABIC LETTER THEH ISOLATED FORM
- tk, fe9a ARABIC LETTER THEH INITIAL FORM
- tk; fe9b ARABIC LETTER THEH MEDIAL FORM
- tk. fe9c ARABIC LETTER THEH FINAL FORM
- g+- fe9d ARABIC LETTER JEEM ISOLATED FORM
- g+, fe9e ARABIC LETTER JEEM INITIAL FORM
- g+; fe9f ARABIC LETTER JEEM MEDIAL FORM
- g+. fea0 ARABIC LETTER JEEM FINAL FORM
- hk- fea1 ARABIC LETTER HAH ISOLATED FORM
- hk, fea2 ARABIC LETTER HAH INITIAL FORM
- hk; fea3 ARABIC LETTER HAH MEDIAL FORM
- hk. fea4 ARABIC LETTER HAH FINAL FORM
- x+- fea5 ARABIC LETTER KHAH ISOLATED FORM
- x+, fea6 ARABIC LETTER KHAH INITIAL FORM
- x+; fea7 ARABIC LETTER KHAH MEDIAL FORM
- x+. fea8 ARABIC LETTER KHAH FINAL FORM
- d+- fea9 ARABIC LETTER DAL ISOLATED FORM
- d+. feaa ARABIC LETTER DAL FINAL FORM
- dk- feab ARABIC LETTER THAL ISOLATED FORM
- dk. feac ARABIC LETTER THAL FINAL FORM
-
-Simonsen [Page 37]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- r+- fead ARABIC LETTER REH ISOLATED FORM
- r+. feae ARABIC LETTER REH FINAL FORM
- z+- feaf ARABIC LETTER ZAIN ISOLATED FORM
- z+. feb0 ARABIC LETTER ZAIN FINAL FORM
- s+- feb1 ARABIC LETTER SEEN ISOLATED FORM
- s+, feb2 ARABIC LETTER SEEN INITIAL FORM
- s+; feb3 ARABIC LETTER SEEN MEDIAL FORM
- s+. feb4 ARABIC LETTER SEEN FINAL FORM
- sn- feb5 ARABIC LETTER SHEEN ISOLATED FORM
- sn, feb6 ARABIC LETTER SHEEN INITIAL FORM
- sn; feb7 ARABIC LETTER SHEEN MEDIAL FORM
- sn. feb8 ARABIC LETTER SHEEN FINAL FORM
- c+- feb9 ARABIC LETTER SAD ISOLATED FORM
- c+, feba ARABIC LETTER SAD INITIAL FORM
- c+; febb ARABIC LETTER SAD MEDIAL FORM
- c+. febc ARABIC LETTER SAD FINAL FORM
- dd- febd ARABIC LETTER DAD ISOLATED FORM
- dd, febe ARABIC LETTER DAD INITIAL FORM
- dd; febf ARABIC LETTER DAD MEDIAL FORM
- dd. fec0 ARABIC LETTER DAD FINAL FORM
- tj- fec1 ARABIC LETTER TAH ISOLATED FORM
- tj, fec2 ARABIC LETTER TAH INITIAL FORM
- tj; fec3 ARABIC LETTER TAH MEDIAL FORM
- tj. fec4 ARABIC LETTER TAH FINAL FORM
- zH- fec5 ARABIC LETTER ZAH ISOLATED FORM
- zH, fec6 ARABIC LETTER ZAH INITIAL FORM
- zH; fec7 ARABIC LETTER ZAH MEDIAL FORM
- zH. fec8 ARABIC LETTER ZAH FINAL FORM
- e+- fec9 ARABIC LETTER AIN ISOLATED FORM
- e+, feca ARABIC LETTER AIN INITIAL FORM
- e+; fecb ARABIC LETTER AIN MEDIAL FORM
- e+. fecc ARABIC LETTER AIN FINAL FORM
- i+- fecd ARABIC LETTER GHAIN ISOLATED FORM
- i+, fece ARABIC LETTER GHAIN INITIAL FORM
- i+; fecf ARABIC LETTER GHAIN MEDIAL FORM
- i+. fed0 ARABIC LETTER GHAIN FINAL FORM
- f+- fed1 ARABIC LETTER FEH ISOLATED FORM
- f+, fed2 ARABIC LETTER FEH INITIAL FORM
- f+; fed3 ARABIC LETTER FEH MEDIAL FORM
- f+. fed4 ARABIC LETTER FEH FINAL FORM
- q+- fed5 ARABIC LETTER QAF ISOLATED FORM
- q+, fed6 ARABIC LETTER QAF INITIAL FORM
- q+; fed7 ARABIC LETTER QAF MEDIAL FORM
- q+. fed8 ARABIC LETTER QAF FINAL FORM
- k+- fed9 ARABIC LETTER KAF ISOLATED FORM
- k+, feda ARABIC LETTER KAF INITIAL FORM
- k+; fedb ARABIC LETTER KAF MEDIAL FORM
- k+. fedc ARABIC LETTER KAF FINAL FORM
- l+- fedd ARABIC LETTER LAM ISOLATED FORM
- l+, fede ARABIC LETTER LAM INITIAL FORM
- l+; fedf ARABIC LETTER LAM MEDIAL FORM
- l+. fee0 ARABIC LETTER LAM FINAL FORM
- m+- fee1 ARABIC LETTER MEEM ISOLATED FORM
-
-Simonsen [Page 38]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- m+, fee2 ARABIC LETTER MEEM INITIAL FORM
- m+; fee3 ARABIC LETTER MEEM MEDIAL FORM
- m+. fee4 ARABIC LETTER MEEM FINAL FORM
- n+- fee5 ARABIC LETTER NOON ISOLATED FORM
- n+, fee6 ARABIC LETTER NOON INITIAL FORM
- n+; fee7 ARABIC LETTER NOON MEDIAL FORM
- n+. fee8 ARABIC LETTER NOON FINAL FORM
- h+- fee9 ARABIC LETTER HEH ISOLATED FORM
- h+, feea ARABIC LETTER HEH INITIAL FORM
- h+; feeb ARABIC LETTER HEH MEDIAL FORM
- h+. feec ARABIC LETTER HEH FINAL FORM
- w+- feed ARABIC LETTER WAW ISOLATED FORM
- w+. feee ARABIC LETTER WAW FINAL FORM
- j+- feef ARABIC LETTER ALEF MAKSURA ISOLATED FORM
- j+. fef0 ARABIC LETTER ALEF MAKSURA FINAL FORM
- y+- fef1 ARABIC LETTER YEH ISOLATED FORM
- y+, fef2 ARABIC LETTER YEH INITIAL FORM
- y+; fef3 ARABIC LETTER YEH MEDIAL FORM
- y+. fef4 ARABIC LETTER YEH FINAL FORM
- lM- fef5 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE
- ISOLATED FORM
- lM. fef6 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE
- FINAL FORM
- lH- fef7 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE
- ISOLATED FORM
- lH. fef8 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE
- FINAL FORM
- lh- fef9 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW
- ISOLATED FORM
- lh. fefa ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW
- FINAL FORM
- la- fefb ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
- la. fefc ARABIC LIGATURE LAM WITH ALEF FINAL FORM
- NU 0000 NULL (NUL)
- SH 0001 START OF HEADING (SOH)
- SX 0002 START OF TEXT (STX)
- EX 0003 END OF TEXT (ETX)
- ET 0004 END OF TRANSMISSION (EOT)
- EQ 0005 ENQUIRY (ENQ)
- AK 0006 ACKNOWLEDGE (ACK)
- BL 0007 BELL (BEL)
- BS 0008 BACKSPACE (BS)
- HT 0009 CHARACTER TABULATION (HT)
- LF 000a LINE FEED (LF)
- VT 000b LINE TABULATION (VT)
- FF 000c FORM FEED (FF)
- CR 000d CARRIAGE RETURN (CR)
- SO 000e SHIFT OUT (SO)
- SI 000f SHIFT IN (SI)
- DL 0010 DATALINK ESCAPE (DLE)
- D1 0011 DEVICE CONTROL ONE (DC1)
- D2 0012 DEVICE CONTROL TWO (DC2)
- D3 0013 DEVICE CONTROL THREE (DC3)
-
-Simonsen [Page 39]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- D4 0014 DEVICE CONTROL FOUR (DC4)
- NK 0015 NEGATIVE ACKNOWLEDGE (NAK)
- SY 0016 SYNCRONOUS IDLE (SYN)
- EB 0017 END OF TRANSMISSION BLOCK (ETB)
- CN 0018 CANCEL (CAN)
- EM 0019 END OF MEDIUM (EM)
- SB 001a SUBSTITUTE (SUB)
- EC 001b ESCAPE (ESC)
- FS 001c FILE SEPARATOR (IS4)
- GS 001d GROUP SEPARATOR (IS3)
- RS 001e RECORD SEPARATOR (IS2)
- US 001f UNIT SEPARATOR (IS1)
- DT 007f DELETE (DEL)
- PA 0080 PADDING CHARACTER (PAD)
- HO 0081 HIGH OCTET PRESET (HOP)
- BH 0082 BREAK PERMITTED HERE (BPH)
- NH 0083 NO BREAK HERE (NBH)
- IN 0084 INDEX (IND)
- NL 0085 NEXT LINE (NEL)
- SA 0086 START OF SELECTED AREA (SSA)
- ES 0087 END OF SELECTED AREA (ESA)
- HS 0088 CHARACTER TABULATION SET (HTS)
- HJ 0089 CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
- VS 008a LINE TABULATION SET (VTS)
- PD 008b PARTIAL LINE FORWARD (PLD)
- PU 008c PARTIAL LINE BACKWARD (PLU)
- RI 008d REVERSE LINE FEED (RI)
- S2 008e SINGLE-SHIFT TWO (SS2)
- S3 008f SINGLE-SHIFT THREE (SS3)
- DC 0090 DEVICE CONTROL STRING (DCS)
- P1 0091 PRIVATE USE ONE (PU1)
- P2 0092 PRIVATE USE TWO (PU2)
- TS 0093 SET TRANSMIT STATE (STS)
- CC 0094 CANCEL CHARACTER (CCH)
- MW 0095 MESSAGE WAITING (MW)
- SG 0096 START OF GUARDED AREA (SPA)
- EG 0097 END OF GUARDED AREA (EPA)
- SS 0098 START OF STRING (SOS)
- GC 0099 SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
- SC 009a SINGLE CHARACTER INTRODUCER (SCI)
- CI 009b CONTROL SEQUENCE INTRODUCER (CSI)
- ST 009c STRING TERMINATOR (ST)
- OC 009d OPERATING SYSTEM COMMAND (OSC)
- PM 009e PRIVACY MESSAGE (PM)
- AC 009f APPLICATION PROGRAM COMMAND (APC)
- e000 indicates unfinished (Mnemonic)
- /c e001 JOIN THIS LINE WITH NEXT LINE (Mnemonic)
- UA e002 Unit space A (ISO-IR-8-1 064)
- UB e003 Unit space B (ISO-IR-8-1 096)
- "3 e004 NON-SPACING UMLAUT (ISO-IR-38 201) (character part)
- "1 e005 NON-SPACING DIAERESIS WITH ACCENT (ISO-IR-70 192)
- (character part)
- "! e006 NON-SPACING GRAVE ACCENT (ISO-IR-103 193) (character
-
-Simonsen [Page 40]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- part)
- "' e007 NON-SPACING ACUTE ACCENT (ISO-IR-103 194) (character
- part)
- "> e008 NON-SPACING CIRCUMFLEX ACCENT (ISO-IR-103 195)
- (character part)
- "? e009 NON-SPACING TILDE (ISO-IR-103 196) (character part)
- "- e00a NON-SPACING MACRON (ISO-IR-103 197) (character part)
- "( e00b NON-SPACING BREVE (ISO-IR-103 198) (character part)
- ". e00c NON-SPACING DOT ABOVE (ISO-IR-103 199) (character part)
- ": e00d NON-SPACING DIAERESIS (ISO-IR-103 200) (character part)
- "0 e00e NON-SPACING RING ABOVE (ISO-IR-103 202) (character part)
- "" e00f NON-SPACING DOUBLE ACCUTE (ISO-IR-103 204) (character
- part)
- "< e010 NON-SPACING CARON (ISO-IR-103 206) (character part)
- ", e011 NON-SPACING CEDILLA (ISO-IR-103 203) (character part)
- "; e012 NON-SPACING OGONEK (ISO-IR-103 206) (character part)
- "_ e013 NON-SPACING LOW LINE (ISO-IR-103 204) (character
- part)
- "= e014 NON-SPACING DOUBLE LOW LINE (ISO-IR-38 217) (character
- part)
- "/ e015 NON-SPACING LONG SOLIDUS (ISO-IR-128 201) (character
- part)
- "i e016 GREEK NON-SPACING IOTA BELOW (ISO-IR-55 39) (character
- part)
- "d e017 GREEK NON-SPACING DASIA PNEUMATA (ISO-IR-55 38)
- (character part)
- "p e018 GREEK NON-SPACING PSILI PNEUMATA (ISO-IR-55 37)
- (character part)
- ;; e019 GREEK DASIA PNEUMATA (ISO-IR-18 92)
- ,, e01a GREEK PSILI PNEUMATA (ISO-IR-18 124)
- b3 e01b GREEK SMALL LETTER MIDDLE BETA (ISO-IR-18 99)
- Ci e01c CIRCLE (ISO-IR-83 0294)
- f( e01d FUNCTION SIGN (ISO-IR-143 221)
- ed e01e LATIN SMALL LETTER EZH (ISO-IR-158 142)
- am e01f ANTE MERIDIAM SIGN (ISO-IR-149 0267)
- pm e020 POST MERIDIAM SIGN (ISO-IR-149 0268)
- Tel e021 TEL COMPATIBILITY SIGN (ISO-IR-149 0269)
- a+: e022 ARABIC LETTER ALEF FINAL FORM COMPATIBILITY (IBM868 144)
- Fl e023 DUTCH GUILDER SIGN (IBM437 159)
- GF e024 GAMMA FUNCTION SIGN (ISO-10646-1DIS 032/032/037/122)
- >V e025 RIGHTWARDS VECTOR ABOVE (ISO-10646-1DIS 032/032/038/046)
- !* e026 GREEK VARIA (ISO-10646-1DIS 032/032/042/164)
- ?* e027 GREEK PERISPOMENI (ISO-10646-1DIS 032/032/042/165)
- J< e028 LATIN CAPITAL LETTER J WITH CARON (lowercase:
- 000/000/001/240)
-
-4. CHARSETS
-
- The character mnemonics hav been used to table a number of coded
- character sets. The coded character set names are taken if possible
- from the official ISO registration description in the ISO 2375 (ECMA)
- register, or with a number like the code page number - or with an
- indication of the language or country it is being used for - using
-
-Simonsen [Page 41]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- the country designators of ISO 3166. For the character sets in the
- ECMA register, their ISO registration number is also given (as ISO-
- IR-xxx). Often the ISO registration number does not cover all the
- codes of a character set in use, but for instance only the graphical
- characters, where another ISO registration number covers the control
- characters; in the case of the 8-bit character sets the ISO
- registration only covers the upper graphical characters (GR). The
- ISO registration number is here taken to indicate the full coded
- character set including control characters and lower half of the
- graphical characters, normally ISO 6429 and ASCII, respectively.
-
- The ISO definition of the term "coded character set" is as follows:
- "A set of unambiguous rules that establishes a character set and the
- one-to-one relationship between the characters of the set and their
- coded representation." and this definition may be subject to
- different interpretations. This memo does not put further
- restrictions on the term of "coded character set" than the following:
- "A coded character set is a set of rules that unambiguously and
- completely determines which sequence of characters, if any, is
- represented by each possible sequence of n-bit bytes for a certain
- value of n." This implies that e.g. a coded character set extended
- with one or more other coded character sets by means of the extension
- techniques of ISO 2022 constitutes a coded character set in its own
- right. In this memo the term "charset" is used to refer to the above
- interpretation of the ISO term "coded character set".
-
- A special problem is, if two characters of two different coded
- character sets with the same descriptive name, or depicted by what
- looks like the same graphic symbol, or with the same historical
- origin, really are to be regarded as the same character or not. This
- problem has been studied in great detail in the development efforts
- that have resulted in ISO DIS 10646 and Unicode (under the heading
- "character unification"). As much as possible such results have been
- used in the construction of the code tables of this section.
-
-4.1 Charset Naming
-
- The coded character set names are given in ISO 646 invariant subset
- (83 characters, where a space in the name is replaced with an
- underline character; sometimes a hyphen is also used instead of a
- blank, or the blank is eliminated when practice exist). Case is not
- significant in the charset names.
-
-4.2 Code Table Format
-
- The following code tables are given in a simple format to facilitate
- use of this text as program input. Programs and routines written in C
- to handle these tables are freely available from the author of this
- memo. Keywords are signified with the character "&" as the first
- character, to distinguish them from ordinary data. Numbers may be
- given in decimal, hexadecimal or octal notation; hexadecimal numbers
- are given with an "x" as the first character, and octal numbers has
- an "o" as the first character.
-
-Simonsen [Page 42]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- The following keywords are used:
-
- "&charset" has one parameter defining the name of the character set.
- This is required for every character set.
-
- "&alias" has one parameter defining a possible alternate name for the
- character set. This is optional.
-
- "&g0esc", "&g1esc", "&g2esc", "&g3esc", "&c0esc", "&c1esc" has one
- parameter indicating the string of octets used to define the
- character set as the G0, G1, G2, G3, C0 or C1 set respectively,
- according to ISO 2022 (11). The string is to be preceded by an ESC
- character. It is only the relevant parts of the table, which can be
- used with the definition; the charset is often coded with both
- graphical and control character sets. If the coded character set is
- a 96-character set, it is tabled with the relevant GL set (normally
- ISO-IR-6) and with ISO 6429 as C0 and C1 (12). If it is a 94-
- character set, it is tabled with the C0 set of ISO 6429. If it is a
- double-octet coded character set, it is tabled without control
- character sets and accompanying one-octet coded character sets, and
- the two-octet code is tabled as a G0 set.
-
- "&bits" has one parameter indicating the number of bits to represent
- the charset. This is optional and 8 bits is the default.
-
- "&code" has one parameter indicating the byte number allocated to the
- following character mnemonic. After the "&code" specification the
- characters are listed with their mnemonic in ascending order. A
- character mnemonic of "??" indicates that the position is unused. A
- character mnemonic of "__" indicates that the character set is not
- completely defined with the specifications in this memo.
-
- "&code2" has 2 parameters specifying the row and column in certain
- 16-bit character sets. The value 32 must be added to obtain the
- first and second byte respectively. Mnemonics can be specified after
- the "&code2" specification as mentioned for the "&code"
- specification.
-
- "&codex" has 5 parameters, specifying the character set prefix
- string, the start row number, the end row number, the start column
- number and the end column number respectively. This is equivalent to
- specifying a series of mnemonics of the form "nrrcc" where "n" is the
- character set name prefix string, "rr" is the row number running from
- the specified start row number to the end row number, and "cc" is the
- column number running from the specified start column number to the
- end column number. The thereby created series mnemonics are
- allocated to code positions which are added 32 to the row and column
- numbers to get the row and column octet.
-
- "&duplicate" has a special meaning indicating that a position is
- being used for more than one character. This is an ugly convention
- but it is a sad fact of life that same code in one coded character
- set can mean different characters. "&duplicate" takes two parameters
-
-Simonsen [Page 43]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- - the first is the code to be duplicated, the other is the new
- mnemonic.
-
- "&rem" is followed by text to explain something in the table to a
- human reader. All lines in such a remark has to start with this
- keyword.
-
- "&comb2" specifies a combination of two characters which signifies a
- third character. All characters in the specification are given by
- their mnemonic. The two combining characters must be specified
- previously in the code table. The first combining character is
- specified as the first character after the keyword, and then the
- following pairs of characters are the second combining character and
- the result, respectively. The specification can be repeated,
- terminated by an occurrence of a keyword.
-
-4.3 Mnemonic charsets
-
- The following is compatible with current practice on the internet
- within EUnet - the European not-for-profit networking organisation in
- Europe and North Africa currently operating in 24 countries.
-
- The mnemonic charsets are a family of charsets which have the
- facility that within the relevant parts of the message, encoded in an
- ordinary coded character set, text may have occurrences of the
- following sequence: an intro character sequence, followed by a string
- of characters that represent a character mnemonic, as described
- below. Similarly, the intro character sequence may be doubled,
- indicating a single occurrence of the respective symbols in decoded
- format.
-
- Note that many characters within a mnemonic character set may be
- represented in two different ways. Normally the character itself is
- used, but it is also possible to use the mnemonic allocated to the
- character in a mnemonic sequence.
-
- In this way all characters with assigned mnemonics can be represented
- without information loss in any character set, which contains the
- invariant ISO 646 characters as a subset. As a consequence, using a
- mnemonic character set all these characters can be generated
- uniformly on all keyboards and presented uniformly on all terminal
- equipment, whenever the real character is not available.
-
- Data encoded in a mnemonic charset is intended to be read by the end
- user possibly without further treatment. If the transport encoding
- and the presentation encoding for the user differ, it is recommended
- that the data be translated into a mnemonic representation in the
- presentation encoding.
-
- A mnemonic charset is specified with the name
- "mnemonic+charset+intro" where "mnemonic" is written as given and
- "charset" and "intro" is specified as described below. The mnemonic
- charset "mnemonic" is a shorthand for "mnemonic+ascii+38". The
-
-Simonsen [Page 44]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- mnemonic charset "mnem" is a shorthand for "mnemonic+ascii+8200".
-
- It is discouraged to use mnemonics for Chinese characters of either
- Chinese, Japanese or Korean origin, as the probability that the end
- user equipment can deal with the original encoding is very high for
- the intended receiver, and the mnemonics for such Chinese characters
- described in this memo convey very little meaning to humans.
-
-4.3.1 charset
-
- The charset is given as one of the charset names in this memo and is
- the encoding used for the transport. It cannot be a mnemonic
- charset.
-
-4.3.2 Intro
-
- The intro character sequence is given as the decimal value of the
- intro characters in the transport character set. There may be up to
- two characters used in the intro character sequence, and the decimal
- value for two-character intro sequences are then the first character
- value multiplied with 256 to the power of the number of octets used
- in the character set, plus the second character value. The
- recommended value is 38 for the ampersand (&) character in ASCII.
- Another common value is 29 for the control character "Group
- Separator", or 8200 for "space" followed by "backspace", which may be
- convenient when operating in some environments, and ordinary text is
- not changed. Only the ampersand character may be chosen as intro
- from the invariant ISO 646 charset, but any character not in the
- invariant ISO 646 character can be used as intro. The intro
- character sequence is used for introducing character mnemonics when a
- character is not present in the mail transport character set (as
- defined by "charset"). Character mnemonics longer than two
- characters are surrounded by the underline character. The intro
- character sequence is doubled to represent one occurrence of itself.
- Characters in the mail transport character set are normally just
- represented with their encoding, but may also be represented by the
- intro character sequence and the mnemonic encoding.
-
- If the intro character sequence is specified as 0 (zero), it is
- omitted in the transport, giving a better readably content, but
- eliminating the possibility of reversibility and introducing an
- information loss. With intro specified as 0, also underline
- characters surrounding mnemonics longer than 2 characters are
- removed. Mnemonic charsets with the intro specified as zero is
- equivalent to the ordinary charset, e.g. "mnemonic+ascii+0" is
- equivalent to "ascii".
-
- The intro character can be given in a header "Mnemonic-Intro:" with
- the value given in decimal as noted above in the first parameter.
- This has only meaning if the charset can be deducted by other
- information as specified by the relevant Internet specification.
- This information has precedence over other information on the intro.
-
-
-Simonsen [Page 45]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
-4.3.3 Compatibility
-
- If applications conforming to this memo interoperate with other
- versions of this memo, and encounter mnemonics that are undefined
- with this memo, they shall leave the mnemonic as it is coded. This
- provides for upward compatibility.
-
-4.3.4 Conversion Between Mnemonic Charsets
-
- To determine which mnemonic charsets are permitted with the use of an
- Internet specification, please refer to that specification. It may
- be that only "ASCII" or "INVARIANT" is allowed as the base charset.
- ASCII is the most used character set, while INVARIANT will be very
- robust for traversing gateways, but it will cause trouble for
- (amongst other things) source code for several programming languages.
- The use of other character sets may be limited to agreement between
- the communicating parties. When such an agreement has been achieved,
- a conversion between different mnemonic charsets can be done
- according to the charset tables below, as characters occurring in
- both encodings are just transformed, and characters not existing in
- the receiving coded character set are represented by the intro
- character sequence of the receiving coded character set plus the
- character mnemonic, as described for the intro character sequence.
- The characters forming the mnemonic are translated into the receiving
- code, which must have these characters present. An undefined
- character in the originating coded character set is transformed into
- the following sequence: the intro character sequence, an underline, a
- question mark character, a "u" (for undefined) and then the
- hexadecimal value of the character with letters in lowercase
- (possibly more than one byte for multibyte character sets) and then a
- terminating underline character. Headers may need to be changed
- accordingly to reflect such conversion. The character mnemonic "/c"
- has a special meaning in specifying that a line is to be continued
- even if the next characters are specifying a new line.
-
-5. CHARSET TABLES
-
- &charset ISO_646.basic:1983
- &rem source: ECMA registry
- &alias ref
- &code 32
- SP ! " ?? ?? % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- ?? A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?? ?? ?? ?? _
- ?? a b c d e f g h i j k l m n o p q r s t u v w x y z
-
- &charset INVARIANT
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " ?? ?? % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- ?? A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?? ?? ?? ?? _
- ?? a b c d e f g h i j k l m n o p q r s t u v w x y z ?? ?? ?? ?? DT
-
-
-Simonsen [Page 46]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- &charset ISO_646.irv:1983
- &rem source: ECMA registry
- &alias iso-ir-2
- &alias irv
- &g0esc x2840 &g1esc x2940 &g2esc x2a40 &g3esc x2b40
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '- DT
-
- &charset BS_4730
- &rem source: ECMA registry
- &alias iso-ir-4
- &alias ISO646-GB
- &g0esc x2841 &g1esc x2941 &g2esc x2a41 &g3esc x2b41
- &alias gb
- &alias uk
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Pd DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '- DT
-
- &charset ANSI_X3.4-1968
- &rem source: ECMA registry
- &alias iso-ir-6
- &alias ANSI_X3.4-1986
- &alias ISO_646.irv:1991
- &g0esc x2842 &g1esc x2942 &g2esc x2a42 &g3esc x2b42
- &alias ASCII
- &alias ISO646-US
- &alias US-ASCII
- &alias us
- &alias IBM367
- &alias cp367
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
-
- &charset NATS-SEFI
- &rem source: ECMA registry
- &alias iso-ir-8-1
- &g0esc x2843 &g1esc x2943 &g2esc x2a43 &g3esc x2b43
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
-
-Simonsen [Page 47]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- UA A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A: O: AA fS _
- UB a b c d e f g h i j k l m n o p q r s t u v w x y z a: o: aa -N DT
-
- &charset NATS-SEFI-ADD
- &rem source: ECMA registry
- &alias iso-ir-8-2
- &g0esc x2844 &g1esc x2944 &g2esc x2a44 &g3esc x2b44
- &code 0
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? A! ?? ?? D/ E' ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- TH ?? ?? ?? ?? U: ?? ?? ?? ?? ?? AE O/ ?? ?? ??
- ?? a! ?? ?? d/ e' ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- th ?? ?? ?? ?? u: ?? ?? ?? ?? ?? ae o/ ?? ?? ??
-
- &charset NATS-DANO
- &rem source: ECMA registry
- &alias iso-ir-9-1
- &g0esc x2845 &g1esc x2945 &g2esc x2a45 &g3esc x2b45
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! << >> DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- UA A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AE O/ AA fS _
- UB a b c d e f g h i j k l m n o p q r s t u v w x y z ae o/ aa -N DT
-
- &charset NATS-DANO-ADD
- &rem source: ECMA registry
- &alias iso-ir-9-2
- &g0esc x2846 &g1esc x2946 &g2esc x2a46 &g3esc x2b46
- &code 0
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? A! ?? ?? D/ E' ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- TH ?? ?? ?? ?? U: ?? ?? ?? ?? ?? A: O: ?? ?? ??
- ?? a! ?? ?? d/ e' ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- th ?? ?? ?? ?? u: ?? ?? ?? ?? ?? a: o: ?? ?? ??
-
- &charset SEN_850200_B
- &rem source: ECMA registry
- &alias iso-ir-10
- &alias FI
- &alias ISO646-FI
- &alias ISO646-SE
- &alias se
- &g0esc x2847 &g1esc x2947 &g2esc x2a47 &g3esc x2b47
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
-
-Simonsen [Page 48]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A: O: AA '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z a: o: aa '- DT
-
- &charset SEN_850200_C
- &rem source: ECMA registry
- &alias iso-ir-11
- &alias ISO646-SE2
- &g0esc x2848 &g1esc x2948 &g2esc x2a48 &g3esc x2b48
- &alias se2
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- E' A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A: O: AA U: _
- e' a b c d e f g h i j k l m n o p q r s t u v w x y z a: o: aa u: DT
-
- &charset JIS_C6220-1969-jp
- &rem source: ECMA registry
- &alias JIS_C6220-1969
- &alias iso-ir-13
- &alias katakana
- &alias x0201-7
- &g0esc x2849 &g1esc x2949 &g2esc x2a49 &g3esc x2b49
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ._ <' >' ,_ .6 Wo a6 i6 u6 e6 o6 YA YU YO TU
- -6 A6 I6 U6 E6 O6 Ka Ki Ku Ke Ko Sa Si Su Se So
- Ta Ti Tu Te To Na Ni Nu Ne No Ha Hi Hu He Ho Ma
- Mi Mu Me Mo Ya Yu Yo Ra Ri Ru Re Ro Wa N6 "5 05
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? DT
-
- &charset JIS_C6220-1969-ro
- &rem source: ECMA registry
- &alias iso-ir-14
- &g0esc x284a &g1esc x294a &g2esc x2a4a &g3esc x2b4a
- &alias jp
- &alias ISO646-JP
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( Ye )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '- DT
-
- &charset IT
- &rem source: ECMA registry
- &alias iso-ir-15
- &alias ISO646-IT
- &g0esc x2859 &g1esc x2959 &g2esc x2a59 &g3esc x2b59
- &code 0
-
-Simonsen [Page 49]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Pd DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- SE A B C D E F G H I J K L M N O P Q R S T U V W X Y Z DG c, e' '> _
- u! a b c d e f g h i j k l m n o p q r s t u v w x y z a! o! e! i! DT
-
- &charset PT
- &rem source: ECMA registry
- &alias iso-ir-16
- &alias ISO646-PT
- &g0esc x284c &g1esc x294c &g2esc x2a4c &g3esc x2b4c
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- SE A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A? C, O? '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z a? c, o? DG DT
-
- &charset ES
- &rem source: ECMA registry
- &alias iso-ir-17
- &alias ISO646-ES
- &g0esc x285a &g1esc x295a &g2esc x2a5a &g3esc x2b5a
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Pd DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- SE A B C D E F G H I J K L M N O P Q R S T U V W X Y Z !I N? ?I '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z DG n? c, '? DT
-
- &charset greek7-old
- &rem source: ECMA registry
- &alias iso-ir-18
- &g0esc x285b &g1esc x295b &g2esc x2a5b &g3esc x2b5b
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Pd DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- '' a* b* q* d* e* f* g* y* i* c* k* l* m* n* o*
- p* j3 r* s* t* h* w* *s x* u* z* ?, ,, ,' '? _
- '! A* B* Q* D* E* F* G* Y* I* C* K* L* M* N* O*
- P* ?? R* S* T* H* W* .M X* U* Z* ?; ;; ;' ': DT
-
- &charset latin-greek
- &rem source: ECMA registry
- &alias iso-ir-19
- &g0esc x285c &g1esc x295c &g2esc x2a5c &g3esc x2b5c
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Pd DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O
- P Q R S T U V W X Y Z <( // )> '> _
-
-Simonsen [Page 50]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- '! A* B* Q* D* E* F* G* Y* I* C* K* L* M* N* O*
- P* ?? R* S* T* H* W* .M X* U* Z* (! !! !) ': DT
-
- &charset DIN_66003
- &rem source: ECMA registry
- &alias iso-ir-21
- &g0esc x284b &g1esc x294b &g2esc x2a4b &g3esc x2b4b
- &alias de
- &alias ISO646-DE
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- SE A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A: O: U: '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z a: o: u: ss DT
-
- &charset NF_Z_62-010_(1973)
- &rem source: ECMA registry
- &alias iso-ir-25
- &alias ISO646-FR1
- &g0esc x2852 &g1esc x2952 &g2esc x2a52 &g3esc x2b52
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Pd DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- a! A B C D E F G H I J K L M N O P Q R S T U V W X Y Z DG c, SE '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z e' u! e! ': DT
-
- &charset Latin-greek-1
- &rem source: ECMA registry
- &alias iso-ir-27
- &g0esc x2855 &g1esc x2955 &g2esc x2a55 &g3esc x2b55
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP C* " G* Cu % & ' ( ) * + , - . /
- 0 1 2 3 4 5 6 7 8 9 Q* ; < = > P*
- D* A B C D E F G H I J K L M N O
- P Q R S T U V W X Y Z W* H* F* L* S*
- '! a b c d e f g h i j k l m n o
- p q r s t u v w x y z (! !! !) '- DT
-
- &charset ISO_5427
- &rem source: ECMA registry
- &alias iso-ir-37
- &g0esc x284e &g1esc x294e &g2esc x2a4e &g3esc x2b4e
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- ju a= b= c= d= e= f= g= h= i= j= k= l= m= n= o=
- p= ja r= s= t= u= z% v= %' y= z= s% je sc c% ='
- JU A= B= C= D= E= F= G= H= I= J= K= L= M= N= O=
-
-Simonsen [Page 51]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- P= JA R= S= T= U= Z% V= %" Y= Z= S% JE Sc C% DT
-
- &charset JIS_C6226-1978
- &rem source: ECMA registry
- &alias iso-ir-42
- &bits 16
- &g0esc x2440 &g1esc x242940 &g2esc x242a40 &g3esc x242b40
- &code2 1 1
- SP ,_ ._ , . .6 : ; ! "5 05 '' '! ': '> '- _ *6 +6 *5 +5 +"
- +_ *_ ;_ 0_ -6 -? -N
- &code2 1 31
- FD BD ?1 PP !! .3 .. '6 '9 "6 "9 ( ) (' )' <( )>
- (! !) <1 >1 </ /> <' >' <" >" (" )" + - +- *X -: = != < > =< >= 00
- .: Ml Fm DG 1' 2' oC Ye DO Ct Pd % Nb & * At SE *1 *2 0m 0M 0o LZ
- &code2 2 1
- Db OS fS uT UT dT DT :X =T -> <- -! -v =_
- &code2 3 16
- 0 1 2 3 4 5 6 7 8 9
- &code2 3 33
- A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
- &code2 3 65
- a b c d e f g h i j k l m n o p q r s t u v w x y z
- &code2 4 1
- A5 a5 I5 i5 U5 u5 E5 e5 O5 o5 ka ga ki gi ku
- gu ke ge ko go sa za si zi su zu se ze so zo ta
- da ti di tU tu du te de to do na ni nu ne no ha
- ba pa hi bi pi hu bu pu he be pe ho bo po ma mi
- mu me mo yA ya yU yu yO yo ra ri ru re ro wA wa
- wi we wo n5
- &code2 5 1
- a6 A6 i6 I6 u6 U6 e6 E6 o6 O6 Ka Ga Ki Gi Ku
- Gu Ke Ge Ko Go Sa Za Si Zi Su Zu Se Ze So Zo Ta
- Da Ti Di TU Tu Du Te De To Do Na Ni Nu Ne No Ha
- Ba Pa Hi Bi Pi Hu Bu Pu He Be Pe Ho Bo Po Ma Mi
- Mu Me Mo YA Ya YU Yu YO Yo Ra Ri Ru Re Ro WA Wa
- Wi We Wo N6 Vi KA KE
- &code2 6 1
- A* B* G* D* E* Z* Y* H* I* K* L* M* N* C* O*
- P* R* S* T* U* F* X* Q* W*
- &code2 6 33
- a* b* g* d* e* z* y* h* i* k* l* m* n* c* o*
- p* r* s* t* u* f* x* q* w*
- &code2 7 1
- A= B= V= G= D= E= IO Z% Z= I= J= K= L= M= N= O= P=
- R= S= T= U= F= H= C= C% S% Sc =" Y= %" JE JU JA
- &code2 7 49
- a= b= v= g= d= e= io z% z= i= j= k= l= m= n= o= p=
- r= s= t= u= f= h= c= c% s% sc =' y= %' je ju ja
- &codex j 16 46 1 94
- &codex j 47 47 1 51
- &codex j 48 83 1 94
-
- &charset BS_viewdata
-
-Simonsen [Page 52]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- &rem source: ECMA registry
- &alias iso-ir-47
- &g0esc x2856 &g1esc x2956 &g2esc x2a56 &g3esc x2b56
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Pd DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <- 12 -> -! OS
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z 14 PP 34 -: DT
-
- &charset INIS
- &rem source: ECMA registry
- &alias iso-ir-49
- &g0esc x2857 &g1esc x2957 &g2esc x2a57 &g3esc x2b57
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ?? ?? ?? DO % ?? ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ??
- ?? A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( ?? )> ?? ??
- ?? a b c d e f g h i j k l m n o p q r s t u v w x y z ?? !! ?? ?? DT
-
- &charset INIS-8
- &rem source: ECMA registry
- &alias iso-ir-50
- &g0esc x285d &g1esc x295d &g2esc x2a5d &g3esc x2b5d
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? a* b* g* d* C* ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? -> In
- 0S 1S 2S 3S 4S 5S 6S 7S 8S 9S +S -S Ru D* L* W*
- 0s 1s 2s 3s 4s 5s 6s 7s 8s 9s S* m* n* w* p* DT
-
- &charset INIS-cyrillic
- &rem source: ECMA registry
- &alias iso-ir-51
- &g0esc x285e &g1esc x295e &g2esc x2a5e &g3esc x2b5e
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? RT ?? -> In
- a* b* g* d* S* m* n* w* p* C* D* L* W* =" -S +S
- ju a= b= c= d= e= f= g= h= i= j= k= l= m= n= o=
- p= ja r= s= t= u= z% v= %' y= z= s% je sc c% ='
- JU A= B= C= D= E= F= G= H= I= J= K= L= M= N= O=
- P= JA R= S= T= U= Z% V= %" Y= Z= S% JE Sc C% DT
-
- &charset ISO_5427:1981
- &rem source: ECMA registry
- &alias iso-ir-54
- &g0esc x2851 &g1esc x2951 &g2esc x2a51 &g3esc x2b51
-
-Simonsen [Page 53]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- g3 d% g% ie io ds ii yi j% lj nj ts kj v% dz ??
- y3 f3 v3 o3 ?? ?? ?? ?? ?? ?? ?? <( ?? )> ?? _
- G3 D% G% IE IO DS II YI J% LJ NJ Ts KJ V% DZ ="
- Y3 F3 V3 O3 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? DT
-
- &charset ISO_5428:1980
- &rem source: ECMA registry
- &alias iso-ir-55
- &g0esc x2853 &g1esc x2953 &g2esc x2a53 &g3esc x2b53
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP "! "' ": "? "p "d "i ?? ?? ?? ?? ?? ?? ?? ??
- << >> "9 "6 'G ,G ?? ?? ?? ?? ?? .M ?? ?? ?? ;
- ?? A* B* ?? G* D* E* T3 M3 Z* Y* H* I* K* L* M*
- N* C* O* P* K3 R* S* ?? T* U* F* X* Q* W* P3 ??
- ?? a* b* b3 g* d* e* t3 m3 z* y* h* i* k* l* m*
- n* c* o* p* k3 r* s* *s t* u* f* x* q* w* p3 DT
-
- &charset GB_1988-80
- &rem source: ECMA registry
- &alias iso-ir-57
- &g0esc x2854 &g1esc x2954 &g2esc x2a54 &g3esc x2b54
- &alias cn
- &alias ISO646-CN
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb Ye % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '- DT
-
- &charset GB_2312-80
- &rem source: ECMA registry
- &alias iso-ir-58
- &g0esc x2441 &g1esc x242941 &g2esc x242a41 &g3esc x242b41
- &bits 16
- &alias chinese
- &code2 1 1
- SP ,_ .6 .M 'm '< ': +" *_ -6 ?1
- !2 .3 '6 '9 "6 "9 (' )'
- <1 >1 << >> <+ >+ <7 7> (I )I (" )" +- *X -: :R AN OR +Z *P (U )U (-
- :: RT -T PP -L
- (A 0. In Io =3 =? ?2 CG 0( != !< !> =< >= 00
- :. .: Ml Fm DG 1' 2' oC DO
- Cu Ct Pd %0 SE NB *1 *2 0m 0M 0o Dw Db OS fS uT UT :X -> <- -! -v =_
- &code2 2 17
- 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
-
-Simonsen [Page 54]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14)
- (15) (16) (17) (18) (19) (20) 1-o 2-o 3-o 4-o 5-o 6-o 7-o 8-o 9-o
- &code2 2 69
- 1c 2c 3c 4c 5c 6c 7c 8c 9c 10c
- &code2 2 81
- 1R 2R 3R 4R 5R 6R 7R 8R 9R aR bR cR
- &code2 3 1
- ! " Nb Ye % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7
- 8 9 : ; < = > ? At A B C D E F G H I J K L M N O
- P Q R S T U V W X Y Z <( // )> '> _ a b c d e f g
- h i j k l m n o p q r s t u v w x y z (! !! !) '-
- &code2 4 1
- A5 a5 I5 i5 U5 u5 E5 e5 O5 o5 ka ga ki gi ku
- gu ke ge ko go sa za si zi su zu se ze so zo ta
- da ti di tU tu du te de to do na ni nu ne no ha
- ba pa hi bi pi hu bu pu he be pe ho bo po ma mi
- mu me mo yA ya yU yu yO yo ra ri ru re ro wA wa
- wi we wo n5
- &code2 5 1
- a6 A6 i6 I6 u6 U6 e6 E6 o6 O6 Ka Ga Ki Gi Ku
- Gu Ke Ge Ko Go Sa Za Si Zi Su Zu Se Ze So Zo Ta
- Da Ti Di TU Tu Du Te De To Do Na Ni Nu Ne No Ha
- Ba Pa Hi Bi Pi Hu Bu Pu He Be Pe Ho Bo Po Ma Mi
- Mu Me Mo YA Ya YU Yu YO Yo Ra Ri Ru Re Ro WA Wa
- Wi We Wo N6 Vi KA KE
- &code2 6 1
- A* B* G* D* E* Z* Y* H* I* K* L* M* N* C* O*
- P* R* S* T* U* F* X* Q* W*
- &code2 6 33
- a* b* g* d* e* z* y* h* i* k* l* m* n* c* o*
- p* r* s* t* u* f* x* q* w*
- &code2 7 1
- A= B= V= G= D= E= IO Z% Z= I= J= K= L= M= N= O= P=
- R= S= T= U= F= H= C= C% S% Sc =" Y= %" JE JU JA
- &code2 7 49
- a= b= v= g= d= e= io z% z= i= j= k= l= m= n= o= p=
- r= s= t= u= f= h= c= c% s% sc =' y= %' je ju ja
- &code2 8 1
- a- a' a< a! e- e' e< e! i- i' i< i! o- o' o< o! u- u' u< u! u:- u:<
- u:! u: e>
- &code2 8 37
- b4 p4 m4 f4 d4 t4 n4 l4 g4 k4 h4 j4 q4 x4 zh ch sh r4 z4 c4
- s4 a4 o4 e4 eh4 ai ei au ou an en aN eN er i4 u4 iu
- &code2 9 4
- hh HH vv VV 3- 3_ 3! 3/ 4- 4_ 4! 4/ dr dR Dr DR dl dL Dl LD
- ur uR Ur UR ul uL Ul UL vr vR Udr uDr Vr UdR uDR VR
- vl vL Udl uDl Vl UdL uDL VL
- dh dLr dlR dH Dh DLr DlR DH
- vh vLr vlR vH Udh uDh Vh UdLr
- UdlR uDLr uDlR UdH uDH VLr VlR VH
- &codex c 16 54 1 94
- &codex c 55 55 1 89
- &codex c 56 87 1 94
-
-Simonsen [Page 55]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
-
- &charset NS_4551-1
- &rem source: ECMA registry
- &alias iso-ir-60
- &alias ISO646-NO
- &g0esc x2860 &g1esc x2960 &g2esc x2a60 &g3esc x2b60
- &alias no
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AE O/ AA '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z ae o/ aa '- DT
-
- &charset NS_4551-2
- &rem source: ECMA registry
- &alias ISO646-NO2
- &alias iso-ir-61
- &g0esc x2861 &g1esc x2961 &g2esc x2a61 &g3esc x2b61
- &alias no2
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " PI DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AE O/ AA '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z ae o/ aa !! DT
-
- &charset NF_Z_62-010
- &rem source: ECMA registry
- &alias iso-ir-69
- &alias ISO646-FR
- &g0esc x2866 &g1esc x2966 &g2esc x2a66 &g3esc x2b66
- &alias fr
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Pd DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- a! A B C D E F G H I J K L M N O P Q R S T U V W X Y Z DG c, SE '> _
- My a b c d e f g h i j k l m n o p q r s t u v w x y z e' u! e! ': DT
-
- &charset videotex-suppl
- &rem source: ECMA registry
- &alias iso-ir-70
- &g0esc x2862 &g1esc x2962 &g2esc x2a62 &g3esc x2b62
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " ?? ?? % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '- DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- NS !I Ct Pd DO Ye Nb SE Cu '6 "6 << <- -! -> -v
-
-Simonsen [Page 56]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- DG +- 2S 3S *X My PI .M -: '9 "9 >> 14 12 34 ?I
- "1 "! "' "> "? "- "( ". ": ?? "0 ", ?? "" "; "<
- -M 1S Rg Co TM Md ?? ?? ?? ?? ?? ?? 18 38 58 78
- Om AE D- -a H/ ?? IJ L. L/ O/ OE -o TH T/ NG 'n
- kk ae d/ d- h/ i. ij l. l/ o/ oe ss th t/ ng ??
- &comb2 "' SP '' a a' A A' e e' E E' i i' I I' o o' O O' u u' U U'
- y y' Y Y' c c' C C' l l' L L' n n' N N' r r' R R'
- s s' S S' z z' Z Z'
- &comb2 "( SP '( a a( A A( g g( G G( u u( U U(
- &comb2 "< SP '< c c< C C< d d< D D< e e< E E< l l< L L< n n< N N<
- r r< R R< s s< S S< t t< T T< z z< Z Z<
- &comb2 ", SP ', c c, C C, g g, G G, k k, K K, l l, L L, n n, N N,
- r r, R R, s s, S S, t t, T T,
- &comb2 "> a a> A A> e e> E E> i i> I I> o o> O O> u u> U U>
- y y> Y Y> c c> C C> g g> G G> h h> H H> j j> J J>
- s s> S S> w w> W W>
- &comb2 ": SP ': a a: A A: e e: E E: i i: I I: o o: O O: u u: U U:
- y y: Y Y:
- &comb2 ". SP '. c c. C C. e e. E E. g g. G G. I I. z z. Z Z.
- &comb2 "" SP '" o o" O O" u u" U U"
- &comb2 "! a a! A A! e e! E E! i i! I I! o o! O O! u u! U U!
- &comb2 "- a a- A A- e e- E E- i i- I I- o o- O O- u u- U U-
- &comb2 "; SP '; a a; A A; e e; E E; i i; I I; u u; U U;
- &comb2 "0 SP '0 a aa A AA u u0 U U0
- &comb2 "? SP '? a a? A A? n n? N N? i i? I I? o o? O O? u u? U U?
-
- &charset PT2
- &rem source: ECMA registry
- &alias iso-ir-84
- &alias ISO646-PT2
- &g0esc x2867 &g1esc x2967 &g2esc x2a67 &g3esc x2b67
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- '' A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A? C, O? '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z a? c, o? '- DT
-
- &charset ES2
- &rem source: ECMA registry
- &alias iso-ir-85
- &alias ISO646-ES2
- &g0esc x2868 &g1esc x2968 &g2esc x2a68 &g3esc x2b68
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- Sb A B C D E F G H I J K L M N O P Q R S T U V W X Y Z !I N? C, ?I _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z '' n? c, ': DT
-
- &charset MSZ_7795.3
- &rem source: ECMA registry
- &alias iso-ir-86
-
-Simonsen [Page 57]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- &alias ISO646-HU
- &g0esc x2869 &g1esc x2969 &g2esc x2a69 &g3esc x2b69
- &alias hu
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- A' A B C D E F G H I J K L M N O P Q R S T U V W X Y Z E' O: U: '> _
- a' a b c d e f g h i j k l m n o p q r s t u v w x y z e' o: u: '" DT
-
- &charset JIS_C6226-1983
- &rem source: ECMA registry
- &alias iso-ir-87
- &bits 16
- &g0esc x2442 &g1esc x242942 &g2esc x242a42 &g3esc x242b42
- &alias x0208
- &alias JIS_X0208-1983
- &code2 1 1
- SP ,_ ._ , . .6 : ; ! "5 05 '' '! ': '> '- _ *6 +6 *5 +5 +"
- +_ *_ ;_ 0_ -6 -? -N
- &code2 1 31
- FD BD ?1 PP !! .3 .. '6 '9 "6 "9 ( ) (' )' <( )>
- (! !) <1 >1 </ /> <' >' <" >" (" )" + - +- *X -: = != < > =< >= 00
- .: Ml Fm DG 1' 2' oC Ye DO Ct Pd % Nb & * At SE *1 *2 0m 0M 0o LZ
- &code2 2 1
- Db OS fS uT UT dT DT :X =T -> <- -! -v =_
- &code2 2 26
- (- -) (_ )_ (C )C (U )U
- &code2 2 42
- AN OR NO => <= FA TE
- &code2 2 60
- -V -T (A dP NB =3 HI <* *> RT CG 0( :. In DI
- &code2 2 82
- AA %0 MX Mb Md /- /= PI
- &code2 2 94
- Ci
- &code2 3 16
- 0 1 2 3 4 5 6 7 8 9
- &code2 3 33
- A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
- &code2 3 65
- a b c d e f g h i j k l m n o p q r s t u v w x y z
- &code2 4 1
- A5 a5 I5 i5 U5 u5 E5 e5 O5 o5 ka ga ki gi ku
- gu ke ge ko go sa za si zi su zu se ze so zo ta
- da ti di tU tu du te de to do na ni nu ne no ha
- ba pa hi bi pi hu bu pu he be pe ho bo po ma mi
- mu me mo yA ya yU yu yO yo ra ri ru re ro wA wa
- wi we wo n5
- &code2 5 1
- a6 A6 i6 I6 u6 U6 e6 E6 o6 O6 Ka Ga Ki Gi Ku
- Gu Ke Ge Ko Go Sa Za Si Zi Su Zu Se Ze So Zo Ta
- Da Ti Di TU Tu Du Te De To Do Na Ni Nu Ne No Ha
-
-Simonsen [Page 58]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- Ba Pa Hi Bi Pi Hu Bu Pu He Be Pe Ho Bo Po Ma Mi
- Mu Me Mo YA Ya YU Yu YO Yo Ra Ri Ru Re Ro WA Wa
- Wi We Wo N6 Vi KA KE
- &code2 6 1
- A* B* G* D* E* Z* Y* H* I* K* L* M* N* C* O*
- P* R* S* T* U* F* X* Q* W*
- &code2 6 33
- a* b* g* d* e* z* y* h* i* k* l* m* n* c* o*
- p* r* s* t* u* f* x* q* w*
- &code2 7 1
- A= B= V= G= D= E= IO Z% Z= I= J= K= L= M= N= O= P=
- R= S= T= U= F= H= C= C% S% Sc =" Y= %" JE JU JA
- &code2 7 49
- a= b= v= g= d= e= io z% z= i= j= k= l= m= n= o= p=
- r= s= t= u= f= h= c= c% s% sc =' y= %' je ju ja
- &code2 8 1
- hh vv dr dl ul ur vr dh vl uh vh
- HH VV DR LD UL UR VR DH VL UH VH
- Vr dH Vl uH vH vR Dh vL Uh Vh
- &codex j 16 46 1 94
- &codex j 47 47 1 51
- &codex j 48 83 1 94
- &codex j 84 84 1 4
-
- &charset greek7
- &rem source: ECMA registry
- &alias iso-ir-88
- &g0esc x286a &g1esc x296a &g2esc x2a6a &g3esc x2b6a
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A* B* G* D* E* Z* Y* H* I* ?? K* L* M* N* C*
- O* P* R* S* T* U* F* ?? X* Q* W* <( // )> '> _
- '! a* b* g* d* e* z* y* h* i* ?? k* l* m* n* c*
- o* p* r* s* t* u* f* *s x* q* w* (! !! !) '- DT
-
- &charset ASMO_449
- &rem source: ECMA registry
- &alias ISO_9036
- &alias arabic7
- &alias iso-ir-89
- &g0esc x286b &g1esc x296b &g2esc x2a6b &g3esc x2b6b
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb Cu % & ' ( ) * + ,+ - . / 0 1 2 3 4 5 6 7 8 9 : ;+ < = > ?+
- At H' aM aH wH ah yH a+ b+ tm t+ tk g+ hk x+ d+
- dk r+ z+ s+ sn c+ dd tj zH e+ i+ <( // )> '> _
- ++ f+ q+ k+ l+ m+ n+ h+ w+ j+ y+ :+ "+ =+ /+ '+
- 1+ 3+ 0+ ?? ?? ?? ?? ?? ?? ?? ?? (! !! !) '- DT
-
- &charset iso-ir-90
-
-Simonsen [Page 59]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- &rem source: ECMA registry
- &g0esc x286c &g1esc x296c &g2esc x2a6c &g3esc x2b6c
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '- DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- NS !I Ct Pd DO Ye ?? SE ?? '6 "6 << <- -! -> -v
- DG +- 2S 3S *X My PI .M -: '9 "9 >> 14 12 34 ?I
- ?? "! "' "> "? "- "( ". ": ?? "0 ", "_ "" "; "<
- -M 1S Rg Co TM Md ?? ?? ?? ?? ?? ?? 18 38 58 78
- Om AE D- -a H/ ?? IJ L. L/ O/ OE -o TH T/ NG 'n
- kk ae d/ d- h/ i. ij l. l/ o/ oe ss th t/ ng ??
- &comb2 "' SP '' a a' A A' e e' E E' i i' I I' o o' O O' u u' U U'
- y y' Y Y' c c' C C' l l' L L' n n' N N' r r' R R'
- s s' S S' z z' Z Z'
- &comb2 "( SP '( a a( A A( g g( G G( u u( U U(
- &comb2 "< SP '< c c< C C< d d< D D< e e< E E< l l< L L< n n< N N<
- r r< R R< s s< S S< t t< T T< z z< Z Z<
- &comb2 ", SP ', c c, C C, g g, G G, k k, K K, l l, L L, n n, N N,
- r r, R R, s s, S S, t t, T T,
- &comb2 "> a a> A A> e e> E E> i i> I I> o o> O O> u u> U U>
- y y> Y Y> c c> C C> g g> G G> h h> H H> j j> J J>
- s s> S S> w w> W W>
- &comb2 ": SP ': a a: A A: e e: E E: i i: I I: o o: O O: u u: U U:
- y y: Y Y:
- &comb2 ". SP '. c c. C C. e e. E E. g g. G G. I I. z z. Z Z.
- &comb2 "" SP '" o o" O O" u u" U U"
- &comb2 "! a a! A A! e e! E E! i i! I I! o o! O O! u u! U U!
- &comb2 "- a a- A A- e e- E E- i i- I I- o o- O O- u u- U U-
- &comb2 "; SP '; a a; A A; e e; E E; i i; I I; u u; U U;
- &comb2 "0 SP '0 a aa A AA u u0 U U0
- &comb2 "? SP '? a a? A A? n n? N N? i i? I I? o o? O O? u u? U U?
-
- &charset JIS_C6229-1984-a
- &rem source: ECMA registry
- &alias iso-ir-91
- &g0esc x286d &g1esc x296d &g2esc x2a6d &g3esc x2b6d
- &alias jp-ocr-a
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ?? " Pd DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; 1h = 3h ?
- ?? A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?? Ye 2h '> _
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 4h ?? ?? DT
-
- &charset JIS_C6229-1984-b
- &rem source: ECMA registry
- &alias iso-ir-92
-
-Simonsen [Page 60]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- &alias ISO646-JP-OCR-B
- &g0esc x286e &g1esc x296e &g2esc x2a6e &g3esc x2b6e
- &alias jp-ocr-b
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z </ Ye /> '> _
- ?? a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) ?? DT
-
- &charset JIS_C6229-1984-b-add
- &rem source: ECMA registry
- &alias iso-ir-93
- &g0esc x286f &g1esc x296f &g2esc x2a6f &g3esc x2b6f
- &alias jp-ocr-b-add
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ?? ?? Pd Cu // ?? SE ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? DT
-
- &charset JIS_C6229-1984-hand
- &rem source: ECMA registry
- &alias iso-ir-94
- &g0esc x2870 &g1esc x2970 &g2esc x2a70 &g3esc x2b70
- &alias jp-ocr-hand
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z </ Ye /> '> _
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? !! ?? ?? DT
-
- &charset JIS_C6229-1984-hand-add
- &rem source: ECMA registry
- &alias iso-ir-95
- &g0esc x2871 &g1esc x2971 &g2esc x2a71 &g3esc x2b71
- &alias jp-ocr-hand-add
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ?? ?? ?? ?? // ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? DT
-
-
-Simonsen [Page 61]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- &charset JIS_C6229-1984-kana
- &rem source: ECMA registry
- &alias iso-ir-96
- &g0esc x2872 &g1esc x2972 &g2esc x2a72 &g3esc x2b72
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ?? <' >' ?? ?? Wo ?? ?? ?? ?? ?? ?? ?? ?? ??
- -6 A6 I6 U6 E6 O6 Ka Ki Ku Ke Ko Sa Si Su Se So
- Ta Ti Tu Te To Na Ni Nu Ne No Ha Hi Hu He Ho Ma
- Mi Mu Me Mo Ya Yu Yo Ra Ri Ru Re Ro Wa N6 "5 05
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? DT
-
- &charset ISO_2033-1983
- &rem source: ECMA registry
- &alias iso-ir-98
- &alias e13b
- &g0esc x2873 &g1esc x2973 &g2esc x2a73 &g3esc x2b73
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- 0 1 2 3 4 5 6 7 8 9 1j 2j 3j 4j ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? DT
-
- &charset ANSI_X3.110-1983
- &rem source: ECMA registry
- &alias iso-ir-99
- &alias CSA_T500-1983
- &alias NAPLPS
- &g0esc x2874 &g1esc x2974 &g2esc x2a74 &g3esc x2b74
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " ?? ?? % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- NS !I Ct Pd DO Ye Nb SE Cu '6 "6 << <- -! -> -v
- DG +- 2S 3S *X My PI .M -: '9 "9 >> 14 12 34 ?I
- ?? "! "' "> "? "- "( ". ": "/ "0 ", "_ "" "; "<
- -M 1S Rg Co TM Md HH VV FD BD Fd Bd 18 38 58 78
- Om AE D- -a H/ VH IJ L. L/ O/ OE -o TH T/ NG 'n
- kk ae d/ d- h/ i. ij l. l/ o/ oe ss th t/ ng ??
- &comb2 "' SP '' a a' A A' e e' E E' i i' I I' o o' O O' u u' U U'
- y y' Y Y' c c' C C' l l' L L' n n' N N' r r' R R'
- s s' S S' z z' Z Z'
- &comb2 "( SP '( a a( A A( g g( G G( u u( U U(
-
-Simonsen [Page 62]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- &comb2 "< SP '< c c< C C< d d< D D< e e< E E< l l< L L< n n< N N<
- r r< R R< s s< S S< t t< T T< z z< Z Z<
- &comb2 ", SP ', c c, C C, g g, G G, k k, K K, l l, L L, n n, N N,
- r r, R R, s s, S S, t t, T T,
- &comb2 "> a a> A A> e e> E E> i i> I I> o o> O O> u u> U U>
- y y> Y Y> c c> C C> g g> G G> h h> H H> j j> J J>
- s s> S S> w w> W W>
- &comb2 ": SP ': a a: A A: e e: E E: i i: I I: o o: O O: u u: U U:
- y y: Y Y:
- &comb2 ". SP '. c c. C C. e e. E E. g g. G G. I I. z z. Z Z.
- &comb2 "" SP '" o o" O O" u u" U U"
- &comb2 "! a a! A A! e e! E E! i i! I I! o o! O O! u u! U U!
- &comb2 "- SP '- a a- A A- e e- E E- i i- I I- o o- O O- u u- U U-
- &comb2 "; SP '; a a; A A; e e; E E; i i; I I; u u; U U;
- &comb2 "0 SP '0 a aa A AA u u0 U U0
- &comb2 "? a a? A A? n n? N N? i i? I I? o o? O O? u u? U U?
-
- &charset ISO_8859-1:1987
- &rem source: ECMA registry
- &alias iso-ir-100
- &g1esc x2d41 &g2esc x2e41 &g3esc x2f41
- &alias ISO_8859-1
- &alias ISO-8859-1
- &alias latin1
- &alias l1
- &alias IBM819
- &alias CP819
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- NS !I Ct Pd Cu Ye BB SE ': Co -a << NO -- Rg '-
- DG +- 2S 3S '' My PI .M ', 1S -o >> 14 12 34 ?I
- A! A' A> A? A: AA AE C, E! E' E> E: I! I' I> I:
- D- N? O! O' O> O? O: *X O/ U! U' U> U: Y' TH ss
- a! a' a> a? a: aa ae c, e! e' e> e: i! i' i> i:
- d- n? o! o' o> o? o: -: o/ u! u' u> u: y' th y:
-
- &charset ISO_8859-2:1987
- &rem source: ECMA registry
- &alias iso-ir-101
- &g1esc x2d42 &g2esc x2e42 &g3esc x2f42
- &alias ISO_8859-2
- &alias ISO-8859-2
- &alias latin2
- &alias l2
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
-
-Simonsen [Page 63]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- NS A; '( L/ Cu L< S' SE ': S< S, T< Z' -- Z< Z.
- DG a; '; l/ '' l< s' '< ', s< s, t< z' '" z< z.
- R' A' A> A( A: L' C' C, C< E' E; E: E< I' I> D<
- D/ N' N< O' O> O" O: *X R< U0 U' U" U: Y' T, ss
- r' a' a> a( a: l' c' c, c< e' e; e: e< i' i> d<
- d/ n' n< o' o> o" o: -: r< u0 u' u" u: y' t, '.
-
- &charset T.61-7bit
- &rem source: ECMA registry
- &alias iso-ir-102
- &g0esc x2875 &g1esc x2975 &g2esc x2a75 &g3esc x2b75
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( ?? )> ?? _
- ?? a b c d e f g h i j k l m n o p q r s t u v w x y z ?? !! ?? ?? DT
-
- &charset T.61-8bit
- &alias T.61
- &rem source: ECMA registry
- &alias iso-ir-103
- &g0esc x2876 &g1esc x2976 &g2esc x2a76 &g3esc x2b76
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " ?? ?? % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( ?? )> ?? _
- ?? a b c d e f g h i j k l m n o p q r s t u v w x y z ?? !! ?? ?? DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- NS !I Ct Pd DO Ye Nb SE Cu ?? ?? << ?? ?? ?? ??
- DG +- 2S 3S *X My PI .M -: ?? ?? >> 14 12 34 ?I
- ?? "! "' "> "? "- "( ". ": ?? "0 ", "_ "" "; "<
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- Om AE D- -a H/ ?? IJ L. L/ O/ OE -o TH T/ NG 'n
- kk ae d/ d- h/ i. ij l. l/ o/ oe ss th t/ ng ??
- &comb2 "' SP '' a a' A A' e e' E E' i i' I I' o o' O O' u u' U U'
- y y' Y Y' c c' C C' l l' L L' n n' N N' r r' R R'
- s s' S S' z z' Z Z'
- &comb2 "( SP '( a a( A A( g g( G G( u u( U U(
- &comb2 "< SP '< c c< C C< d d< D D< e e< E E< l l< L L< n n< N N<
- r r< R R< s s< S S< t t< T T< z z< Z Z<
- &comb2 ", SP ', c c, C C, g g, G G, k k, K K, l l, L L, n n, N N,
- r r, R R, s s, S S, t t, T T,
- &comb2 "> a a> A A> e e> E E> i i> I I> o o> O O> u u> U U>
- y y> Y Y> c c> C C> g g> G G> h h> H H> j j> J J>
- s s> S S> w w> W W>
-
-Simonsen [Page 64]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- &comb2 ": SP ': a a: A A: e e: E E: i i: I I: o o: O O: u u: U U:
- y y: Y Y:
- &comb2 ". SP '. c c. C C. e e. E E. g g. G G. I I. z z. Z Z.
- &comb2 "" SP '" o o" O O" u u" U U"
- &comb2 "! a a! A A! e e! E E! i i! I I! o o! O O! u u! U U!
- &comb2 "- SP '- a a- A A- e e- E E- i i- I I- o o- O O- u u- U U-
- &comb2 "; SP '; a a; A A; e e; E E; i i; I I; u u; U U;
- &comb2 "0 SP '0 a aa A AA u u0 U U0
- &comb2 "? a a? A A? n n? N N? i i? I I? o o? O O? u u? U U?
-
- &charset ISO_8859-3:1988
- &rem source: ECMA registry
- &alias iso-ir-109
- &g1esc x2d43 &g2esc x2e43 &g3esc x2f43
- &alias ISO_8859-3
- &alias ISO-8859-3
- &alias latin3
- &alias l3
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- NS H/ '( Pd Cu ?? H> SE ': I. S, G( J> -- ?? Z.
- DG h/ 2S 3S '' My h> .M ', i. s, g( j> 12 ?? z.
- A! A' A> ?? A: C. C> C, E! E' E> E: I! I' I> I:
- ?? N? O! O' O> G. O: *X G> U! U' U> U: U( S> ss
- a! a' a> ?? a: c. c> c, e! e' e> e: i! i' i> i:
- ?? n? o! o' o> g. o: -: g> u! u' u> u: u( s> '.
-
- &charset ISO_8859-4:1988
- &rem source: ECMA registry
- &alias iso-ir-110
- &g1esc x2d44 &g2esc x2e44 &g3esc x2f44
- &alias ISO_8859-4
- &alias ISO-8859-4
- &alias latin4
- &alias l4
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- NS A; kk R, Cu I? L, SE ': S< E- G, T/ -- Z< '-
- DG a; '; r, '' i? l, '< ', s< e- g, t/ NG z< ng
- A- A' A> A? A: AA AE I; C< E' E; E: E. I' I> I-
- D/ N, O- K, O> O? O: *X O/ U; U' U> U: U? U- ss
-
-Simonsen [Page 65]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- a- a' a> a? a: aa ae i; c< e' e; e: e. i' i> i-
- d/ n, o- k, o> o? o: -: o/ u; u' u> u: u? u- '.
-
- &charset ECMA-cyrillic
- &rem source: ECMA registry
- &alias iso-ir-111
- &g1esc x2d40 &g2esc x2e40 &g3esc x2f40
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- NS IO D% G% IE DS II YI J% LJ NJ Ts KJ -- V% DZ
- N0 io d% g% ie ds ii yi j% lj nj ts kj Cu v% dz
- A= B= V= G= D= E= Z% Z= I= J= K= L= M= N= O= P=
- R= S= T= U= F= H= C= C% S% Sc =" Y= %" JE JU JA
- a= b= v= g= d= e= z% z= i= j= k= l= m= n= o= p=
- r= s= t= u= f= h= c= c% s% sc =' y= %' je ju ja
-
- &charset CSA_Z243.4-1985-1
- &rem source: ECMA registry
- &alias iso-ir-121
- &g0esc x2877 &g1esc x2977 &g2esc x2a77 &g3esc x2b77
- &alias ISO646-CA
- &alias csa7-1
- &alias ca
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- a! A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a> c, e> i> _
- o> a b c d e f g h i j k l m n o p q r s t u v w x y z e' u! e! u> DT
-
- &charset CSA_Z243.4-1985-2
- &rem source: ECMA registry
- &alias iso-ir-122
- &alias ISO646-CA2
- &g0esc x2878 &g1esc x2978 &g2esc x2a78 &g3esc x2b78
- &alias csa7-2
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- a! A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a> c, e> E' _
- o> a b c d e f g h i j k l m n o p q r s t u v w x y z e' u! e! u> DT
-
- &charset CSA_Z243.4-1985-gr
- &rem source: ECMA registry
- &alias iso-ir-123
- &g1esc x2d45 &g2esc x2e45 &g3esc x2f45
-
-Simonsen [Page 66]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- NS !I ': Pd Ct Ye +- '' (S )S 12 +S ', -- .M -S
- 0S 1S 2S 3S 4S 5S 6S 7S 8S 9S 14 34 <= != >= ?I
- A! A' A> C, E! E' E> E: I' I> I: N? O' O> U! U'
- U> U: Rg SE PI m* -a -o '6 '9 "6 "9 << >> DG BB
- a! a' a> c, e! e' e> e: i' i> i: n? o' o> u! u'
- u> u: Co hh vv ur ul dl dr vr uh vl dh vh NO FB
-
- &charset ISO_8859-7:1987
- &rem source: ECMA registry
- &alias iso-ir-126
- &g1esc x2d46 &g2esc x2e46 &g3esc x2f46
- &alias ISO_8859-7
- &alias ISO-8859-7
- &alias ELOT_928
- &alias ECMA-118
- &alias greek
- &alias greek8
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- NS 9' '9 Pd ?? ?? BB SE ': Co ?? << NO -- ?? -M
- DG +- 2S 3S '' '% A% .M E% Y% I% >> O% 12 U% W%
- i3 A* B* G* D* E* Z* Y* H* I* K* L* M* N* C* O*
- P* R* ?? S* T* U* F* X* Q* W* J* V* a% e% y% i%
- u3 a* b* g* d* e* z* y* h* i* k* l* m* n* c* o*
- p* r* *s s* t* u* f* x* q* w* j* v* o% u% w% ??
-
- &charset ISO_8859-6:1987
- &rem source: ECMA registry
- &alias iso-ir-127
- &g1esc x2d47 &g2esc x2e47 &g3esc x2f47
- &alias ISO_8859-6
- &alias ISO-8859-6
- &alias ECMA-114
- &alias ASMO-708
- &alias arabic
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
-
-Simonsen [Page 67]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- NS ?? ?? ?? Cu ?? ?? ?? ?? ?? ?? ?? ,+ -- ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ;+ ?? ?? ?? ?+
- ?? H' aM aH wH ah yH a+ b+ tm t+ tk g+ hk x+ d+
- dk r+ z+ s+ sn c+ dd tj zH e+ i+ ?? ?? ?? ?? ??
- ++ f+ q+ k+ l+ m+ n+ h+ w+ j+ y+ :+ "+ =+ /+ '+
- 1+ 3+ 0+ ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
-
- &charset T.101-G2
- &rem source: ECMA registry
- &alias iso-ir-128
- &g0esc x287c &g1esc x297c &g2esc x2a7c &g3esc x2b7c
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " ?? ?? % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- NS !I Ct Pd DO Ye Nb SE Cu '6 "6 << <- -! -> -v
- DG +- 2S 3S *X My PI .M -: '9 "9 >> 14 12 34 ?I
- ?? "! "' "> "? "- "( ". ": "/ "0 ", "_ "" "; "<
- -M 1S Rg Co TM Md HH VV FD BD Fd Bd 18 38 58 78
- Om AE D- -a H/ VH IJ L. L/ O/ OE -o TH T/ NG 'n
- kk ae d/ d- h/ i. ij l. l/ o/ oe ss th t/ ng ??
- &comb2 "' SP '' a a' A A' e e' E E' i i' I I' o o' O O' u u' U U'
- y y' Y Y' c c' C C' l l' L L' n n' N N' r r' R R'
- s s' S S' z z' Z Z'
- &comb2 "( SP '( a a( A A( g g( G G( u u( U U(
- &comb2 "< SP '< c c< C C< d d< D D< e e< E E< l l< L L< n n< N N<
- r r< R R< s s< S S< t t< T T< z z< Z Z<
- &comb2 ", SP ', c c, C C, g g, G G, k k, K K, l l, L L, n n, N N,
- r r, R R, s s, S S, t t, T T,
- &comb2 "> a a> A A> e e> E E> i i> I I> o o> O O> u u> U U>
- y y> Y Y> c c> C C> g g> G G> h h> H H> j j> J J>
- s s> S S> w w> W W>
- &comb2 ": SP ': a a: A A: e e: E E: i i: I I: o o: O O: u u: U U:
- y y: Y Y:
- &comb2 ". SP '. c c. C C. e e. E E. g g. G G. I I. z z. Z Z.
- &comb2 "" SP '" o o" O O" u u" U U"
- &comb2 "! a a! A A! e e! E E! i i! I I! o o! O O! u u! U U!
- &comb2 "- SP '- a a- A A- e e- E E- i i- I I- o o- O O- u u- U U-
- &comb2 "; SP '; a a; A A; e e; E E; i i; I I; u u; U U;
- &comb2 "0 SP '0 a aa A AA u u0 U U0
- &comb2 "? a a? A A? n n? N N? i i? I I? o o? O O? u u? U U?
-
- &charset ISO_8859-8:1988
- &rem source: ECMA registry
- &alias iso-ir-138
-
-Simonsen [Page 68]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- &g1esc x2d48 &g2esc x2e48 &g3esc x2f48
- &alias ISO_8859-8
- &alias ISO-8859-8
- &alias hebrew
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- NS ?? Ct Pd Cu Ye BB SE ': Co *X << NO -- Rg '-
- DG +- 2S 3S '' My PI .M ', 1S -: >> 14 12 34 ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? =2
- A+ B+ G+ D+ H+ W+ Z+ X+ Tj J+ K% K+ L+ M% M+ N%
- N+ S+ E+ P% P+ Zj ZJ Q+ R+ Sh T+ ?? ?? ?? ?? ??
-
- &charset CSN_369103
- &rem source: ECMA registry
- &alias iso-ir-139
- &g1esc x2d49 &g2esc x2e49 &g3esc x2f49
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- NS A; '( L/ DO L< S' SE ': S< S, T< Z' -- Z< Z.
- DG a; '; l/ '' l< s' '< ', s< s, t< z' '" z< z.
- R' A' A> A( A: L' C' C, C< E' E; E: E< I' I> D<
- D/ N' N< O' O> O" O: *X R< U0 U' U" U: Y' T, ss
- r' a' a> a( a: l' c' c, c< e' e; e: e< i' i> d<
- d/ n' n< o' o> o" o: -: r< u0 u' u" u: y' t, '.
-
- &charset JUS_I.B1.002
- &rem source: ECMA registry
- &alias iso-ir-141
- &g0esc x287a &g1esc x297a &g2esc x2a7a &g3esc x2b7a
- &alias ISO646-YU
- &alias js
- &alias yu
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- Z< A B C D E F G H I J K L M N O P Q R S T U V W X Y Z S< D/ C' C< _
- z< a b c d e f g h i j k l m n o p q r s t u v w x y z s< d/ c' c< DT
-
- &charset ISO_6937-2-add
-
-Simonsen [Page 69]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- &rem source: ECMA registry and ISO 6937-2:1983
- &alias iso-ir-142
- &g1esc x2d4a &g2esc x2e4a &g3esc x2f4a
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- NS !I Ct Pd DO Ye ?? SE ?? '6 "6 << <- -! -> -v
- DG +- 2S 3S *X My PI .M -: '9 "9 >> 14 12 34 ?I
- ?? "! "' "> "? "- "( ". ": ?? "0 ", "_ "" "; "<
- -M 1S Rg Co TM Md NO BB ?? ?? ?? ?? 18 38 58 78
- Om AE D- -a H/ ?? IJ L. L/ O/ OE -o TH T/ NG 'n
- kk ae d/ d- h/ i. ij l. l/ o/ oe ss th t/ ng --
- &comb2 "' SP '' a a' A A' e e' E E' i i' I I' o o' O O' u u' U U'
- y y' Y Y' c c' C C' l l' L L' n n' N N' r r' R R'
- s s' S S' z z' Z Z'
- &comb2 "( SP '( a a( A A( g g( G G( u u( U U(
- &comb2 "< SP '< c c< C C< d d< D D< e e< E E< l l< L L< n n< N N<
- r r< R R< s s< S S< t t< T T< z z< Z Z<
- &comb2 ", SP ', c c, C C, g g, G G, k k, K K, l l, L L, n n, N N,
- r r, R R, s s, S S, t t, T T,
- &comb2 "> a a> A A> e e> E E> i i> I I> o o> O O> u u> U U>
- y y> Y Y> c c> C C> g g> G G> h h> H H> j j> J J>
- s s> S S> w w> W W>
- &comb2 ": SP ': a a: A A: e e: E E: i i: I I: o o: O O: u u: U U:
- y y: Y Y:
- &comb2 ". SP '. c c. C C. e e. E E. g g. G G. I I. z z. Z Z.
- &comb2 "" SP '" o o" O O" u u" U U"
- &comb2 "! a a! A A! e e! E E! i i! I I! o o! O O! u u! U U!
- &comb2 "- SP '- a a- A A- e e- E E- i i- I I- o o- O O- u u- U U-
- &comb2 "; SP '; a a; A A; e e; E E; i i; I I; u u; U U;
- &comb2 "0 SP '0 a aa A AA u u0 U U0
- &comb2 "? a a? A A? n n? N N? i i? I I? o o? O O? u u? U U?
-
- &charset IEC_P27-1
- &rem source: ECMA registry
- &alias iso-ir-143
- &g1esc x2d4b &g2esc x2e4b &g3esc x2f4b
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- '< =3 AN OR (U )U (C )C <= => .: :. (- -) (_ )_
- In Io 00 NB dP ?1 ?2 ?- ?= =< != >= <> NO FA TE
- A+ OS PP G* D* -T -V -L H* </ /> L* 1' 2' C* -+
-
-Simonsen [Page 70]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- P* 2S S* *X 3S U* F* .M Q* W* /0 >V RT f( 0( +-
- DG a* b* g* d* e* z* y* h* i* k* l* m* n* c* %0
- p* r* s* -: t* u* f* x* q* w* /- <- -! -> -v '-
-
- &charset ISO_8859-5:1988
- &rem source: ECMA registry
- &alias iso-ir-144
- &g1esc x2d4c &g2esc x2e4c &g3esc x2f4c
- &alias ISO_8859-5
- &alias ISO-8859-5
- &alias cyrillic
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- NS IO D% G% IE DS II YI J% LJ NJ Ts KJ -- V% DZ
- A= B= V= G= D= E= Z% Z= I= J= K= L= M= N= O= P=
- R= S= T= U= F= H= C= C% S% Sc =" Y= %" JE JU JA
- a= b= v= g= d= e= z% z= i= j= k= l= m= n= o= p=
- r= s= t= u= f= h= c= c% s% sc =' y= %' je ju ja
- N0 io d% g% ie ds ii yi j% lj nj ts kj SE v% dz
-
- &charset JUS_I.B1.003-serb
- &rem source: ECMA registry
- &alias iso-ir-146
- &g0esc x287b &g1esc x297b &g2esc x2a7b &g3esc x2b7b
- &alias serbian
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- Z% A= B= C= D= E= F= G= H= I= J% K= L= M= N= O=
- P= LJ R= S= T= U= V= NJ DZ DS Z= S% D% Ts C% _
- z% a= b= c= d= e= f= g= h= i= j% k= l= m= n= o=
- p= lj r= s= t= u= v= nj dz ds z= s% d% ts c% DT
-
- &charset JUS_I.B1.003-mac
- &rem source: ECMA registry
- &alias macedonian
- &alias iso-ir-147
- &g0esc x287d &g1esc x297d &g2esc x2a7d &g3esc x2b7d
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- Z% A= B= C= D= E= F= G= H= I= J% K= L= M= N= O=
- P= LJ R= S= T= U= V= NJ DZ DS Z= S% G% KJ C% _
- z% a= b= c= d= e= f= g= h= i= j% k= l= m= n= o=
- p= lj r= s= t= u= v= nj dz ds z= s% g% kj c% DT
-
-Simonsen [Page 71]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
-
- &charset ISO_8859-9:1989
- &rem source: ECMA registry
- &alias iso-ir-148
- &g1esc x2d4d &g2esc x2e4d &g3esc x2f4d
- &alias ISO_8859-9
- &alias ISO-8859-9
- &alias latin5
- &alias l5
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- NS !I Ct Pd Cu Ye BB SE ': Co -a << NO -- Rg '-
- DG +- 2S 3S '' My PI .M ', 1S -o >> 14 12 34 ?I
- A! A' A> A? A: AA AE C, E! E' E> E: I! I' I> I:
- G( N? O! O' O> O? O: *X O/ U! U' U> U: I. S, ss
- a! a' a> a? a: aa ae c, e! e' e; e: e. i' i> i-
- g( n? o! o' o> o? o: -: o/ u! u' u> u: i. s, y:
-
- &charset KS_C_5601-1987
- &rem source: ECMA registry
- &alias iso-ir-149
- &alias KS_C_5601-1989
- &alias KSC_5601
- &bits 16
- &g0esc x2443 &g1esc x242943 &g2esc x242a43 &g3esc x242b43
- &alias korean
- &code2 1 1
- SP ,_ .6 .M .. .3 ': +" -N -M PP // ?1 '6 '9 "6 "9 (' )' <1 >1 <+ >+
- <' >' <" >" (" )" +- *X -: != =< >= 00
- .: DG 1' 2' oC Ye AA Ct Pd Ml Fm
- -V -T (A dP NB =3 HI SE :X *1 *2
- 0m 0M 0o Dw Db OS fS uT UT dT DT -> <-
- -! -v <> =2 <* *> RT CG 0( :. In DI
- &code2 2 1
- => == FA TE '' '? '< '( '" '0 '. ', '; !I ?I :R Io +Z *P Cu oF %0 Tl
- PL Tr PR cS- cS cH cH- cC- cC 0. cD-
- Rr 0L 0R .S RF RY RK RZ RH RX =T:) tel TEL
- <H >H PI /- /= UD //> <// <!! !!>
- Mb Md M8 M16 KSC (JU) N0 Co TM am pm Tel
- &code2 3 1
- ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7
- 8 9 : ; < = > ? At A B C D E F G H I J K L M N O
- P Q R S T U V W X Y Z <( W= )> '> _ a b c d e f g
- h i j k l m n o p q r s t u v w x y z (! !! !) '-
- &codex k 4 4 1 94
- &code2 5 1
- 1r 2r 3r 4r 5r 6r 7r 8r 9r ar br cr
-
-Simonsen [Page 72]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- &code2 5 16
- 1R 2R 3R 4R 5R 6R 7R 8R 9R aR bR cR
- &code2 5 33
- A* B* G* D* E* Z* Y* H* I* K* L* M* N* C* O*
- P* R* S* T* U* F* X* Q* W*
- &code2 5 65
- a* b* g* d* e* z* y* h* i* k* l* m* n* c* o*
- p* r* s* t* u* f* x* q* w*
- &code2 6 1
- hh vv dr dl ul ur vr dh vl uh vh
- HH VV DR LD UL UR VR DH VL UH VH Vr
- dH Vl uH vH vR Dh vL Uh Vh Dl dL Ul uL Ur uR Dr dR
- Udr uDr UdR uDR Udl uDl UdL
- uDL dLr dlR DLr DlR uLr ulR UlR vLr vlR Udh uDh
- UdLr UdlR uDLr uDlR UdH uDH VLr VlR
- &codex k 7 7 1 79
- &code2 8 1
- AE D- -a H/ ?? IJ ?? L. L/ O/ OE -o TH T/ NG
- &codex k 8 8 17 44
- &code2 8 45
- a-o b-o c-o d-o e-o f-o g-o h-o i-o j-o k-o l-o m-o n-o o-o
- p-o q-o r-o s-o t-o u-o v-o w-o x-o y-o z-o
- 1-o 2-o 3-o 4-o 5-o 6-o 7-o 8-o 9-o 10-o 11-o 12-o 13-o 14-o 15-o
- 12 13 23 14 34 18 38 58 78
- &code2 9 1
- ae d/ d- h/ i. ij kk l. l/ o/ oe ss th t/ ng 'n
- &codex k 9 9 17 44
- &code2 9 45
- (a) (b) (c) (d) (e) (f) (g) (h) (i) (j) (k) (l) (m) (n) (o)
- (p) (q) (r) (s) (t) (u) (v) (w) (x) (y) (z)
- (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15)
- 1S 2S 3S 4S nS 1s 2s 3s 4s
- &code2 10 1
- A5 a5 I5 i5 U5 u5 E5 e5 O5 o5 ka ga ki gi ku
- gu ke ge ko go sa za si zi su zu se ze so zo ta
- da ti di tU tu du te de to do na ni nu ne no ha
- ba pa hi bi pi hu bu pu he be pe ho bo po ma mi
- mu me mo yA ya yU yu yO yo ra ri ru re ro wA wa
- wi we wo n5
- &code2 11 1
- a6 A6 i6 I6 u6 U6 e6 E6 o6 O6 Ka Ga Ki Gi Ku
- Gu Ke Ge Ko Go Sa Za Si Zi Su Zu Se Ze So Zo Ta
- Da Ti Di TU Tu Du Te De To Do Na Ni Nu Ne No Ha
- Ba Pa Hi Bi Pi Hu Bu Pu He Be Pe Ho Bo Po Ma Mi
- Mu Me Mo YA Ya YU Yu YO Yo Ra Ri Ru Re Ro WA Wa
- Wi We Wo N6 Vi KA KE
- &code2 12 1
- A= B= V= G= D= E= IO Z% Z= I= J= K= L= M= N= O= P=
- R= S= T= U= F= H= C= C% S% Sc =" Y= %" JE JU JA
- &code2 12 49
- a= b= v= g= d= e= io z% z= i= j= k= l= m= n= o= p=
- r= s= t= u= f= h= c= c% s% sc =' y= %' je ju ja
- &codex k 16 40 1 94
-
-Simonsen [Page 73]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- &codex k 42 93 1 94
-
- &charset greek-ccitt
- &rem source: ECMA registry
- &alias iso-ir-150
- &g0esc x282140 &g1esc x292140 &g2esc x2a2140 &g3esc x2b2140
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A* B* G* D* E* Z* Y* H* I* K* L* M* N* C* O*
- P* R* ?? S* T* U* F* X* Q* W* ?? <( // )> '> _
- ?? a* b* g* d* e* z* y* h* i* k* l* m* n* c* o*
- p* r* *s s* t* u* f* x* q* w* ?? (! !! !) '- DT
-
- &charset NC_NC00-10:81
- &rem source: ECMA registry
- &alias cuba
- &alias iso-ir-151
- &alias ISO646-CU
- &g0esc x282141 &g1esc x292141 &g2esc x2a2141 &g3esc x2b2141
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z !I N? )> ?I _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z '' n? <( ': DT
-
- &charset ISO_6937-2-25
- &rem source: ECMA registry
- &alias iso-ir-152
- &g1esc x2d4e &g2esc x2e4e &g3esc x2f4e
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- NS ?? ?? ?? ?? ?? ?? ?? ?? ?? "6 ?? <- -! -> -v
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? "9 ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? TM Md ?? ?? ?? ?? ?? ?? 18 38 58 78
- Om ?? ?? ?? ?? ?? IJ L. ?? ?? OE ?? W> Y> Y: 'n
- ?? ?? ?? ?? ?? ?? ij l. ?? ?? oe ?? w> y> ?? ??
-
- &charset GOST_19768-74
- &rem source: ECMA registry
- &alias ST_SEV_358-88
- &alias iso-ir-153
- &g1esc x2d4f &g2esc x2e4f &g3esc x2f4f
- &code 0
-
-Simonsen [Page 74]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- NS IO ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? -- ?? ??
- A= B= V= G= D= E= Z% Z= I= J= K= L= M= N= O= P=
- R= S= T= U= F= H= C= C% S% Sc =" Y= %" JE JU JA
- a= b= v= g= d= e= z% z= i= j= k= l= m= n= o= p=
- r= s= t= u= f= h= c= c% s% sc =' y= %' je ju ja
- ?? io ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
-
- &charset ISO_8859-supp
- &rem source: ECMA registry
- &alias iso-ir-154
- &alias latin1-2-5
- &g1esc x2d50 &g2esc x2e50 &g3esc x2f50
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- ?? ?? A- C> C. ?? E. E- G> '6 "6 TM <- -! -> -v
- ?? ?? a- c> c. d- e. e- g> '9 "9 Md 18 38 58 78
- ?? G( G. G, H> H/ I? I. I- I; IJ J> K, L, L. N,
- -M NG O- OE R, S> T/ TH U? U( U- U; W> Y' Y> Y:
- Om g( g. g, h> h/ i? i. i- i; ij j> k, l, l. n,
- kk ng o- oe r, s> t/ th u? u( u- u; w> y' y> 'n
-
- &charset ISO_10367-box
- &rem source: ECMA registry
- &alias iso-ir-155
- &g1esc x2d51 &g2esc x2e51 &g3esc x2f51
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- VV HH DR LD UR UL VR VL DH UH VH UB LB FB sB ??
- vv hh dr dl ur ul vr vl dh uh vh .S :S ?S ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
-
-
-Simonsen [Page 75]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- &charset latin6
- &rem source: ECMA registry
- &alias iso-ir-157
- &alias l6
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- NS A; E- G, I- I? K, L, N' R, S< T/ Z< -- kk NG
- d/ a; e- g, i- i? k, l, n' r, s< t/ z< SE ss ng
- A- A' A> A? A: AA AE I; C< E' E; E: E. I' I> I:
- D/ N, O- O' O> O? O: U? O/ U; U' U> U: Y' TH U-
- a- a' a> a? a: aa ae i; c< e' e; e: e. i' i> i:
- d- n, o- o' o> o? o: u? o/ u; u' u> u: y' th u-
-
- &charset latin-lap
- &rem source: ECMA registry
- &alias lap
- &alias iso-ir-158
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- '' ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ;S ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- A( A> A! A- A1 A7 A3 E( E! E- G/ G< K< O( O! O;
- O1 U- ED EZ ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- a( a> a! a- a1 a7 a3 e( e! e- g/ g< k< o( o! o;
- o1 u- ed ez ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
-
- &charset JIS_X0212-1990
- &rem source: ECMA registry
- &alias x0212
- &alias iso-ir-159
- &bits 16
- &g0esc x2444 &g1esc x242944 &g2esc x242a44 &g3esc x242b44
- &code2 2 15
- '( '< ', '. '" '- '; '0 '?
- '' '%
- &code2 2 34
- !I BB ?I TM Cu N0
- &code2 2 75
- -o -a Co Rg
- &code2 6 65
- A% E% Y% I% J* ?? O% ?? U% V* ?? W%
-
-Simonsen [Page 76]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- &code2 6 81
- a% e% y% i% j* i3 o% *s u% v* u3 w%
- &code2 7 34
- D% G% IE DS II YI J% LJ NJ Ts KJ V% DZ
- &code2 7 82
- d% g% ie ds ii yi j% lj nj ts kj v% dz
- &code2 9 1
- AE D/ ?? H/ ?? IJ ?? L/ L. ?? NG O/ OE ?? T/ TH
- &code2 9 33
- ae d/ d- h/ i. ij kk l/ l. 'n ng o/ oe ss t/ th
- &code2 10 1
- A' A! A: A> A( A< A; AA A? C' C> C< C, C. D< E' E! E: E> E( E. E-
- E; ?? G> G( G, G. H> I' I! I: I> I< I. I- I; I? J> K, L' L, N' N< N,
- N? O' O! O: O> O< O" O- O? R' R< R, S' S> S< S, T< T, U' U! U: U( U<
- U" U- U; U0 U:' U:! U:< U:- W. Y' Y: Y> Z' Z< Z.
- &code2 11 1
- a' a! a: a> a( a< a; aa a? c' c> c< c, c. d< e' e! e: e> e( e. e-
- e; g' g> g( ?? g. h> i' i! i: i> i< ?? i- i; i? j> k, l' l, n' n< n,
- n? o' o! o: o> o< o" o- o? r' r< r, s' s> s< s, t< t, u' u! u: u( u<
- u" u- u; u0 u:' u:! u:< u:- w. y' y: y> z' z< z.
- &codex J 16 76 1 94
- &codex J 77 77 1 67
-
- &charset DS_2089
- &rem source: Danish Standard, DS 2089, February 1974
- &alias DS2089
- &alias ISO646-DK
- &alias dk
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AE O/ AA '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z ae o/ aa '? DT
-
- &charset us-dk
- &rem for compatibility with ASCII
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- &duplicate 91 AE
- &duplicate 92 O/
- &duplicate 93 AA
- &duplicate 123 ae
- &duplicate 124 o/
- &duplicate 125 aa
- &duplicate 91 A:
- &duplicate 92 O:
- &duplicate 123 a:
- &duplicate 124 o:
-
-Simonsen [Page 77]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
-
- &charset dk-us
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AE O/ AA '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z ae o/ aa '? DT
- &duplicate 91 <(
- &duplicate 92 //
- &duplicate 93 )>
- &duplicate 123 (!
- &duplicate 124 !!
- &duplicate 125 !)
- &duplicate 91 A:
- &duplicate 92 O:
- &duplicate 123 a:
- &duplicate 124 o:
-
- &charset JIS_X0201
- &alias X0201
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( Ye )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '- DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- NS ._ <' >' ,_ .6 Wo a6 i6 u6 e6 o6 YA YU YO TU
- -6 A6 I6 U6 E6 O6 Ka Ki Ku Ke Ko Sa Si Su Se So
- Ta Ti Tu Te To Na Ni Nu Ne No Ha Hi Hu He Ho Ma
- Mi Mu Me Mo Ya Yu Yo Ra Ri Ru Re Ro Wa N6 "5 05
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
-
- &charset KSC5636
- &alias ISO646-KR
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( W= )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
-
- &charset DEC-MCS
- &rem VAX/VMS User's Manual, Order Number: AI-Y517A-TE, April 1986.
- &alias dec
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
-
-Simonsen [Page 78]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- ?? !I Ct Pd ?? Ye ?? SE Cu Co -a << ?? ?? ?? ??
- DG +- 2S 3S ?? My PI .M ?? 1S -o >> 14 12 ?? ?I
- A! A' A> A? A: AA AE C, E! E' E> E: I! I' I> I:
- ?? N? O! O' O> O? O: OE O/ U! U' U> U: Y: ?? ss
- a! a' a> a? a: aa ae c, e! e' e> e: i! i' i> i:
- ?? n? o! o' o> o? o: oe o/ u! u' u> u: y: ?? ??
-
- &charset hp-roman8
- &rem source: LaserJet IIP Printer User's Manual,
- &rem HP part no 33471-90901, Hewlet-Packard, June 1989.
- &alias roman8
- &alias r8
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
- DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
- NS A! A> E! E> E: I> I: '' 1" AN ': ?1 U! U> Li
- '- Y' y' DG C, c, N? n? !I ?I Cu Pd Ye SE Fl Ct
- a> e> o> u> a' e' o' u' a! e! o! u! a: e: o: u:
- AA i> O/ AE aa i' o/ ae A: i! O: U: E' i: ss O>
- A' A? a? D- d- I' I! O' O! O? o? S< s< U' Y: y:
- TH th .M My PI 34 -M 14 12 -a -o << fS >> +- ??
-
- &charset macintosh
- &rem source: The Unicode Standard ver1.0, ISBN 0-201-56788-1, Oct 1991
- &alias mac
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- A: AA C, E' N? O: U: a' a! a> a: a? aa c, e' e!
- e> e: i' i! i> i: n? o' o! o> o: o? u' u! u> u:
- /- DG Ct Pd SE Sb PI ss Rg Co TM '' ': != AE O/
- 00 +- =< >= Ye My dP +Z *P p* In -a -o W* ae o/
- ?I !I NO RT Fl ?2 D* << >> .3 NS A! A? O? OE oe
- -M -N "6 "9 '6 '9 -: Db y: Y: /f Cu <1 >1 fi fl
- /= .M .9 :9 %0 A> E> A' E: E! I' I> I: I! O' O>
- ?? O! U' U> U! i. ?? ?? '- '( '. '0 ', '" '; '<
-
- &charset IBM037
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias cp037
- &alias ebcdic-cp-us
- &alias ebcdic-cp-ca
-
-Simonsen [Page 79]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- &alias ebcdic-cp-wt
- &alias ebcdic-cp-nl
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP NS a> a: a! a' a? aa c, n? Ct . < ( + !!
- & e' e> e: e! i' i> i: i! ss ! DO * ) ; NO
- - / A> A: A! A' A? AA C, N? BB , % _ > ?
- o/ E' E> E: E! I' I> I: I! '! : Nb At ' = "
- O/ a b c d e f g h i << >> d- y' th +-
- DG j k l m n o p q r -a -o ae ', AE Cu
- My '? s t u v w x y z !I ?I D- Y' TH Rg
- '> Pd Ye .M Co SE PI 14 12 34 <( )> '- ': '' *X
- (! A B C D E F G H I -- o> o: o! o' o?
- !) J K L M N O P Q R 1S u> u: u! u' y:
- // -: S T U V W X Y Z 2S O> O: O! O' O?
- 0 1 2 3 4 5 6 7 8 9 3S U> U: U! U' DT
-
- &charset IBM038
- &rem source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
- &alias EBCDIC-INT
- &alias cp038
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP ?? ?? ?? ?? ?? ?? ?? ?? ?? <( . < ( + !
- & ?? ?? ?? ?? ?? ?? ?? ?? ?? )> DO * ) ; '>
- - / ?? ?? ?? ?? ?? ?? ?? ?? BB , % _ > ?
- ?? ?? ?? ?? ?? ?? ?? ?? ?? '! : Nb At ' = "
- ?? a b c d e f g h i ?? ?? ?? ?? ?? ??
- ?? j k l m n o p q r ?? ?? ?? ?? ?? ??
- ?? '? s t u v w x y z ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- (! A B C D E F G H I ?? ?? ?? ?? ?? ??
- !) J K L M N O P Q R ?? ?? ?? ?? ?? ??
- // ?? S T U V W X Y Z ?? ?? ?? ?? ?? ??
- 0 1 2 3 4 5 6 7 8 9 ?? ?? ?? ?? ?? DT
-
- &charset IBM273
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias CP273
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP NS a> (! a! a' a? aa c, n? A: . < ( + !
- & e' e> e: e! i' i> i: i! '? U: DO * ) ; '>
- - / A> <( A! A' A? AA C, N? o: , % _ > ?
-
-Simonsen [Page 80]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- o/ E' E> E: E! I' I> I: I! '! : Nb SE ' = "
- O/ a b c d e f g h i << >> d- y' th +-
- DG j k l m n o p q r -a -o ae ', AE Cu
- My ss s t u v w x y z !I ?I D- Y' TH Rg
- Ct Pd Ye .M Co At PI 14 12 34 NO !! '- ': '' *X
- a: A B C D E F G H I -- o> BB o! o' o?
- u: J K L M N O P Q R 1S u> !) u! u' y:
- O: -: S T U V W X Y Z 2S O> // O! O' O?
- 0 1 2 3 4 5 6 7 8 9 3S U> )> U! U' DT
-
- &charset IBM274
- &rem source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
- &alias EBCDIC-BE
- &alias CP274
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP ?? ?? ?? ?? ?? ?? ?? ?? ?? <( . < ( + !
- & ?? ?? ?? ?? ?? ?? ?? ?? ?? )> DO * ) ; '>
- - / ?? ?? ?? ?? ?? ?? ?? ?? u! , % _ > ?
- ?? ?? ?? ?? ?? ?? ?? ?? ?? '! : Nb a! ' = "
- ?? a b c d e f g h i ?? ?? ?? ?? ?? ??
- ?? j k l m n o p q r ?? ?? ?? ?? ?? ??
- ?? ': s t u v w x y z ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- e' A B C D E F G H I ?? ?? ?? ?? ?? ??
- e! J K L M N O P Q R ?? ?? ?? ?? ?? ??
- c, ?? S T U V W X Y Z ?? ?? ?? ?? ?? ??
- 0 1 2 3 4 5 6 7 8 9 ?? ?? ?? ?? ?? DT
-
- &charset IBM275
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias EBCDIC-BR
- &alias cp275
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP ?? ?? ?? ?? ?? ?? ?? ?? ?? E' . < ( + !
- & ?? ?? ?? ?? ?? ?? ?? ?? ?? DO C, * ) ; '>
- - / ?? ?? ?? ?? ?? ?? ?? ?? c, , % _ > ?
- ?? ?? ?? ?? ?? ?? ?? ?? ?? a? : O? A? ' = "
- ?? a b c d e f g h i ?? ?? ?? ?? ?? ??
- ?? j k l m n o p q r ?? ?? ?? ?? ?? ??
- ?? '? s t u v w x y z ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- o? A B C D E F G H I ?? ?? ?? ?? ?? ??
- e' J K L M N O P Q R ?? ?? ?? ?? ?? ??
- // ?? S T U V W X Y Z ?? ?? ?? ?? ?? ??
- 0 1 2 3 4 5 6 7 8 9 ?? ?? ?? ?? ?? DT
-
-Simonsen [Page 81]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
-
- &charset IBM277
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias EBCDIC-CP-DK
- &alias EBCDIC-CP-NO
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP NS a> a: a! a' a? !) c, n? Nb . < ( + !
- & e' e> e: e! i' i> i: i! ss Cu AA * ) ; '>
- - / A> A: A! A' A? DO C, N? o/ , % _ > ?
- BB E' E> E: E! I' I> I: I! '! : AE O/ ' = "
- At a b c d e f g h i << >> d- y' th +-
- DG j k l m n o p q r -a -o (! ', <( )>
- My u: s t u v w x y z !I ?I D- Y' TH Rg
- Ct Pd Ye .M Co SE PI 14 12 34 NO !! '- ': '' *X
- ae A B C D E F G H I -- o> o: o! o' o?
- aa J K L M N O P Q R 1S u> '? u! u' y:
- // -: S T U V W X Y Z 2S O> O: O! O' O?
- 0 1 2 3 4 5 6 7 8 9 3S U> U: U! U' DT
-
- &charset IBM278
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias CP278
- &alias ebcdic-cp-fi
- &alias ebcdic-cp-se
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP NS a> (! a! a' a? !) c, n? SE . < ( + !
- & '! e> e: e! i' i> i: i! ss Cu AA * ) ; '>
- - / A> Nb A! A' A? DO C, N? o: , % _ > ?
- o/ E' E> E: E! I' I> I: I! e' : A: O: ' = "
- O/ a b c d e f g h i << >> d- y' th +-
- DG j k l m n o p q r -a -o ae ', AE )>
- My u: s t u v w x y z !I ?I D- Y' TH Rg
- Ct Pd Ye .M Co <( PI 14 12 34 NO !! '- ': '' *X
- a: A B C D E F G H I -- o> BB o! o' o?
- aa J K L M N O P Q R 1S u> '? u! u' y:
- // -: S T U V W X Y Z 2S O> At O! O' O?
- 0 1 2 3 4 5 6 7 8 9 3S U> U: U! U' DT
-
- &charset IBM280
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias CP280
- &alias ebcdic-cp-it
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
-
-Simonsen [Page 82]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP NS a> a: (! a' a? aa // n? DG . < ( + !
- & )> e> e: !) i' i> i: '? ss e' DO * ) ; '>
- - / A> A: A! A' A? AA C, N? o! , % _ > ?
- o/ E' E> E: E! I' I> I: I! u! : Pd SE ' = "
- O/ a b c d e f g h i << >> d- y' th +-
- <( j k l m n o p q r -a -o ae ', AE Cu
- My i! s t u v w x y z !I ?I D- Y' TH Rg
- Ct Nb Ye .M Co At PI 14 12 34 NO !! '- ': '' *X
- a! A B C D E F G H I -- o> o: BB o' o?
- e! J K L M N O P Q R 1S u> u: '! u' y:
- c, -: S T U V W X Y Z 2S O> O: O! O' O?
- 0 1 2 3 4 5 6 7 8 9 3S U> U: U! U' DT
-
- &charset IBM281
- &rem source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
- &alias EBCDIC-JP-E
- &alias cp281
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP ?? ?? ?? ?? ?? ?? ?? ?? ?? Pd . < ( + !!
- & ?? ?? ?? ?? ?? ?? ?? ?? ?? ! Ye * ) ; NO
- - / ?? ?? ?? ?? ?? ?? ?? ?? BB , % _ > ?
- ?? ?? ?? ?? ?? ?? ?? ?? ?? '! : Nb At ' = "
- ?? a b c d e f g h i ?? ?? ?? ?? ?? ??
- ?? j k l m n o p q r ?? ?? ?? ?? ?? ??
- ?? '- s t u v w x y z ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- (! A B C D E F G H I ?? ?? ?? ?? ?? ??
- !) J K L M N O P Q R ?? ?? ?? ?? ?? ??
- DO ?? S T U V W X Y Z ?? ?? ?? ?? ?? ??
- 0 1 2 3 4 5 6 7 8 9 ?? ?? ?? ?? ?? DT
-
- &charset IBM284
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias CP284
- &alias ebcdic-cp-es
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP NS a> a: a! a' a? aa c, BB <( . < ( + !!
- & e' e> e: e! i' i> i: i! ss )> DO * ) ; NO
- - / A> A: A! A' A? AA C, Nb n? , % _ > ?
- o/ E' E> E: E! I' I> I: I! '! : N? At ' = "
- O/ a b c d e f g h i << >> d- y' th +-
- DG j k l m n o p q r -a -o ae ', AE Cu
- My ': s t u v w x y z !I ?I D- Y' TH Rg
-
-Simonsen [Page 83]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- Ct Pd Ye .M Co SE PI 14 12 34 '> ! '- '? '' *X
- (! A B C D E F G H I -- o> o: o! o' o?
- !) J K L M N O P Q R 1S u> u: u! u' y:
- // -: S T U V W X Y Z 2S O> O: O! O' O?
- 0 1 2 3 4 5 6 7 8 9 3S U> U: U! U' DT
-
- &charset IBM285
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias CP285
- &alias ebcdic-cp-gb
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP NS a> a: a! a' a? aa c, n? DO . < ( + !!
- & e' e> e: e! i' i> i: i! ss ! Pd * ) ; NO
- - / A> A: A! A' A? AA C, N? BB , % _ > ?
- o/ E' E> E: E! I' I> I: I! '! : Nb At ' = "
- O/ a b c d e f g h i << >> d- y' th +-
- DG j k l m n o p q r -a -o ae ', AE Cu
- My '? s t u v w x y z !I ?I D- Y' TH Rg
- Ct <( Ye .M Co SE PI 14 12 34 '> )> '- ': '' *X
- (! A B C D E F G H I -- o> o: o! o' o?
- !) J K L M N O P Q R 1S u> u: u! u' y:
- // -: S T U V W X Y Z 2S O> O: O! O' O?
- 0 1 2 3 4 5 6 7 8 9 3S U> U: U! U' DT
-
- &charset IBM290
- &rem source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
- &alias cp290
- &alias EBCDIC-JP-kana
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP ._ <' >' ,_ .6 Wo a6 i6 u6 Pd . < ( + !!
- & e6 o6 YA YU YO TU ?? -6 ?? ! Ye * ) ; NO
- - / ?? ?? ?? ?? ?? ?? ?? ?? BB , % _ > ?
- ?? ?? ?? ?? ?? ?? ?? ?? ?? '! : Nb At ' = "
- ?? A6 I6 U6 E6 O6 Ka Ki Ku Ke Ko ?? Sa Si Su Se
- So Ta Ti Tu Te To Na Ni Nu Ne No ?? ?? Ha Hi Hu
- ?? '- He Ho Ma Mi Mu Me Mo Ya Yu ?? Yo Ra Ri Ru
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? Re Ro Wa N6 "5 05
- ?? A B C D E F G H I ?? ?? ?? ?? ?? ??
- ?? J K L M N O P Q R ?? ?? ?? ?? ?? ??
- DO ?? S T U V W X Y Z ?? ?? ?? ?? ?? ??
- 0 1 2 3 4 5 6 7 8 9 ?? ?? ?? ?? ?? DT
-
- &charset IBM297
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias cp297
-
-Simonsen [Page 84]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- &alias ebcdic-cp-fr
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP NS a> a: At a' a? aa // n? DG . < ( + !
- & (! e> e: !) i' i> i: i! ss SE DO * ) ; '>
- - / A> A: A! A' A? AA C, N? u! , % _ > ?
- o/ E' E> E: E! I' I> I: I! My : Pd a! ' = "
- O/ a b c d e f g h i << >> d- y' th +-
- <( j k l m n o p q r -a -o ae ', AE Cu
- '! ': s t u v w x y z !I ?I D- Y' TH Rg
- Ct Nb Ye .M Co )> PI 14 12 34 NO !! '- '? '' *X
- e' A B C D E F G H I -- o> o: o! o' o?
- e! J K L M N O P Q R 1S u> u: BB u' y:
- c, -: S T U V W X Y Z 2S O> O: O! O' O?
- 0 1 2 3 4 5 6 7 8 9 3S U> U: U! U' DT
-
- &charset IBM420
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &rem IBM NLS RM p 11-11
- &alias cp420
- &alias ebcdic-cp-ar1
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP NS 3+ 3+; ++ ?? H' aM aM. aH Ct . < ( + !!
- & aH. wH ?? ?? yH a+ a+. b+ b+, ! DO * ) ; NO
- - / tm t+ t+, tk tk, g+ g+, hk BB , % _ > ?
- hk, x+ x+, d+ dk r+ z+ s+ s+, ,+ : Nb At ' = "
- sn a b c d e f g h i sn, c+ c+, dd dd, tj
- zH j k l m n o p q r e+ e+. e+, e+; i+ i+.
- i+, -: s t u v w x y z i+; f+ f+, q+ q+, k+
- k+, l+ lM- lM. lH- lH. ?? ?? la- la. l+, m+ m+, n+ n+, h+
- ;+ A B C D E F G H I -- h+, ?? h+; ?? w+
- ?+ J K L M N O P Q R j+ j+. y+ y+. y+, 0a
- *X ?? S T U V W X Y Z 1a 2a ?? 3a 4a 5a
- 0 1 2 3 4 5 6 7 8 9 ?? 6a 7a 8a 9a DT
-
- &charset IBM423
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias cp423
- &alias ebcdic-cp-gr
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP A* B* G* D* E* Z* Y* H* I* <( . < ( + !
- & K* L* M* N* C* O* P* R* S* )> DO * ) ; '>
-
-Simonsen [Page 85]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- - / T* U* F* X* Q* W* ?? ?? ?? , % _ > ?
- ?? A% E% Y% ?? I% O% U% W% '! : Pd SE ' = "
- A: a b c d e f g h i a* b* g* d* e* z*
- O: j k l m n o p q r y* h* i* k* l* m*
- U: ': s t u v w x y z n* c* o* p* r* *s
- ?? a% e% y% j* i% o% u% v* w% s* t* u* f* x* q*
- %' y= z= s% je sc c% =' JU A= B= C= D= E= F= G=
- ', A B C D E F G H I ?? w* A> a! a: e>
- '' J K L M N O P Q R +- e' e! e: i> i:
- DG ?? S T U V W X Y Z 12 o: o> u> u! u:
- 0 1 2 3 4 5 6 7 8 9 y: c, C, ?? ?? DT
-
- &charset IBM424
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias cp424
- &alias ebcdic-cp-he
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP A+ B+ G+ D+ H+ W+ Z+ X+ Tj Ct . < ( + !!
- & J+ K% K+ L+ M% M+ N% N+ S+ ! DO * ) ; NO
- - / E+ P% P+ Zj ZJ Q+ R+ Sh BB , % _ > ?
- ?? T+ ?? ?? NS ?? ?? ?? == '! : Nb At ' = "
- ?? a b c d e f g h i << >> ?? ?? ?? ??
- DG j k l m n o p q r ?? ?? ?? ', ?? Cu
- My '? s t u v w x y z ?? ?? ?? ?? ?? Rg
- '> Pd Ye .M Co SE PI 14 12 34 <( )> '- ': '' *X
- (! A B C D E F G H I -- ?? ?? ?? ?? ??
- !) J K L M N O P Q R 1S ?? ?? ?? ?? ??
- // -: S T U V W X Y Z 2S ?? ?? ?? ?? ??
- 0 1 2 3 4 5 6 7 8 9 3S ?? ?? ?? ?? DT
-
- &charset IBM437
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias cp437
- &alias 437
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- C, u: e' a> a: a! aa c, e> e: e! i: i> i! A: AA
- E' ae AE o> o: o! u> u! y: O: U: Ct Pd Ye Pt Fl
- a' i' o' u' n? N? -a -o ?I NI NO 12 14 !I << >>
- .S :S ?S vv vl vL Vl Dl dL VL VV LD UL Ul uL dl
- ur uh dh vr hh vh vR Vr UR DR UH DH VR HH VH uH
- Uh dH Dh Ur uR dR Dr Vh vH ul dr FB LB lB RB TB
- a* b* G* p* S* s* m* t* F* H* W* d* 00 /0 e* (U
- =3 +- >= =< Iu Il -: ?2 Ob .M Sb RT nS 2S fS NS
-
-
-Simonsen [Page 86]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- &charset IBM500
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias CP500
- &alias ebcdic-cp-be
- &alias ebcdic-cp-ch
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP NS a> a: a! a' a? aa c, n? <( . < ( + !
- & e' e> e: e! i' i> i: i! ss )> DO * ) ; '>
- - / A> A: A! A' A? AA C, N? BB , % _ > ?
- o/ E' E> E: E! I' I> I: I! '! : Nb At ' = "
- O/ a b c d e f g h i << >> d- y' th +-
- DG j k l m n o p q r -a -o ae ', AE Cu
- My '? s t u v w x y z !I ?I D- Y' TH Rg
- Ct Pd Ye .M Co SE PI 14 12 34 NO !! '- ': '' *X
- (! A B C D E F G H I -- o> o: o! o' o?
- !) J K L M N O P Q R 1S u> u: u! u' y:
- // -: S T U V W X Y Z 2S O> O: O! O' O?
- 0 1 2 3 4 5 6 7 8 9 3S U> U: U! U' DT
-
- &charset IBM850
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias cp850
- &alias 850
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- C, u: e' a> a: a! aa c, e> e: e! i: i> i! A: AA
- E' ae AE o> o: o! u> u! y: O: U: o/ Pd O/ *X Fl
- a' i' o' u' n? N? -a -o ?I Rg NO 12 14 !I << >>
- .S :S ?S vv vl A' A> A! Co VL VV LD UL Ct Ye dl
- ur uh dh vr hh vh a? A? UR DR UH DH VR HH VH Cu
- d- D- E> E: E! i. I' I> I: ul dr FB LB BB I! TB
- O' ss O> O! o? O? m* TH th U' U> U! y' Y' -M ''
- -- +- == 34 PI SE -: '; DG ': '. 1S 3S 2S fS NS
-
- &charset IBM851
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias cp851
- &alias 851
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- C, u: e' a> a: a! A% c, e> e: e! i: i> E% A: Y%
-
-Simonsen [Page 87]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- I% ?? O% o> o: U% u> u! W% O: U: a% Pd e% y% i%
- j* i3 o% u% A* B* G* D* E* Z* Y* 12 H* I* << >>
- .S :S ?S vv vl K* L* N* M* VL VV LD UL C* O* dl
- ur uh dh vr hh vh P* R* UR DR UH DH VR HH VH S*
- T* U* F* X* Q* W* a* b* g* ul dr FB LB d* e* TB
- z* y* h* i* k* l* m* n* c* o* p* r* s* *s t* ''
- -- +- u* f* x* SE q* '; DG ': w* v* u3 w% fS NS
-
- &charset IBM852
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias cp852
- &alias 852
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- C, u: e' a> a: u0 c' c, l/ e: O" o" i> Z' A: C'
- E' L' l' o> o: L< l< S' s' O: U: T< t< L/ *X c<
- a' i' o' u' A; a; Z< z< E; e; ?? z' C< s, << >>
- .S :S ?S vv vl A' A> E< S, VL VV LD UL Z. z. dl
- ur uh dh vr hh vh A( a( UR DR UH DH VR HH VH Cu
- d/ D/ D< E: d< N< I' U> e< ul dr FB LB T, U0 TB
- O' ss O> N' n' n< S< s< R' U' r' U" y' Y' t, ''
- -- '" ', '< '( SE -: '; DG ': '. u" R< r< fS NS
-
- &charset IBM855
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias cp855
- &alias 855
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- d% D% g% G% io IO ie IE ds DS ii II yi YI j% J%
- lj LJ nj NJ ts TS kj KJ v% V% dz DZ ju JU =' ="
- a= A= b= B= c= C= d= D= e= E= f= F= g= G= << >>
- .S :S ?S vv vl h= H= i= I= VL VV LD UL j= J= dl
- ur uh dh vr hh vh k= K= UR DR UH DH VR HH VH Cu
- l= L= m= M= n= N= o= O= p= ul dr FB LB P= ja TB
- JA r= R= s= S= t= T= u= U= z% Z% v= V= %' %" ''
- -- y= Y= z= Z= s% S% je JE sc Sc c% C% ?? fS NS
-
- &charset IBM857
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias cp857
- &alias 857
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
-
-Simonsen [Page 88]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- C, u: e' a> a: a! aa c, e> e: e! i: i> i. A: AA
- E' ae AE o> o: o! u> u! I. O: U: o/ Pd O/ S, s,
- a' i' o' u' n? N? G( g( ?I Rg NO 12 14 !I << >>
- .S :S ?S vv vl A' A> A! Co VL VV LD UL Ct Ye dl
- ur uh dh vr hh vh a? A? UR DR UH DH VR HH VH Cu
- -o -a E> E: E! ?? I' I> I: ul dr FB LB BB I! TB
- O' ss O> O! o? O? m* ?? *X U' U> U! i! y: -M ''
- -- +- ?? 34 PI SE -: '; DG ': '. 1S 3S 2S fS NS
-
- &charset IBM860
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias cp860
- &alias 860
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- C, u: e' a> a? a! A' c, e> E> e! I> O> i! A? A>
- E' A! E! o> o? o! U' u! I! O? U: Ct Pd U! Pt O!
- a' i' o' u' n? N? -a -o ?I O' NO 12 14 !I << >>
- .S :S ?S vv vl vL Vl Dl dL VL VV LD UL Ul uL dl
- ur uh dh vr hh vh vR Vr UR DR UH DH VR HH VH uH
- Uh dH Dh Ur uR dR Dr Vh vH ul dr FB LB lB RB TB
- a* b* G* p* S* s* m* t* F* H* W* d* 00 /0 e* (U
- =3 +- >= =< Iu Il -: ?2 Ob .M Sb RT nS 2S fS NS
-
- &charset IBM861
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias cp861
- &alias 861
- &alias cp-is
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- C, u: e' a> a: a! aa c, e> e: e! D- d- TH A: AA
- E' ae AE o> o: th u> Y' y' O: U: o/ Pd O/ Pt O!
- a' i' o' u' A' I' O' U' ?I ?? NO 12 14 !I << >>
- .S :S ?S vv vl vL Vl Dl dL VL VV LD UL Ul uL dl
- ur uh dh vr hh vh vR Vr UR DR UH DH VR HH VH uH
- Uh dH Dh Ur uR dR Dr Vh vH ul dr FB LB lB RB TB
- a* b* G* p* S* s* m* t* F* H* W* d* 00 /0 e* (U
- =3 +- >= =< Iu Il -: ?2 Ob .M Sb RT nS 2S fS NS
-
- &charset IBM862
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
-
-Simonsen [Page 89]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- &alias cp862
- &alias 862
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- A+ B+ G+ D+ H+ W+ Z+ X+ Tj J+ K% K+ L+ M% M+ N%
- N+ S+ E+ P% P+ Zj ZJ Q+ R+ Sh T+ Ct Pd U! Pt O!
- a' i' o' u' n? N? -a -o ?I ?? NO 12 14 !I << >>
- .S :S ?S vv vl vL Vl Dl dL VL VV LD UL Ul uL dl
- ur uh dh vr hh vh vR Vr UR DR UH DH VR HH VH uH
- Uh dH Dh Ur uR dR Dr Vh vH ul dr FB LB lB RB TB
- a* b* G* p* S* s* m* t* F* H* W* d* 00 /0 e* (U
- =3 +- >= =< Iu Il -: ?2 Ob .M Sb RT nS 2S fS NS
-
- &charset IBM863
- &rem source: IBM Keyboard layouts and code pages, PN 07G4586 June 1991
- &alias cp863
- &alias 863
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- C, u: e' a> A> a! PI c, e> e: e! i: i> i! A! SE
- E' E! E> o> E: I: u> u! Cu O> U: Ct Pd U! U> Fl
- BB '' o' u' ': ', 3S '- I> NI NO 12 14 34 << >>
- .S :S ?S vv vl vL Vl Dl dL VL VV LD UL Ul uL dl
- ur uh dh vr hh vh vR Vr UR DR UH DH VR HH VH uH
- Uh dH Dh Ur uR dR Dr Vh vH ul dr FB LB lB RB TB
- a* b* G* p* S* s* m* t* F* H* W* d* 00 /0 e* (U
- =3 +- >= =< Iu Il -: ?2 Ob .M Sb RT nS 2S fS NS
-
- &charset IBM864
- &rem source: IBM Keyboard layouts and code pages, PN 07G4586 June 1991
- &alias cp864
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- DG .M Ob RT :S hh vv vh vl dh vr uh dl dr ur ul
- ss 00 o/ +- 12 14 ?2 << >> lH- lH. ?? ?? la- la. a+:
- ?? -- aM. Pd Cu aH. ?? ?? a+. b+ t+ tk ,+ g+ hk x+
- 0a 1a 2a 3a 4a 5a 6a 7a 8a 9a v+ ;+ s+ sn c+ ?+
- Ct H' aM aH wH e+. yH a+ b+, tm t+, tk, g+, hk, x+, d+
- dk r+ z+ s+, sn, c+, dd, tj zH e+, i+, BB NO -: *X e+
- ++ f+. q+. k+, l+. m+, n+. h+, w+ j+ y+, dd m+. i+. i+ m+
- 3+; 3+ n+ h+ h+; j+. y+. f+ q+ lM- lM. l+ k+ y+ fS NS
-
-Simonsen [Page 90]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
-
- &charset IBM865
- &rem source: IBM DOS 3.3 Ref (Abridged), 94X9575 (Feb 1987)
- &alias cp865
- &alias 865
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- C, u: e' a> a: a! aa c, e> e: e! i: i> i! A: AA
- E' ae AE o> o: o! u> u! y: O: U: o/ Pd O/ Pt Fl
- a' i' o' u' n? N? -a -o ?I NI NO 12 14 !I << >>
- .S :S ?S vv vl vL Vl Dl dL VL VV LD UL Ul uL dl
- ur uh dh vr hh vh vR Vr UR DR UH DH VR HH VH uH
- Uh dH Dh Ur uR dR Dr Vh vH ul dr FB LB lB RB TB
- a* b* G* p* S* s* m* t* F* H* W* d* 00 /0 e* (U
- =3 +- >= =< Iu Il -: ?2 Ob .M Sb RT nS 2S fS NS
-
- &charset IBM868
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias CP868
- &alias cp-ar
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- 0a 1a 2a 3a 4a 5a 6a 7a 8a 9a ,+ ;+ ?+ aM a+ a+.
- a+: b+ b+, p+ ?? tm t+ t+, ?? ?? tk tk, g+ g+, ?? ??
- hk hk, x+ x+, d+ ?? dk r+ ?? z+ ?? s+ s+, sn << >>
- sn, c+ .S :S ?S vv vl c+, dd dd, tj VL VV LD UL zH
- e+ dl ur uh dh vr hh vh e+. e+, UR DR UH DH VR HH
- VH e+; i+ i+. i+, i+; f+ f+, q+ q+, k+. ul dr FB TB k+,
- ?? LB ?? l+ l+. l+; m+ m+, ?? n+ n+, ?? w+ ?? ?? ??
- ?? H' -- ?? ?? ?? ?? ?? ?? ?? ?? 3+ 3+; ?? fS NS
-
- &charset IBM869
- &rem source: IBM Keyboard layouts and code pages, PN 07G4586 June 1991
- &alias cp869
- &alias 869
- &alias cp-gr
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- ?? ?? ?? ?? ?? ?? A% ?? .M NO BB 9' '9 E% -M Y%
- I% J* O% ?? ?? U% V* Co W% 2S 3S a% Pd e% y% i%
- j* i3 o% u% A* B* G* D* E* Z* Y* 12 H* I* << >>
-
-Simonsen [Page 91]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- .S :S ?S vv vl K* L* M* N* VL VV LD UL C* O* dl
- ur uh dh vr hh vh P* R* UR DR UH DH VR HH VH S*
- T* U* F* X* Q* W* a* b* g* ul dr FB LB d* e* TB
- z* y* h* i* k* l* m* n* c* o* p* r* s* *s t* ''
- -- +- u* f* x* SE q* '% DG ': w* v* u3 w% fS NS
-
- &charset IBM870
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias CP870
- &alias ebcdic-cp-roece
- &alias ebcdic-cp-yu
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP NS ?? a: ?? a' a( c< c, c' <( . < ( + !
- & e' ?? e: u0 i' ?? l< l' ss )> DO * ) ; '>
- - / ?? A: '" A' ?? C< C, C' !! , % _ > ?
- '< E' ?? E: U0 I' ?? L< L' '! : Nb At ' = "
- '( a b c d e f g h i s' n< d/ y' r< ??
- DG j k l m n o p q r l/ n' s< ', '; Cu
- a; '? s t u v w x y z S' N< D/ Y' R< ??
- .M A; z. ?? Z. SE PI z< z' Z< Z' N' S< ': '' *X
- (! A B C D E F G H I -- o> o: r' o' o"
- !) J K L M N O P Q R E< u" u: t< u' e<
- // -: S T U V W X Y Z d< O> O: R' O' O"
- 0 1 2 3 4 5 6 7 8 9 D< U" U: T< U' DT
-
- &charset IBM871
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias CP871
- &alias ebcdic-cp-is
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP NS a> a: a! a' a? aa c, n? th . < ( + !
- & e' e> e: e! i' i> i: i! ss AE DO * ) ; O:
- - / A> A: A! A' A? AA C, N? BB , % _ > ?
- o/ E' E> E: E! I' I> I: I! d- : Nb D- ' = "
- O/ a b c d e f g h i << >> '! y' (! +-
- DG j k l m n o p q r -a -o !) ', )> Cu
- My o: s t u v w x y z !I ?I At Y' <( Rg
- Ct Pd Ye .M Co SE PI 14 12 34 NO !! '- ': // *X
- TH A B C D E F G H I -- o> '? o! o' o?
- ae J K L M N O P Q R 1S u> u: u! u' y:
- '' -: S T U V W X Y Z 2S O> '> O! O' O?
- 0 1 2 3 4 5 6 7 8 9 3S U> U: U! U' DT
-
- &charset IBM880
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
-
-Simonsen [Page 92]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- &alias cp880
- &alias EBCDIC-Cyrillic
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP ?? d% g% io ?? ds ii yi j% <( . < ( + !
- & lj nj ts kj ?? dz =" N0 D% )> DO * ) ; '>
- - / G% IO ?? DS II YI J% LJ BB , % _ > ?
- NJ Ts KJ ?? ?? DZ ju a= b= ?? : Nb At ' = "
- c= a b c d e f g h i d= e= f= g= h= i=
- j= j k l m n o p q r k= l= m= n= o= p=
- ja ?? s t u v w x y z r= s= t= u= z% v=
- %' y= z= s% je sc c% =' JU A= B= C= D= E= F= G=
- ?? A B C D E F G H I H= I= J= K= L= M=
- ?? J K L M N O P Q R N= O= P= JA R= S=
- // Cu S T U V W X Y Z T= U= Z% V= %" Y=
- 0 1 2 3 4 5 6 7 8 9 Z= S% JE Sc C% DT
-
- &charset IBM891
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias cp891
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
-
- &charset IBM903
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias cp903
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
-
-Simonsen [Page 93]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
-
- &charset IBM904
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias cp904
- &alias 904
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
- '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
- Ct ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? NO BB ??
-
- &charset IBM905
- &rem source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
- &alias CP905
- &alias ebcdic-cp-tr
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP ?? a> a: a! a' ?? c. (! n? C, . < ( + !
- & e' e> e: e! i' i> i: i! ss G( I. * ) ; '>
- - / A> A: A! A' ?? C. <( N? s, , % _ > ?
- ?? E' E> E: E! I' I> I: I! i. : O: S, ' = U:
- '( a b c d e f g h i h/ c> s> u( ?? !!
- DG j k l m n o p q r h> g> j> '; ?? Cu
- My o: s t u v w x y z H/ C> S> U( ?? At
- .M Pd z. !) Z. SE )> ?? 12 DO H> G> J> ': '' *X
- c, A B C D E F G H I -- o> '? o! o' g.
- g( J K L M N O P Q R '! u> // u! u' ??
- u: -: S T U V W X Y Z 2S O> Nb O! O' G.
- 0 1 2 3 4 5 6 7 8 9 3S U> " U! U' DT
-
- &charset IBM918
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias CP918
- &alias ebcdic-cp-ar2
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
-
-Simonsen [Page 94]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- SP NS ,+ ;+ ?+ aH a+ a+. ?? b+ <( . < ( + !
- & b+, p+ ?? tm t+ t+, ?? ?? tk )> DO * ) ; '>
- - / tk, g+ g+, ?? ?? hk hk, x+ '! , % _ > ?
- 0a 1a 2a 3a 4a 5a 6a 7a 8a 9a : Nb At ' = "
- x+, a b c d e f g h i d+ ?? dk r+ ?? z+
- ?? j k l m n o p q r s+ s+, sn sn, c+ c+,
- dd '? s t u v w x y z dd, tj zH e+ e+. e+,
- e+; i+ i+. i+, i+; f+ f+, q+ q+, k+ k+, !! ?? ?? l+ l+.
- (! A B C D E F G H I -- ?? m+ m+, ?? n+
- !) J K L M N O P Q R n+, ?? w+ ?? ?? ??
- // ?? S T U V W X Y Z H' ?? ?? ?? ?? ??
- 0 1 2 3 4 5 6 7 8 9 ?? ?? ?? 3+ 3+; DT
-
- &charset IBM1026
- &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
- &alias CP1026
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP NS a> a: a! a' a? aa (! n? C, . < ( + !
- & e' e> e: e! i' i> i: i! ss G( I. * ) ; '>
- - / A> A: A! A' A? AA <( N? s, , % _ > ?
- o/ E' E> E: E! I' I> I: I! i. : O: S, ' = U:
- O/ a b c d e f g h i << >> !) '! BB +-
- DG j k l m n o p q r -a -o ae '; AE Cu
- My o: s t u v w x y z !I ?I )> DO At Rg
- Ct Pd Ye .M Co SE PI 14 12 34 NO !! -M ': '' *X
- c, A B C D E F G H I -- o> '? o! o' o?
- g( J K L M N O P Q R 1S u> // u! u' y:
- u: -: S T U V W X Y Z 2S O> Nb O! O' O?
- 0 1 2 3 4 5 6 7 8 9 3S U> " U! U' DT
-
- &charset EBCDIC-AT-DE
- &rem source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP ?? ?? ?? ?? ?? ?? ?? ?? ?? A: . < ( + !
- & ?? ?? ?? ?? ?? ?? ?? ?? ?? U: DO * ) ; '>
- - / ?? ?? ?? ?? ?? ?? ?? ?? o: , % _ > ?
- ?? ?? ?? ?? ?? ?? ?? ?? ?? '! : Nb SE ' = "
- ?? a b c d e f g h i ?? ?? ?? ?? ?? ??
- ?? j k l m n o p q r ?? ?? ?? ?? ?? ??
- ?? ss s t u v w x y z ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- a: A B C D E F G H I ?? ?? ?? ?? ?? ??
- u: J K L M N O P Q R ?? ?? ?? ?? ?? ??
- O: ?? S T U V W X Y Z ?? ?? ?? ?? ?? ??
- 0 1 2 3 4 5 6 7 8 9 ?? ?? ?? ?? ?? DT
-
-Simonsen [Page 95]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
-
- &charset EBCDIC-AT-DE-A
- &rem source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP ?? ?? ?? ?? ?? ?? ?? ?? ?? o: . < ( + !!
- & ?? ?? ?? ?? ?? ?? ?? ?? ?? u: U: * ) ; NO
- - / ?? ?? ?? ?? ?? ?? ?? ?? ss , % _ > ?
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? : A: O: ' = a:
- ?? a b c d e f g h i ?? ?? ?? ?? ?? ??
- ?? j k l m n o p q r ?? ?? ?? ?? ?? ??
- ?? ?? s t u v w x y z ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? A B C D E F G H I ?? ?? ?? ?? ?? ??
- ?? J K L M N O P Q R ?? ?? ?? ?? ?? ??
- ?? ?? S T U V W X Y Z ?? ?? ?? ?? ?? ??
- 0 1 2 3 4 5 6 7 8 9 ?? ?? ?? ?? ?? DT
-
- &charset EBCDIC-CA-FR
- &rem source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP ?? a> ?? ?? ?? ?? ?? c, ?? a! . < ( + !
- & ?? e> e: ?? ?? i> i: ?? ?? '' DO * ) ; '>
- - / A> ?? A! ?? ?? ?? C, ?? u! , % _ > ?
- ?? E' E> E: ?? I> I: ?? ?? '! : Nb At ' = "
- ?? a b c d e f g h i ?? ?? ?? ?? ?? ??
- ?? j k l m n o p q r ?? ?? ?? ?? ?? ??
- ?? ': s t u v w x y z ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- e' A B C D E F G H I ?? o> ?? ?? ?? ??
- e! J K L M N O P Q R ?? u> u: ?? ?? ??
- ', ?? S T U V W X Y Z ?? O> ?? ?? ?? ??
- 0 1 2 3 4 5 6 7 8 9 ?? U> U: U! ?? DT
-
- &charset EBCDIC-DK-NO
- &rem source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP ?? ?? ?? ?? ?? ?? ?? ?? ?? Nb . < ( + !
- & ?? ?? ?? ?? ?? ?? ?? ?? ?? Cu AA * ) ; '>
- - / ?? ?? ?? ?? ?? ?? ?? ?? o/ , % _ > ?
- ?? ?? ?? ?? ?? ?? ?? ?? ?? '! : AE O/ ' = "
- ?? a b c d e f g h i ?? ?? ?? ?? ?? ??
-
-Simonsen [Page 96]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- ?? j k l m n o p q r ?? ?? ?? ?? ?? ??
- ?? u: s t u v w x y z ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ae A B C D E F G H I ?? ?? ?? ?? ?? ??
- aa J K L M N O P Q R ?? ?? ?? ?? ?? ??
- // ?? S T U V W X Y Z ?? ?? ?? ?? ?? ??
- 0 1 2 3 4 5 6 7 8 9 ?? ?? ?? ?? ?? DT
-
- &charset EBCDIC-DK-NO-A
- &rem source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP ?? ?? ?? ?? ?? ?? ?? ?? ?? o/ . < ( + !!
- & ?? ?? ?? ?? ?? ?? ?? ?? ?? aa AA * ) ; NO
- - / ?? ?? ?? ?? ?? ?? ?? ?? BB , % _ > ?
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? : AE O/ ' = ae
- ?? a b c d e f g h i ?? ?? ?? ?? ?? ??
- ?? j k l m n o p q r ?? ?? ?? ?? ?? ??
- ?? ?? s t u v w x y z ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? A B C D E F G H I ?? ?? ?? ?? ?? ??
- ?? J K L M N O P Q R ?? ?? ?? ?? ?? ??
- ?? ?? S T U V W X Y Z ?? ?? ?? ?? ?? ??
- 0 1 2 3 4 5 6 7 8 9 ?? ?? ?? ?? ?? DT
-
- &charset EBCDIC-FI-SE
- &rem source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP ?? ?? ?? ?? ?? ?? ?? ?? ?? SE . < ( + !
- & ?? ?? ?? ?? ?? ?? ?? ?? ?? Cu AA * ) ; '>
- - / ?? ?? ?? ?? ?? ?? ?? ?? o: , % _ > ?
- ?? ?? ?? ?? ?? ?? ?? ?? ?? e' : A: O: ' = "
- ?? a b c d e f g h i ?? ?? ?? ?? ?? ??
- ?? j k l m n o p q r ?? ?? ?? ?? ?? ??
- ?? u: s t u v w x y z ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- a: A B C D E F G H I ?? ?? ?? ?? ?? ??
- aa J K L M N O P Q R ?? ?? ?? ?? ?? ??
- E' ?? S T U V W X Y Z ?? ?? ?? ?? ?? ??
- 0 1 2 3 4 5 6 7 8 9 ?? ?? ?? ?? ?? DT
-
- &charset EBCDIC-FI-SE-A
- &rem source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
-
-Simonsen [Page 97]
-
-RFC 1345 Character Mnemonics & Character Sets June 1992
-
-
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP ?? ?? ?? ?? ?? ?? ?? ?? ?? o: . < ( + !!
- & ?? ?? ?? ?? ?? ?? ?? ?? ?? aa AA * ) ; NO
- - / ?? ?? ?? ?? ?? ?? ?? ?? BB , % _ > ?
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? : A: O: ' = a:
- ?? a b c d e f g h i ?? ?? ?? ?? ?? ??
- ?? j k l m n o p q r ?? ?? ?? ?? ?? ??
- ?? ?? s t u v w x y z ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? A B C D E F G H I ?? ?? ?? ?? ?? ??
- ?? J K L M N O P Q R ?? ?? ?? ?? ?? ??
- ?? ?? S T U V W X Y Z ?? ?? ?? ?? ?? ??
- 0 1 2 3 4 5 6 7 8 9 ?? ?? ?? ?? ?? DT
-
- &charset EBCDIC-FR
- &rem source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
- &code 0
- NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
- DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- SP ?? ?? ?? ?? ?? ?? ?? ?? ?? DG . < ( + !
- & ?? ?? ?? ?? ?? ?? ?? ?? ?? SE DO * ) ; '>
- - / ?? ?? ?? ?? ?? ?? ?? ?? u! , % _ > ?
- ?? ?? ?? ?? ?? ?? ?? ?? ?? '! : Pd a! ' = "
- ?? a b c d e f g h i ?? ?? ?? ?? ?? ??
- ?? j k l m n o p q r ?? ?? ?? ?? ?? ??
- ?? ': s t u v w x y z ?? ?? ?? ?? ?? ??
- ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
- e' A B C D E F G H I ?? ?? ?? ?? ?? ??
- e! J K L M N O P Q R ?? ?? ?? ?? ?? ??
- c, ?? S T U V W X Y Z ?? ?? ?? ?? ?? ??
- 0 1 2 3 4 5 6 7 8 9 ?? ?? ?? ?? ?? D
\ No newline at end of file
diff --git a/reference/rfc1524 A User Agent Configuration Mechanism For Multimedia Mail Format Information.txt b/reference/rfc1524 A User Agent Configuration Mechanism For Multimedia Mail Format Information.txt
deleted file mode 100644
index a97e16f..0000000
--- a/reference/rfc1524 A User Agent Configuration Mechanism For Multimedia Mail Format Information.txt
+++ /dev/null
@@ -1,675 +0,0 @@
-
-
-
-
-
-
-Network Working Group N. Borenstein
-Request for Comments: 1524 Bellcore
-Category: Informational September 1993
-
-
- A User Agent Configuration Mechanism
- For Multimedia Mail Format Information
-
-Status of This Memo
-
- This memo provides information for the Internet community. It does
- not specify an Internet standard. Distribution of this memo is
- unlimited.
-
-Abstract
-
- This memo suggests a file format to be used to inform multiple mail
- reading user agent programs about the locally-installed facilities
- for handling mail in various formats. The mechanism is explicitly
- designed to work with mail systems based Internet mail as defined by
- RFC's 821 (STD 10), 822 (STD 11), 934, 1049 (STD 11), 1113, and the
- Multipurpose Internet Mail Extensions, known as MIME. However, with
- some extensions it could probably be made to work for X.400-based
- mail systems as well. The format and mechanism are proposed in a
- manner that is generally operating-system independent. However,
- certain implementation details will inevitably reflect operating
- system differences, some of which will have to be handled in a
- uniform manner for each operating system. This memo makes such
- situations explicit, and, in an appendix, suggests a standard
- behavior under the UNIX operating system.
-
-Introduction
-
- The electronic mail world is in the midst of a transition from
- single-part text-only mail to multi-part, multi-media mail. In
- support of this transition, various extensions to RFC 821 and RFC 822
- have been proposed and/or adopted, notably including MIME [RFC-1521].
- Various parties have demonstrated extremely high-functionality
- multimedia mail, but the problem of mail interchange between
- different user agents has been severe. In general, only text
- messages have been shared between user agents that were not
- explicitly designed to work together. This limitation is not
- compatible with a smooth transition to a multi-media mail world.
-
- One approach to this transition is to modify diverse sets of mail
- reading user agents so that, when they need to display mail of an
- unfamiliar (non-text) type, they consult an external file for
- information on how to display that file. That file might say, for
-
-
-
-Borenstein [Page 1]
-
-RFC 1524 Multimedia Mail Configuration September 1993
-
-
- example, that if the content-type of a message is "foo" it can be
- displayed to the user via the "displayfoo" program.
-
- This approach means that, with a one-time modification, a wide
- variety of mail reading programs can be given the ability to display
- a wide variety of types of message. Moreover, extending the set of
- media types supported at a site becomes a simple matter of installing
- a binary and adding a single line to a configuration file. Crucial
- to this scheme, however, is that all of the user agents agree on a
- common representation and source for the configuration file. This
- memo proposes such a common representation.
-
-Location of Configuration Information
-
- Each user agent must clearly obtain the configuration information
- from a common location, if the same information is to be used to
- configure all user agents. However, individual users should be able
- to override or augment a site's configuration. The configuration
- information should therefore be obtained from a designated set of
- locations. The overall configuration will be obtained through the
- virtual concatenation of several individual configuration files known
- as mailcap files. The configuration information will be obtained
- from the FIRST matching entry in a mailcap file, where "matching"
- depends on both a matching content-type specification, an entry
- containing sufficient information for the purposes of the application
- doing the searching, and the success of any test in the "test="
- field, if present.
-
- The precise location of the mailcap files is operating-system
- dependent. A standard location for UNIX is specified in Appendix A.
-
-Overall Format of a Mailcap File
-
- Each mailcap file consists of a set of entries that describe the
- proper handling of one media type at the local site.
-
- For example, one line might tell how to display a message in Group
- III fax format. A mailcap file consists of a sequence of such
- individual entries, separated by newlines (according to the operating
- system's newline conventions). Blank lines and lines that start with
- the "#" character (ASCII 35) are considered comments, and are
- ignored. Long entries may be continued on multiple lines if each
- non-terminal line ends with a backslash character ('\', ASCII 92), in
- which case the multiple lines are to be treated as a single mailcap
- entry. Note that for such "continued" lines, the backslash must be
- the last character on the line to be continued.
-
-
-
-
-
-Borenstein [Page 2]
-
-RFC 1524 Multimedia Mail Configuration September 1993
-
-
- Thus the overall format of a mailcap file is given, in the modified
- BNF of RFC 822, as:
-
- Mailcap-File = *Mailcap-Line
-
- Mailcap-Line = Comment / Mailcap-Entry
-
- Comment = NEWLINE / "#" *CHAR NEWLINE
-
- NEWLINE = <newline as defined by OS convention>
-
- Note that the above specification implies that comments must appear
- on lines all to themselves, with a "#" character as the first
- character on each comment line.
-
-Format of a Mailcap Entry
-
- Each mailcap entry consists of a number of fields, separated by
- semi-colons. The first two fields are required, and must occur in
- the specified order. The remaining fields are optional, and may
- appear in any order.
-
- The first field is the content-type, which indicates the type of data
- this mailcap entry describes how to handle. It is to be matched
- against the type/subtype specification in the "Content-Type" header
- field of an Internet mail message. If the subtype is specified as
- "*", it is intended to match all subtypes of the named content-type.
-
- The second field, view-command, is a specification of how the message
- or body part can be viewed at the local site. Although the syntax of
- this field is fully specified, the semantics of program execution are
- necessarily somewhat operating system dependent. UNIX semantics are
- given in Appendix A.
-
- The optional fields, which may be given in any order, are as follows:
-
- -- The "compose" field may be used to specify a program that can be
- used to compose a new body or body part in the given format. Its
- intended use is to support mail composing agents that support the
- composition of multiple types of mail using external composing
- agents. As with the view-command, the semantics of program
- execution are operating system dependent, with UNIX semantics
- specified in Appendix A. The result of the composing program may
- be data that is not yet suitable for mail transport -- that is, a
- Content-Transfer-Encoding may need to be applied to the data.
-
- -- The "composetyped" field is similar to the "compose" field, but is
- to be used when the composing program needs to specify the
-
-
-
-Borenstein [Page 3]
-
-RFC 1524 Multimedia Mail Configuration September 1993
-
-
- Content-type header field to be applied to the composed data. The
- "compose" field is simpler, and is preferred for use with existing
- (non-mail-oriented) programs for composing data in a given format.
- The "composetyped" field is necessary when the Content-type
- information must include auxilliary parameters, and the
- composition program must then know enough about mail formats to
- produce output that includes the mail type information.
-
- -- The "edit" field may be used to specify a program that can be used
- to edit a body or body part in the given format. In many cases,
- it may be identical in content to the "compose" field, and shares
- the operating-system dependent semantics for program execution.
-
- -- The "print" field may be used to specify a program that can be
- used to print a message or body part in the given format. As with
- the view-command, the semantics of program execution are operating
- system dependent, with UNIX semantics specified in Appendix A.
-
- -- The "test" field may be used to test some external condition
- (e.g., the machine architecture, or the window system in use) to
- determine whether or not the mailcap line applies. It specifies a
- program to be run to test some condition. The semantics of
- execution and of the value returned by the test program are
- operating system dependent, with UNIX semantics specified in
- Appendix A. If the test fails, a subsequent mailcap entry should
- be sought. Multiple test fields are not permitted -- since a test
- can call a program, it can already be arbitrarily complex.
-
- -- The "needsterminal" field indicates that the view-command must be
- run on an interactive terminal. This is needed to inform window-
- oriented user agents that an interactive terminal is needed. (The
- decision is not left exclusively to the view-command because in
- some circumstances it may not be possible for such programs to
- tell whether or not they are on interactive terminals.) The
- needsterminal command should be assumed to apply to the compose
- and edit commands, too, if they exist. Note that this is NOT a
- test -- it is a requirement for the environment in which the
- program will be executed, and should typically cause the creation
- of a terminal window when not executed on either a real terminal
- or a terminal window.
-
- -- The "copiousoutput" field indicates that the output from the
- view-command will be an extended stream of output, and is to be
- interpreted as advice to the UA (User Agent mail-reading program)
- that the output should be either paged or made scrollable. Note
- that it is probably a mistake if needsterminal and copiousoutput
- are both specified.
-
-
-
-
-Borenstein [Page 4]
-
-RFC 1524 Multimedia Mail Configuration September 1993
-
-
- -- The "description" field simply provides a textual description,
- optionally quoted, that describes the type of data, to be used
- optionally by mail readers that wish to describe the data before
- offering to display it.
-
- -- The "textualnewlines" field, if set to any non-zero value,
- indicates that this type of data is line-oriented and that, if
- encoded in base64, all newlines should be converted to canonical
- form (CRLF) before encoding, and will be in that form after
- decoding. In general, this field is needed only if there is
- line-oriented data of some type other than text/* or non-line-
- oriented data that is a subtype of text.
-
- -- The "x11-bitmap" field names a file, in X11 bitmap (xbm) format,
- which points to an appropriate icon to be used to visually denote
- the presence of this kind of data.
-
- -- The "nametemplate" field gives a file name format, in which %s
- will be replaced by a short unique string to give the name of the
- temporary file to be passed to the viewing command. This is only
- expected to be relevant in environments where filename extensions
- are meaningful, e.g., one coulld specify that a GIF file being
- passed to a gif viewer should have a name eding in ".gif" by using
- "nametemplate=%s.gif".
-
- Any other fields beginning with "x-" may be included for local or
- mailer-specific extensions of this format. Implementations should
- simply ignore all such unrecognized fields to permit such extensions,
- some of which might be standardized in a future version of this
- document.
-
- Some of the fields above, such as "needsterminal", apply to the
- actions of the view-command, edit-command, and compose-command,
- alike. In some unusual cases, this may not be desirable, but
- differentiation can be accomplished via separate mailcap entries,
- taking advantage of the fact that subsequent mailcap entries are
- searched if an earlier mailcap entry does not provide enough
- information:
-
- application/postscript; ps-to-terminal %s;\ needsterminal
- application/postscript; ps-to-terminal %s; \compose=idraw %s
-
- In RFC 822 modified BNF, the following grammar describes a mailcap
- entry:
-
-
-
-
-
-
-
-Borenstein [Page 5]
-
-RFC 1524 Multimedia Mail Configuration September 1993
-
-
- Mailcap-Entry = typefield ; view-command
- [";" 1#field]
-
- typefield = propertype / implicit-wild
-
- propertype = type "/" wildsubtype
-
- implicitwild = type
-
- wildsubtype = subtype / "*"
-
- view-command = mtext
-
- mtext = *mchar
-
- mchar = schar / qchar
-
- schar = * <any CHAR except ";","\", and CTLS>
-
- qchar = "\" CHAR ; may quote any char
-
- field = flag / namedfield
-
- namedfield = fieldname "=" mtext
-
- flag = "needsterminal" ; All these literals are to
- / "copiousoutput" ; be interpreted as
- / x-token ; case-insensitive
-
- fieldname = / "compose" ;Also all of these
- / "composetyped" ;are case-insensitive.
- / "print"
- / "edit"
- / "test"
- / "x11-bitmap"
- / "textualnewlines"
- / "description"
- / x-token
-
- Note that "type", "subtype", and "x-token" are defined in MIME. Note
- also that while the definition of "schar" includes the percent sign,
- "%", this character has a special meaning in at least the UNIX
- semantics, and will therefore need to be quoted as a qchar to be used
- literally.
-
-
-
-
-
-
-
-Borenstein [Page 6]
-
-RFC 1524 Multimedia Mail Configuration September 1993
-
-
-Acknowledgements
-
- The author wishes to thank Malcolm Bjorn Gillies, Dan Heller, Olle
- Jaernefors, Keith Moore, Luc Rooijakkers, and the other members of
- the IETF task force on mail extensions for their comments on earlier
- versions of this draft. If other acknowledgements were neglected,
- please let me know, as it was surely accidental.
-
-Security Considerations
-
- Security issues are not discussed in this memo. However, the use of
- the mechanisms described in this memo can make it easier for
- implementations to slip into the kind of security problems discussed
- in the MIME document. Implementors and mailcap administrators should
- be aware of these security considerations, and in particular should
- exercise caution in the choice of programs to be listed in a mailcap
- file for automatic execution.
-
-Author's Address
-
- Nathaniel S. Borenstein
- MRE 2D-296, Bellcore
- 445 South St.
- Morristown, NJ 07962-1910
-
- EMail: nsb at bellcore.com
- Phone: +1 201 829 4270
- Fax: +1 201 829 7019
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Borenstein [Page 7]
-
-RFC 1524 Multimedia Mail Configuration September 1993
-
-
-Appendix A: Implementation Details for UNIX
-
- Although this memo fully specifies a syntax for "mailcap" files, the
- semantics of the mailcap file are of necessity operating-system
- dependent in four respects. In order to clarify the intent, and to
- promote a standard usage, this appendix proposes a UNIX semantics for
- these four cases. If a mailcap mechanism is implemented on non-UNIX
- systems, similar semantic decisions should be made and published.
-
-Location of the Mailcap File(s)
-
- For UNIX, a path search of mailcap files is specified. The default
- path search is specified as including at least the following:
-
- $HOME/.mailcap:/etc/mailcap:/usr/etc/mailcap:/usr/local/etc/mailcap
-
- However, this path may itself be overridden by a path specified by
- the MAILCAPS environment variable.
-
-Semantics of executable commands
-
- Several portions of a mailcap entry specify commands to be executed.
- In particular, the mandatory second fie ld, the view-command, takes a
- command to be executed, as do the optional print, edit, test, and
- compose fields.
-
- On a UNIX system, such commands will each be a full shell command
- line, including the path name for a program and its arguments.
- (Because of differences in shells and the implementation and behavior
- of the same shell from one system to another, it is specified that
- the command line be intended as input to the Bourne shell, i.e., that
- it is implicitly preceded by "/bin/sh -c " on the command line.)
-
- The two characters "%s", if used, will be replaced by the name of a
- file for the actual mail body data. In the case of the edit adn
- view-command, the body part will be passed to this command as
- standard input unless one or more instances of "%s" appear in the
- view-command, in which case %s will be replaced by the name of a file
- containing the body part, a file which may have to be created before
- the view-command program is executed. (Such files cannot be presumed
- to continue to exist after the view-command program exits. Thus a
- view-command that wishes to exit and continue processing in the
- background should take care to save the data first.) In the case of
- the compose and composetyped commands, %s should be replaced by the
- name of a file to which the composed data should be written by the
- programs named in the compose or composedtyped commands. Thus, the
- calling program will look in that file later in order to retrieve the
- composed data. If %s does not appear in the compose or composetyped
-
-
-
-Borenstein [Page 8]
-
-RFC 1524 Multimedia Mail Configuration September 1993
-
-
- commands, then the composed data will be assumed to be written by the
- composing programs to standard output.
-
- Furthermore, any occurrence of "%t" will be replaced by the content-
- type and subtype specification. (That is, if the content-type is
- "text/plain", then %t will be replaced by "text/plain".) A literal %
- character may be quoted as \%. Finally, named parameters from the
- Content-type field may be placed in the command execution line using
- "%{" followed by the parameter name and a closing "}" character. The
- entire parameter should appear as a single command line argument,
- regardless of embedded spaces. Thus, if the message has a Content-
- type line of:
-
- Content-type: multipart/mixed; boundary=42
-
- and the mailcap file has a line of:
-
- multipart/*; /usr/local/bin/showmulti \
- %t %{boundary}
-
- then the equivalent of the following command should be
- executed:
-
- /usr/local/bin/showmulti multipart/mixed 42
-
- If the content-type is "multipart" (any subtype), then the two
- characters "%n" will be replaced by an integer giving the number of
- sub-parts within the multipart entity. Also, the two characters "%F"
- will be replaced by a set of arguments, twice as many arguments as
- the number of sub-parts, consisting of alternating content-types and
- file names for each part in turn. Thus if multipart entity has three
- parts, "%F" will be replaced by the equivalent of "content-type1
- file-name1 content-type2 file-name2 content-type3 file-name3".
-
-Semantics of the "test" field
-
- The "test" field specifies a program to be used to test whether or
- not the current mailcap line applies. This can be used, for example,
- to have a mailcap line that only applies if the X window system is
- running, or if the user is running on a SPARCstation with a
- /dev/audio. The value of the "test" field is a program to run to
- test such a condition. The precise program to run and arguments to
- give it are determined as specified in the previous section. The
- test program should return an exit code of zero if the condition is
- true, and a non-zero code otherwise.
-
-
-
-
-
-
-Borenstein [Page 9]
-
-RFC 1524 Multimedia Mail Configuration September 1993
-
-
-Semantics of the "compose" field
-
- On UNIX, the composing program is expected to produce a data stream
- for such a body part as its standard output. The program will be
- executed with the command line arguments determined as specified
- above. The data returned via its standard output will be given a
- Content-Type field that has no supplementary parameters. For
- example, the following mailcap entry:
-
- audio/basic; /usr/local/bin/showaudio %t
- compose = /usr/local/bin/recordaudio
-
- would result in tagging the data composed by the "recordaudio"
- program as:
-
- Content-Type: audio/basic
-
- If this is unacceptable -- for example, in the case of multipart mail
- a "boundary" parameter is required -- then the "compose" field cannot
- be used. Instead, the "composetyped" field should be used in the
- mailcap file.
-
-Semantics of the "composetyped" field
-
- The "composetyped" filed is much like the "compose" field, except
- that it names a composition program that produces, not raw data, but
- data that includes a MIME-conformant type specification. The program
- will be executed with the command line arguments determined as
- specified above. The data returned via its standard output must
- begin with a Content-Type header, followed optionally by other
- Content-* headers, and then by a blank line and the data. For
- example, the following mailcap entry:
-
- multipart/mixed; /usr/local/bin/showmulti %t \
- %{boundary}; \
- composetyped = /usr/local/bin/makemulti
-
- would result in executing the "makemulti" program, which would be
- expected to begin its output with a line of the form:
-
- Content-Type: multipart/mixed; boundary=foobar
-
- Note that a composition program need not encode binary data in base64
- or quoted-printable. It remains the responsibility of the software
- calling the composition program to encode such data as necessary.
- However, if a composing program does encode data, which is not
- encouraged, it should announce that fact using a Content-Transfer-
- Encoding header in the standard manner defined by MIME. Because such
-
-
-
-Borenstein [Page 10]
-
-RFC 1524 Multimedia Mail Configuration September 1993
-
-
- encodings must be announced by such a header, they are an option only
- for composetyped programs, not for compose programs.
-
-Appendix B: Sample Mailcap File
-
- The following is an example of a mailcap file for UNIX that
- demonstrates most of the syntax above. It contains explanatory
- comments where necessary.
-
- # Mailcap file for Bellcore lab 214.
- #
- # The next line sends "richtext" to the richtext
- program
- text/richtext; richtext %s; copiousoutput
- #
- # Next, basic u-law audio
- audio/*; showaudio; test=/usr/local/bin/hasaudio
- #
- # Next, use the xview program to handle several image
- formats
- image/*; xview %s; test=/usr/local/bin/RunningX
- #
- # The ATOMICMAIL interpreter uses curses, so needs a
- terminal
- application/atomicmail; /usr/local/bin/atomicmail %s; \
- needsterminal
- #
- # The next line handles Andrew format,
- # if ez and ezview are installed
- x-be2; /usr/andrew/bin/ezview %s; \
- print=/usr/andrew/bin/ezprint %s ; \
- compose=/usr/andrew/bin/ez -d %s \;
- edit=/usr/andrew/bin/ez -d %s; \;
- copiousoutput
- #
- # The next silly example demonstrates the use of
- quoting
- application/*; echo "This is \"%t\" but \
- is 50 \% Greek to me" \; cat %s; copiousoutput
-
-
-
-
-
-
-
-
-
-
-
-
-Borenstein [Page 11]
-
-RFC 1524 Multimedia Mail Configuration September 1993
-
-
-Appendix C: A Note on Format Translation
-
- It has been suggested that another function of a mailcap-like
- mechanism might be to specify the locally available tools for
- document format translation. For example, the file could designate a
- program for translating from format A to format B, another for
- translating from format B to format C, and finally a mechanism for
- displaying format C. Although this mechanism would be somewhat
- richer than the current mailcap file, and might conceivably also have
- utility at the message transport layer, it significantly complicates
- the processing effort necessary for a user agent that simply wants to
- display a message in format A. Using the current, simpler, mailcap
- scheme, a single line could tell such a user agent to display A-
- format mail using a pipeline of translators and the C-format viewer.
- This memo resists the temptation to complicate the necessary
- processing for a user agent to accomplish this task. Using the
- mailcap format defined here, it is only necessary to find the correct
- single line in a mailcap file, and to execute the command given in
- that line.
-
-References
-
- [RFC-822] Crocker, D., "Standard for the format of ARPA Internet
- text messages", STD 11, RFC 822, UDEL, August 1982.
-
- [RFC-1521] Borenstein, N., and N. Freed, "MIME (Multipurpose
- Internet Mail Extensions) Part One: Mechanisms for Specifying and
- Describing the Format of Internet Message Bodies", RFC 1521,
- Bellcore, Innosoft, September 1993.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Borenstein [Page 12]
-
\ No newline at end of file
diff --git a/reference/rfc1652 SMTP Service Extension for 8bit-MIMEtransport.txt b/reference/rfc1652 SMTP Service Extension for 8bit-MIMEtransport.txt
deleted file mode 100644
index 67c2bae..0000000
--- a/reference/rfc1652 SMTP Service Extension for 8bit-MIMEtransport.txt
+++ /dev/null
@@ -1,339 +0,0 @@
-
-
-
-
-
-
-Network Working Group J. Klensin, WG Chair
-Request for Comments: 1652 MCI
-Obsoletes: 1426 N. Freed, Editor
-Category: Standards Track Innosoft
- M. Rose
- Dover Beach Consulting, Inc.
- E. Stefferud
- Network Management Associates, Inc.
- D. Crocker
- Silicon Graphics, Inc.
- July 1994
-
-
- SMTP Service Extension for 8bit-MIMEtransport
-
-Status of this Memo
-
- This document specifies an Internet standards track protocol for the
- Internet community, and requests discussion and suggestions for
- improvements. Please refer to the current edition of the "Internet
- Official Protocol Standards" (STD 1) for the standardization state
- and status of this protocol. Distribution of this memo is unlimited.
-
-Abstract
-
- This memo defines an extension to the SMTP service whereby an SMTP
- content body consisting of text containing octets outside of the US-
- ASCII octet range (hex 00-7F) may be relayed using SMTP.
-
-1. Introduction
-
- Although SMTP is widely and robustly deployed, various extensions
- have been requested by parts of the Internet community. In
- particular, a significant portion of the Internet community wishes to
- exchange messages in which the content body consists of a MIME
- message [3] containing arbitrary octet-aligned material. This memo
- uses the mechanism described in [5] to define an extension to the
- SMTP service whereby such contents may be exchanged. Note that this
- extension does NOT eliminate the possibility of an SMTP server
- limiting line length; servers are free to implement this extension
- but nevertheless set a line length limit no lower than 1000 octets.
- Given that this restriction still applies, this extension does NOT
- provide a means for transferring unencoded binary via SMTP.
-
-
-
-
-
-
-
-
-Klensin, Freed, Rose, Stefferud & Crocker [Page 1]
-
-RFC 1652 SMTP 8bit-MIMEtransport July 1994
-
-
-2. Framework for the 8bit MIME Transport Extension
-
- The 8bit MIME transport extension is laid out as follows:
-
- (1) the name of the SMTP service extension defined here is
- 8bit-MIMEtransport;
-
- (2) the EHLO keyword value associated with the extension is
- 8BITMIME;
-
- (3) no parameter is used with the 8BITMIME EHLO keyword;
-
- (4) one optional parameter using the keyword BODY is added to
- the MAIL FROM command. The value associated with this
- parameter is a keyword indicating whether a 7bit message
- (in strict compliance with [1]) or a MIME message (in
- strict compliance with [3]) with arbitrary octet content
- is being sent. The syntax of the value is as follows,
- using the ABNF notation of [2]:
-
- body-value ::= "7BIT" / "8BITMIME"
-
- (5) no additional SMTP verbs are defined by this extension;
- and,
-
- (6) the next section specifies how support for the extension
- affects the behavior of a server and client SMTP.
-
-3. The 8bit-MIMEtransport service extension
-
- When a client SMTP wishes to submit (using the MAIL command) a
- content body consisting of a MIME message containing arbitrary lines
- of octet-aligned material, it first issues the EHLO command to the
- server SMTP. If the server SMTP responds with code 250 to the EHLO
- command, and the response includes the EHLO keyword value 8BITMIME,
- then the server SMTP is indicating that it supports the extended MAIL
- command and will accept MIME messages containing arbitrary octet-
- aligned material.
-
- The extended MAIL command is issued by a client SMTP when it wishes
- to transmit a content body consisting of a MIME message containing
- arbitrary lines of octet-aligned material. The syntax for this
- command is identical to the MAIL command in [1], except that a BODY
- parameter must appear after the address. Only one BODY parameter may
- be used in a single MAIL command.
-
-
-
-
-
-
-Klensin, Freed, Rose, Stefferud & Crocker [Page 2]
-
-RFC 1652 SMTP 8bit-MIMEtransport July 1994
-
-
- The complete syntax of this extended command is defined in [5]. The
- esmtp-keyword is BODY and the syntax for esmtp-value is given by the
- syntax for body-value shown above.
-
- The value associated with the BODY parameter indicates whether the
- content body which will be passed using the DATA command consists of
- a MIME message containing some arbitrary octet-aligned material
- ("8BITMIME") or is encoded entirely in accordance with [1] ("7BIT").
-
- A server which supports the 8-bit MIME transport service extension
- shall preserve all bits in each octet passed using the DATA command.
-
- Naturally, the usual SMTP data-stuffing algorithm applies so that a
- content which contains the five-character sequence of
-
- <CR> <LF> <DOT> <CR> <LF>
-
- or a content that begins with the three-character sequence of
-
- <DOT> <CR> <LF>
-
- does not prematurely terminate the transfer of the content. Further,
- it should be noted that the CR-LF pair immediately preceeding the
- final dot is considered part of the content. Finally, although the
- content body contains arbitrary lines of octet-aligned material, the
- length of each line (number of octets between two CR-LF pairs), is
- still subject to SMTP server line length restrictions (which may
- allow as few as 1000 octets on a single line). This restriction means
- that this extension MAY provide the necessary facilities for
- transferring a MIME object with the 8BIT content-transfer-encoding,
- it DOES NOT provide a means of transferring an object with the BINARY
- content-transfer-encoding.
-
- Once a server SMTP supporting the 8bit-MIMEtransport service
- extension accepts a content body containing octets with the high-
- order (8th) bit set, the server SMTP must deliver or relay the
- content in such a way as to preserve all bits in each octet.
-
- If a server SMTP does not support the 8-bit MIME transport extension
- (either by not responding with code 250 to the EHLO command, or by
- not including the EHLO keyword value 8BITMIME in its response), then
- the client SMTP must not, under any circumstances, attempt to
- transfer a content which contains characters outside the US-ASCII
- octet range (hex 00-7F).
-
- A client SMTP has two options in this case: first, it may implement a
- gateway transformation to convert the message into valid 7bit MIME,
- or second, or may treat this as a permanent error and handle it in
-
-
-
-Klensin, Freed, Rose, Stefferud & Crocker [Page 3]
-
-RFC 1652 SMTP 8bit-MIMEtransport July 1994
-
-
- the usual manner for delivery failures. The specifics of the
- transformation from 8bit MIME to 7bit MIME are not described by this
- RFC; the conversion is nevertheless constrained in the following
- ways:
-
- (1) it must cause no loss of information; MIME transport
- encodings must be employed as needed to insure this is
- the case, and
-
- (2) the resulting message must be valid 7bit MIME.
-
-4. Usage Example
-
- The following dialogue illustrates the use of the 8bit-MIMEtransport
- service extension:
-
- S: <wait for connection on TCP port 25>
- C: <open connection to server>
- S: 220 dbc.mtview.ca.us SMTP service ready
- C: EHLO ymir.claremont.edu
- S: 250-dbc.mtview.ca.us says hello
- S: 250 8BITMIME
- C: MAIL FROM:<ned at ymir.claremont.edu> BODY=8BITMIME
- S: 250 <ned at ymir.claremont.edu>... Sender and 8BITMIME ok
- C: RCPT TO:<mrose at dbc.mtview.ca.us>
- S: 250 <mrose at dbc.mtview.ca.us>... Recipient ok
- C: DATA
- S: 354 Send 8BITMIME message, ending in CRLF.CRLF.
- ...
- C: .
- S: 250 OK
- C: QUIT
- S: 250 Goodbye
-
-5. Security Considerations
-
- This RFC does not discuss security issues and is not believed to
- raise any security issues not already endemic in electronic mail and
- present in fully conforming implementations of [1].
-
-6. Acknowledgements
-
- This document represents a synthesis of the ideas of many people and
- reactions to the ideas and proposals of others. Randall Atkinson,
- Craig Everhart, Risto Kankkunen, and Greg Vaudreuil contributed ideas
- and text sufficient to be considered co-authors. Other important
- suggestions, text, or encouragement came from Harald Alvestrand, Jim
- Conklin, Mark Crispin, Frank da Cruz, 'Olafur Gudmundsson, Per
-
-
-
-Klensin, Freed, Rose, Stefferud & Crocker [Page 4]
-
-RFC 1652 SMTP 8bit-MIMEtransport July 1994
-
-
- Hedeland, Christian Huitma, Neil Katin, Eliot Lear, Harold A.
- Miller, Keith Moore, Dan Oscarsson, Julian Onions, Neil Rickert, John
- Wagner, Rayan Zachariassen, and the contributions of the entire IETF
- SMTP Working Group. Of course, none of the individuals are
- necessarily responsible for the combination of ideas represented
- here. Indeed, in some cases, the response to a particular criticism
- was to accept the problem identification but to include an entirely
- different solution from the one originally proposed.
-
-7. References
-
- [1] Postel, J., "Simple Mail Transfer Protocol", STD 10, RFC 821,
- USC/Information Sciences Institute, August 1982.
-
- [2] Crocker, D., "Standard for the Format of ARPA Internet Text
- Messages", STD 11, RFC 822, UDEL, August 1982.
-
- [3] Borenstein, N., and N. Freed, "Multipurpose Internet Mail
- Extensions", RFC 1521, Bellcore, Innosoft, September 1993.
-
- [4] Moore, K., "Representation of Non-ASCII Text in Internet Message
- Headers", RFC 1522, University of Tennessee, September 1993.
-
- [5] Klensin, J., Freed, N., Rose, M., Stefferud, E., and D. Crocker,
- "SMTP Service Extensions", RFC 1651, MCI, Innosoft, Dover Beach
- Consulting, Inc., Network Management Associates, Inc., Silicon
- Graphics, Inc., July 1994.
-
- [6] Partridge, C., "Mail Routing and the Domain System", STD 14, RFC
- 974, BBN, January 1986.
-
-8. Chair, Editor, and Authors' Addresses
-
- John Klensin, WG Chair
- MCI Data Services Division
- 2100 Reston Parkway, 6th floor
- Reston, VA 22091
- USA
-
- Phone:: 1 703 715 7361
- Fax: +1 703 715 7435
- EMail: klensin at mci.net
-
-
-
-
-
-
-
-
-
-Klensin, Freed, Rose, Stefferud & Crocker [Page 5]
-
-RFC 1652 SMTP 8bit-MIMEtransport July 1994
-
-
- Ned Freed, Editor
- Innosoft International, Inc.
- 1050 East Garvey Avenue South
- West Covina, CA 91790
- USA
-
- Phone:: +1 818 919 3600
- Fax: +1 818 919 3614
- EMail: ned at innosoft.com
-
-
- Marshall T. Rose
- Dover Beach Consulting, Inc.
- 420 Whisman Court
- Moutain View, CA 94043-2186
- USA
-
- Phone: +1 415 968 1052
- Fax: +1 415 968 2510
- EMail: mrose at dbc.mtview.ca.us
-
-
- Einar A. Stefferud
- Network Management Associates, Inc.
- 17301 Drey Lane
- Huntington Beach, CA, 92647-5615
- USA
-
- Phone: +1 714 842 3711
- Fax: +1 714 848 2091
- EMail: stef at nma.com
-
-
- Dave Crocker
- Silicon Graphics, Inc.
- 2011 N. Shoreline Blvd.
- P.O. Box 7311
- Mountain View, CA 94039
- USA
-
- Phone: +1 415 390 1804
- Fax: +1 415 962 8404
- EMail: dcrocker at sgi.com
-
-
-
-
-
-
-
-
-Klensin, Freed, Rose, Stefferud & Crocker [Page 6]
-
\ No newline at end of file
diff --git a/reference/rfc1892 Multipart Report .txt b/reference/rfc1892 Multipart Report .txt
deleted file mode 100644
index c4bdbd5..0000000
--- a/reference/rfc1892 Multipart Report .txt
+++ /dev/null
@@ -1,227 +0,0 @@
-
-
-
-
-
-
-Network Working Group G. Vaudreuil
-Request for Comments: 1892 Octel Network Services
-Category: Standards Track January 1996
-
-
- The Multipart/Report Content Type
- for the Reporting of
- Mail System Administrative Messages
-
-Status of this Memo
-
- This document specifies an Internet standards track protocol for the
- Internet community, and requests discussion and suggestions for
- improvements. Please refer to the current edition of the "Internet
- Official Protocol Standards" (STD 1) for the standardization state
- and status of this protocol. Distribution of this memo is unlimited.
-
-1. The Multipart/Report MIME content-type
-
- The Multipart/Report MIME content-type is a general "family" or
- "container" type for electronic mail reports of any kind. Although
- this memo defines only the use of the Multipart/Report content-type
- with respect to delivery status reports, mail processing programs
- will benefit if a single content-type is used to for all kinds of
- reports.
-
- The Multipart/Report content-type is defined as follows:
-
- MIME type name: multipart
- MIME subtype name: report
- Required parameters: boundary, report-type
- Optional parameters: none
- Encoding considerations: 7bit should always be adequate
- Security considerations: see section 4 of this memo.
-
- The syntax of Multipart/Report is identical to the Multipart/Mixed
- content type defined in [MIME]. When used to send a report, the
- Multipart/Report content-type must be the top-level MIME content type
- for any report message. The report-type parameter identifies the
- type of report. The parameter is the MIME content sub-type of the
- second body part of the Multipart/Report.
-
- User agents and gateways must be able to automatically determine
- that a message is a mail system report and should be processed as
- such. Placing the Multipart/Report as the outermost content
- provides a mechanism whereby an auto-processor may detect through
- parsing the RFC 822 headers that the message is a report.
-
-
-
-
-Vaudreuil Standards Track [Page 1]
-
-RFC 1892 Multipart/Report January 1996
-
-
- The Multipart/Report content-type contains either two or three sub-
- parts, in the following order:
-
- (1) [required] The first body part contains human readable message.
- The purpose of this message is to provide an easily-understood
- description of the condition(s) that caused the report to be
- generated, for a human reader who may not have an user agent
- capable of interpreting the second section of the
- Multipart/Report.
-
- The text in the first section may be in any MIME standards-track
- content-type, charset, or language. Where a description of the
- error is desired in several languages or several media, a
- Multipart/Alternative construct may be used.
-
- This body part may also be used to send detailed information
- that cannot be easily formatted into a Message/Report body part.
-
- (2) [required] A machine parsable body part containing an account
- of the reported message handling event. The purpose of this body
- part is to provide a machine-readable description of the
- condition(s) which caused the report to be generated, along with
- details not present in the first body part that may be useful to
- human experts. An initial body part, Message/delivery-status is
- defined in [DSN]
-
- (3) [optional] A body part containing the returned message or a
- portion thereof. This information may be useful to aid human
- experts in diagnosing problems. (Although it may also be useful
- to allow the sender to identify the message which the report was
- issued, it is hoped that the envelope-id and original-recipient-
- address returned in the Message/Report body part will replace
- the traditional use of the returned content for this purpose.)
-
- Return of content may be wasteful of network bandwidth and a variety
- of implementation strategies can be used. Generally the sender
- should choose the appropriate strategy and inform the recipient of
- the required level of returned content required. In the absence of
- an explicit request for level of return of content such as that
- provided in [DRPT], the agent which generated the delivery service
- report should return the full message content.
-
- When data not encoded in 7 bits is to be returned, and the return
- path is not guaranteed to be 8-bit capable, two options are
- available. The origional message MAY be reencoded into a legal 7 bit
- MIME message or the Text/RFC822-Headers content-type MAY be used to
- return only the origional message headers.
-
-
-
-
-Vaudreuil Standards Track [Page 2]
-
-RFC 1892 Multipart/Report January 1996
-
-
-2. The Text/RFC822-Headers MIME content-type
-
- The Text/RFC822-Headers MIME content-type provides a mechanism to
- label and return only the RFC 822 headers of a failed message. These
- headers are not the complete message and should not be returned as a
- Message/RFC822. The returned headers are useful for identifying the
- failed message and for diagnostics based on the received: lines.
-
- The Text/RFC822-Headers content-type is defined as follows:
-
- MIME type name: Text
- MIME subtype name: RFC822-Headers
- Required parameters: None
- Optional parameters: none
- Encoding considerations: 7 bit is sufficient for normal RFC822
- headers, however, if the headers are broken and require
- encoding, they may be encoded in quoted-printable.
- Security considerations: see section 4 of this memo.
-
- The Text/RFC822-headers body part should contain all the RFC822
- header lines from the message which caused the report. The RFC822
- headers include all lines prior to the blank line in the message.
- They include the MIME-Version and MIME Content- headers.
-
-3. References
-
- [DSN] Moore, K., and G. Vaudreuil, "An Extensible Message Format for
- Delivery Status Notifications", RFC 1894, University of
- Tennessee, Octel Network Services, January 1996.
-
- [RFC822] Crocker, D., "Standard for the format of ARPA Internet Text
- Messages", STD 11, RFC 822, UDEL, August 1982.
-
- [MIME] Borenstein, N., and N. Freed, "Multipurpose Internet Mail
- Extensions", RFC 1521, Bellcore, Innosoft, June 1992.
-
- [DRPT] Moore, K., "SMTP Service Extension for Delivery Status
- Notifications", RFC 1891, University of Tennessee, January 1996.
-
-4. Security Considerations
-
- Automated use of report types without authentication presents several
- security issues. Forging negative reports presents the opportunity
- for denial-of-service attacks when the reports are used for automated
- maintenance of directories or mailing lists. Forging positive
- reports may cause the sender to incorrectly believe a message was
- delivered when it was not.
-
-
-
-
-Vaudreuil Standards Track [Page 3]
-
-RFC 1892 Multipart/Report January 1996
-
-
-5. Author's Address
-
- Gregory M. Vaudreuil
- Octel Network Services
- 17060 Dallas Parkway
- Dallas, TX 75248-1905
-
- Phone: +1-214-733-2722
- EMail: Greg.Vaudreuil at Octel.com
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Vaudreuil Standards Track [Page 4]
-
diff --git a/reference/rfc1893 Mail System Status Codes.txt b/reference/rfc1893 Mail System Status Codes.txt
deleted file mode 100644
index 9ca4efb..0000000
--- a/reference/rfc1893 Mail System Status Codes.txt
+++ /dev/null
@@ -1,843 +0,0 @@
-
-
-
-
-
-
-Network Working Group G. Vaudreuil
-Request for Comments: 1893 Octel Network Services
-Category: Standards Track January 1996
-
-
- Enhanced Mail System Status Codes
-
-Status of this Memo
-
- This document specifies an Internet standards track protocol for the
- Internet community, and requests discussion and suggestions for
- improvements. Please refer to the current edition of the "Internet
- Official Protocol Standards" (STD 1) for the standardization state
- and status of this protocol. Distribution of this memo is unlimited.
-
-1. Overview
-
- There currently is not a standard mechanism for the reporting of mail
- system errors except for the limited set offered by SMTP and the
- system specific text descriptions sent in mail messages. There is a
- pressing need for a rich machine readable status code for use in
- delivery status notifications [DSN]. This document proposes a new
- set of status codes for this purpose.
-
- SMTP [SMTP] error codes have historically been used for reporting
- mail system errors. Because of limitations in the SMTP code design,
- these are not suitable for use in delivery status notifications.
- SMTP provides about 12 useful codes for delivery reports. The
- majority of the codes are protocol specific response codes such as
- the 354 response to the SMTP data command. Each of the 12 useful
- codes are each overloaded to indicate several error conditions each.
- SMTP suffers some scars from history, most notably the unfortunate
- damage to the reply code extension mechanism by uncontrolled use.
- This proposal facilitates future extensibility by requiring the
- client to interpret unknown error codes according to the theory of
- codes while requiring servers to register new response codes.
-
- The SMTP theory of reply codes partitioned in the number space such a
- manner that the remaining available codes will not provide the space
- needed. The most critical example is the existence of only 5
- remaining codes for mail system errors. The mail system
- classification includes both host and mailbox error conditions. The
- remaining third digit space would be completely consumed as needed to
- indicate MIME and media conversion errors and security system errors.
-
- A revision to the SMTP theory of reply codes to better distribute the
- error conditions in the number space will necessarily be incompatible
- with SMTP. Further, consumption of the remaining reply-code number
-
-
-
-Vaudreuil Standards Track [Page 1]
-
-RFC 1893 Mail System Status Codes January 1996
-
-
- space for delivery notification reporting will reduce the available
- codes for new ESMTP extensions.
-
- The following proposal is based on the SMTP theory of reply codes.
- It adopts the success, permanent error, and transient error semantics
- of the first value, with a further description and classification in
- the second. This proposal re-distributes the classifications to
- better distribute the error conditions, such as separating mailbox
- from host errors.
-
-2. Status Codes
-
- This document defines a new set of status codes to report mail system
- conditions. These status codes are intended to be used for media and
- language independent status reporting. They are not intended for
- system specific diagnostics.
-
- The syntax of the new status codes is defined as:
-
- status-code = class "." subject "." detail
- class = "2"/"4"/"5"
- subject = 1*3digit
- detail = 1*3digit
-
- White-space characters and comments are NOT allowed within a status-
- code. Each numeric sub-code within the status-code MUST be expressed
- without leading zero digits.
-
- Status codes consist of three numerical fields separated by ".". The
- first sub-code indicates whether the delivery attempt was successful.
- The second sub-code indicates the probable source of any delivery
- anomalies, and the third sub-code indicates a precise error
- condition.
-
- The codes space defined is intended to be extensible only by
- standards track documents. Mail system specific status codes should
- be mapped as close as possible to the standard status codes. Servers
- should send only defined, registered status codes. System specific
- errors and diagnostics should be carried by means other than status
- codes.
-
- New subject and detail codes will be added over time. Because the
- number space is large, it is not intended that published status codes
- will ever be redefined or eliminated. Clients should preserve the
- extensibility of the code space by reporting the general error
- described in the subject sub-code when the specific detail is
- unrecognized.
-
-
-
-
-Vaudreuil Standards Track [Page 2]
-
-RFC 1893 Mail System Status Codes January 1996
-
-
- The class sub-code provides a broad classification of the status.
- The enumerated values the class are defined as:
-
- 2.X.X Success
-
- Success specifies that the DSN is reporting a positive delivery
- action. Detail sub-codes may provide notification of
- transformations required for delivery.
-
- 4.X.X Persistent Transient Failure
-
- A persistent transient failure is one in which the message as
- sent is valid, but some temporary event prevents the successful
- sending of the message. Sending in the future may be successful.
-
- 5.X.X Permanent Failure
-
- A permanent failure is one which is not likely to be resolved by
- resending the message in the current form. Some change to the
- message or the destination must be made for successful delivery.
-
- A client must recognize and report class sub-code even where
- subsequent subject sub-codes are unrecognized.
-
- The subject sub-code classifies the status. This value applies to
- each of the three classifications. The subject sub-code, if
- recognized, must be reported even if the additional detail provided
- by the detail sub-code is not recognized. The enumerated values for
- the subject sub-code are:
-
- X.0.X Other or Undefined Status
-
- There is no additional subject information available.
-
- X.1.X Addressing Status
-
- The address status reports on the originator or destination
- address. It may include address syntax or validity. These
- errors can generally be corrected by the sender and retried.
-
- X.2.X Mailbox Status
-
- Mailbox status indicates that something having to do with the
- mailbox has cause this DSN. Mailbox issues are assumed to be
- under the general control of the recipient.
-
-
-
-
-
-
-Vaudreuil Standards Track [Page 3]
-
-RFC 1893 Mail System Status Codes January 1996
-
-
- X.3.X Mail System Status
-
- Mail system status indicates that something having to do
- with the destination system has caused this DSN. System
- issues are assumed to be under the general control of the
- destination system administrator.
-
- X.4.X Network and Routing Status
-
- The networking or routing codes report status about the
- delivery system itself. These system components include any
- necessary infrastructure such as directory and routing
- services. Network issues are assumed to be under the
- control of the destination or intermediate system
- administrator.
-
- X.5.X Mail Delivery Protocol Status
-
- The mail delivery protocol status codes report failures
- involving the message delivery protocol. These failures
- include the full range of problems resulting from
- implementation errors or an unreliable connection. Mail
- delivery protocol issues may be controlled by many parties
- including the originating system, destination system, or
- intermediate system administrators.
-
- X.6.X Message Content or Media Status
-
- The message content or media status codes report failures
- involving the content of the message. These codes report
- failures due to translation, transcoding, or otherwise
- unsupported message media. Message content or media issues
- are under the control of both the sender and the receiver,
- both of whom must support a common set of supported
- content-types.
-
- X.7.X Security or Policy Status
-
- The security or policy status codes report failures
- involving policies such as per-recipient or per-host
- filtering and cryptographic operations. Security and policy
- status issues are assumed to be under the control of either
- or both the sender and recipient. Both the sender and
- recipient must permit the exchange of messages and arrange
- the exchange of necessary keys and certificates for
- cryptographic operations.
-
-
-
-
-
-Vaudreuil Standards Track [Page 4]
-
-RFC 1893 Mail System Status Codes January 1996
-
-
-3. Enumerated Status Codes
-
- The following section defines and describes the detail sub-code. The
- detail value provides more information about the status and is
- defined relative to the subject of the status.
-
- 3.1 Other or Undefined Status
-
- X.0.0 Other undefined Status
-
- Other undefined status is the only undefined error code. It
- should be used for all errors for which only the class of the
- error is known.
-
- 3.2 Address Status
-
- X.1.0 Other address status
-
- Something about the address specified in the message caused
- this DSN.
-
- X.1.1 Bad destination mailbox address
-
- The mailbox specified in the address does not exist. For
- Internet mail names, this means the address portion to the
- left of the "@" sign is invalid. This code is only useful
- for permanent failures.
-
- X.1.2 Bad destination system address
-
- The destination system specified in the address does not
- exist or is incapable of accepting mail. For Internet mail
- names, this means the address portion to the right of the
- "@" is invalid for mail. This codes is only useful for
- permanent failures.
-
- X.1.3 Bad destination mailbox address syntax
-
- The destination address was syntactically invalid. This can
- apply to any field in the address. This code is only useful
- for permanent failures.
-
- X.1.4 Destination mailbox address ambiguous
-
- The mailbox address as specified matches one or more
- recipients on the destination system. This may result if a
- heuristic address mapping algorithm is used to map the
- specified address to a local mailbox name.
-
-
-
-Vaudreuil Standards Track [Page 5]
-
-RFC 1893 Mail System Status Codes January 1996
-
-
- X.1.5 Destination address valid
-
- This mailbox address as specified was valid. This status
- code should be used for positive delivery reports.
-
- X.1.6 Destination mailbox has moved, No forwarding address
-
- The mailbox address provided was at one time valid, but mail
- is no longer being accepted for that address. This code is
- only useful for permanent failures.
-
- X.1.7 Bad sender's mailbox address syntax
-
- The sender's address was syntactically invalid. This can
- apply to any field in the address.
-
- X.1.8 Bad sender's system address
-
- The sender's system specified in the address does not exist
- or is incapable of accepting return mail. For domain names,
- this means the address portion to the right of the "@" is
- invalid for mail.
-
- 3.3 Mailbox Status
-
- X.2.0 Other or undefined mailbox status
-
- The mailbox exists, but something about the destination
- mailbox has caused the sending of this DSN.
-
- X.2.1 Mailbox disabled, not accepting messages
-
- The mailbox exists, but is not accepting messages. This may
- be a permanent error if the mailbox will never be re-enabled
- or a transient error if the mailbox is only temporarily
- disabled.
-
- X.2.2 Mailbox full
-
- The mailbox is full because the user has exceeded a
- per-mailbox administrative quota or physical capacity. The
- general semantics implies that the recipient can delete
- messages to make more space available. This code should be
- used as a persistent transient failure.
-
-
-
-
-
-
-
-Vaudreuil Standards Track [Page 6]
-
-RFC 1893 Mail System Status Codes January 1996
-
-
- X.2.3 Message length exceeds administrative limit
-
- A per-mailbox administrative message length limit has been
- exceeded. This status code should be used when the
- per-mailbox message length limit is less than the general
- system limit. This code should be used as a permanent
- failure.
-
- X.2.4 Mailing list expansion problem
-
- The mailbox is a mailing list address and the mailing list
- was unable to be expanded. This code may represent a
- permanent failure or a persistent transient failure.
-
- 3.4 Mail system status
-
- X.3.0 Other or undefined mail system status
-
- The destination system exists and normally accepts mail, but
- something about the system has caused the generation of this
- DSN.
-
- X.3.1 Mail system full
-
- Mail system storage has been exceeded. The general
- semantics imply that the individual recipient may not be
- able to delete material to make room for additional
- messages. This is useful only as a persistent transient
- error.
-
- X.3.2 System not accepting network messages
-
- The host on which the mailbox is resident is not accepting
- messages. Examples of such conditions include an immanent
- shutdown, excessive load, or system maintenance. This is
- useful for both permanent and permanent transient errors.
-
- X.3.3 System not capable of selected features
-
- Selected features specified for the message are not
- supported by the destination system. This can occur in
- gateways when features from one domain cannot be mapped onto
- the supported feature in another.
-
-
-
-
-
-
-
-
-Vaudreuil Standards Track [Page 7]
-
-RFC 1893 Mail System Status Codes January 1996
-
-
- X.3.4 Message too big for system
-
- The message is larger than per-message size limit. This
- limit may either be for physical or administrative reasons.
- This is useful only as a permanent error.
-
- X.3.5 System incorrectly configured
-
- The system is not configured in a manner which will permit
- it to accept this message.
-
- 3.5 Network and Routing Status
-
- X.4.0 Other or undefined network or routing status
-
- Something went wrong with the networking, but it is not
- clear what the problem is, or the problem cannot be well
- expressed with any of the other provided detail codes.
-
- X.4.1 No answer from host
-
- The outbound connection attempt was not answered, either
- because the remote system was busy, or otherwise unable to
- take a call. This is useful only as a persistent transient
- error.
-
- X.4.2 Bad connection
-
- The outbound connection was established, but was otherwise
- unable to complete the message transaction, either because
- of time-out, or inadequate connection quality. This is
- useful only as a persistent transient error.
-
- X.4.3 Directory server failure
-
- The network system was unable to forward the message,
- because a directory server was unavailable. This is useful
- only as a persistent transient error.
-
- The inability to connect to an Internet DNS server is one
- example of the directory server failure error.
-
- X.4.4 Unable to route
-
- The mail system was unable to determine the next hop for the
- message because the necessary routing information was
- unavailable from the directory server. This is useful for
- both permanent and persistent transient errors.
-
-
-
-Vaudreuil Standards Track [Page 8]
-
-RFC 1893 Mail System Status Codes January 1996
-
-
- A DNS lookup returning only an SOA (Start of Administration)
- record for a domain name is one example of the unable to
- route error.
-
- X.4.5 Mail system congestion
-
- The mail system was unable to deliver the message because
- the mail system was congested. This is useful only as a
- persistent transient error.
-
- X.4.6 Routing loop detected
-
- A routing loop caused the message to be forwarded too many
- times, either because of incorrect routing tables or a user
- forwarding loop. This is useful only as a persistent
- transient error.
-
- X.4.7 Delivery time expired
-
- The message was considered too old by the rejecting system,
- either because it remained on that host too long or because
- the time-to-live value specified by the sender of the
- message was exceeded. If possible, the code for the actual
- problem found when delivery was attempted should be returned
- rather than this code. This is useful only as a persistent
- transient error.
-
- 3.6 Mail Delivery Protocol Status
-
- X.5.0 Other or undefined protocol status
-
- Something was wrong with the protocol necessary to deliver
- the message to the next hop and the problem cannot be well
- expressed with any of the other provided detail codes.
-
- X.5.1 Invalid command
-
- A mail transaction protocol command was issued which was
- either out of sequence or unsupported. This is useful only
- as a permanent error.
-
- X.5.2 Syntax error
-
- A mail transaction protocol command was issued which could
- not be interpreted, either because the syntax was wrong or
- the command is unrecognized. This is useful only as a
- permanent error.
-
-
-
-
-Vaudreuil Standards Track [Page 9]
-
-RFC 1893 Mail System Status Codes January 1996
-
-
- X.5.3 Too many recipients
-
- More recipients were specified for the message than could
- have been delivered by the protocol. This error should
- normally result in the segmentation of the message into two,
- the remainder of the recipients to be delivered on a
- subsequent delivery attempt. It is included in this list in
- the event that such segmentation is not possible.
-
- X.5.4 Invalid command arguments
-
- A valid mail transaction protocol command was issued with
- invalid arguments, either because the arguments were out of
- range or represented unrecognized features. This is useful
- only as a permanent error.
-
- X.5.5 Wrong protocol version
-
- A protocol version mis-match existed which could not be
- automatically resolved by the communicating parties.
-
- 3.7 Message Content or Message Media Status
-
- X.6.0 Other or undefined media error
-
- Something about the content of a message caused it to be
- considered undeliverable and the problem cannot be well
- expressed with any of the other provided detail codes.
-
- X.6.1 Media not supported
-
- The media of the message is not supported by either the
- delivery protocol or the next system in the forwarding path.
- This is useful only as a permanent error.
-
- X.6.2 Conversion required and prohibited
-
- The content of the message must be converted before it can
- be delivered and such conversion is not permitted. Such
- prohibitions may be the expression of the sender in the
- message itself or the policy of the sending host.
-
- X.6.3 Conversion required but not supported
-
- The message content must be converted to be forwarded but
- such conversion is not possible or is not practical by a
- host in the forwarding path. This condition may result when
- an ESMTP gateway supports 8bit transport but is not able to
-
-
-
-Vaudreuil Standards Track [Page 10]
-
-RFC 1893 Mail System Status Codes January 1996
-
-
- downgrade the message to 7 bit as required for the next hop.
-
- X.6.4 Conversion with loss performed
-
- This is a warning sent to the sender when message delivery
- was successfully but when the delivery required a conversion
- in which some data was lost. This may also be a permanant
- error if the sender has indicated that conversion with loss
- is prohibited for the message.
-
- X.6.5 Conversion Failed
-
- A conversion was required but was unsuccessful. This may be
- useful as a permanent or persistent temporary notification.
-
- 3.8 Security or Policy Status
-
- X.7.0 Other or undefined security status
-
- Something related to security caused the message to be
- returned, and the problem cannot be well expressed with any
- of the other provided detail codes. This status code may
- also be used when the condition cannot be further described
- because of security policies in force.
-
- X.7.1 Delivery not authorized, message refused
-
- The sender is not authorized to send to the destination.
- This can be the result of per-host or per-recipient
- filtering. This memo does not discuss the merits of any
- such filtering, but provides a mechanism to report such.
- This is useful only as a permanent error.
-
- X.7.2 Mailing list expansion prohibited
-
- The sender is not authorized to send a message to the
- intended mailing list. This is useful only as a permanent
- error.
-
- X.7.3 Security conversion required but not possible
-
- A conversion from one secure messaging protocol to another
- was required for delivery and such conversion was not
- possible. This is useful only as a permanent error.
-
-
-
-
-
-
-
-Vaudreuil Standards Track [Page 11]
-
-RFC 1893 Mail System Status Codes January 1996
-
-
- X.7.4 Security features not supported
-
- A message contained security features such as secure
- authentication which could not be supported on the delivery
- protocol. This is useful only as a permanent error.
-
- X.7.5 Cryptographic failure
-
- A transport system otherwise authorized to validate or
- decrypt a message in transport was unable to do so because
- necessary information such as key was not available or such
- information was invalid.
-
- X.7.6 Cryptographic algorithm not supported
-
- A transport system otherwise authorized to validate or
- decrypt a message was unable to do so because the necessary
- algorithm was not supported.
-
- X.7.7 Message integrity failure
-
- A transport system otherwise authorized to validate a
- message was unable to do so because the message was
- corrupted or altered. This may be useful as a permanent,
- transient persistent, or successful delivery code.
-
-4. References
-
- [SMTP] Postel, J., "Simple Mail Transfer Protocol", STD 10, RFC 821,
- USC/Information Sciences Institute, August 1982.
-
- [DSN] Moore, K., and G. Vaudreuil, "An Extensible Message Format for
- Delivery Status Notifications", RFC 1894, University of
- Tennessee, Octel Network Services, January 1996.
-
-5. Security Considerations
-
- This document describes a status code system with increased
- precision. Use of these status codes may disclose additional
- information about how an internal mail system is implemented beyond
- that currently available.
-
-6. Acknowledgments
-
- The author wishes to offer special thanks to Harald Alvestrand, Marko
- Kaittola, and Keith Moore for their extensive review and constructive
- suggestions.
-
-
-
-
-Vaudreuil Standards Track [Page 12]
-
-RFC 1893 Mail System Status Codes January 1996
-
-
-7. Author's Address
-
- Gregory M. Vaudreuil
- Octel Network Services
- 17060 Dallas Parkway
- Suite 214
- Dallas, TX 75248-1905
-
- Voice/Fax: +1-214-733-2722
- EMail: Greg.Vaudreuil at Octel.com
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Vaudreuil Standards Track [Page 13]
-
-RFC 1893 Mail System Status Codes January 1996
-
-
-8. Appendix - Collected Status Codes
-
- X.1.0 Other address status
- X.1.1 Bad destination mailbox address
- X.1.2 Bad destination system address
- X.1.3 Bad destination mailbox address syntax
- X.1.4 Destination mailbox address ambiguous
- X.1.5 Destination mailbox address valid
- X.1.6 Mailbox has moved
- X.1.7 Bad sender's mailbox address syntax
- X.1.8 Bad sender's system address
-
- X.2.0 Other or undefined mailbox status
- X.2.1 Mailbox disabled, not accepting messages
- X.2.2 Mailbox full
- X.2.3 Message length exceeds administrative limit.
- X.2.4 Mailing list expansion problem
-
- X.3.0 Other or undefined mail system status
- X.3.1 Mail system full
- X.3.2 System not accepting network messages
- X.3.3 System not capable of selected features
- X.3.4 Message too big for system
-
- X.4.0 Other or undefined network or routing status
- X.4.1 No answer from host
- X.4.2 Bad connection
- X.4.3 Routing server failure
- X.4.4 Unable to route
- X.4.5 Network congestion
- X.4.6 Routing loop detected
- X.4.7 Delivery time expired
-
- X.5.0 Other or undefined protocol status
- X.5.1 Invalid command
- X.5.2 Syntax error
- X.5.3 Too many recipients
- X.5.4 Invalid command arguments
- X.5.5 Wrong protocol version
-
- X.6.0 Other or undefined media error
- X.6.1 Media not supported
- X.6.2 Conversion required and prohibited
- X.6.3 Conversion required but not supported
- X.6.4 Conversion with loss performed
- X.6.5 Conversion failed
-
-
-
-
-
-Vaudreuil Standards Track [Page 14]
-
-RFC 1893 Mail System Status Codes January 1996
-
-
- X.7.0 Other or undefined security status
- X.7.1 Delivery not authorized, message refused
- X.7.2 Mailing list expansion prohibited
- X.7.3 Security conversion required but not possible
- X.7.4 Security features not supported
- X.7.5 Cryptographic failure
- X.7.6 Cryptographic algorithm not supported
- X.7.7 Message integrity failure
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Vaudreuil Standards Track [Page 15]
-
diff --git a/reference/rfc2045 Multipurpose Internet Mail Extensions (1).txt b/reference/rfc2045 Multipurpose Internet Mail Extensions (1).txt
deleted file mode 100644
index 9f286b1..0000000
--- a/reference/rfc2045 Multipurpose Internet Mail Extensions (1).txt
+++ /dev/null
@@ -1,1739 +0,0 @@
-
-
-
-
-
-
-Network Working Group N. Freed
-Request for Comments: 2045 Innosoft
-Obsoletes: 1521, 1522, 1590 N. Borenstein
-Category: Standards Track First Virtual
- November 1996
-
-
- Multipurpose Internet Mail Extensions
- (MIME) Part One:
- Format of Internet Message Bodies
-
-Status of this Memo
-
- This document specifies an Internet standards track protocol for the
- Internet community, and requests discussion and suggestions for
- improvements. Please refer to the current edition of the "Internet
- Official Protocol Standards" (STD 1) for the standardization state
- and status of this protocol. Distribution of this memo is unlimited.
-
-Abstract
-
- STD 11, RFC 822, defines a message representation protocol specifying
- considerable detail about US-ASCII message headers, and leaves the
- message content, or message body, as flat US-ASCII text. This set of
- documents, collectively called the Multipurpose Internet Mail
- Extensions, or MIME, redefines the format of messages to allow for
-
- (1) textual message bodies in character sets other than
- US-ASCII,
-
- (2) an extensible set of different formats for non-textual
- message bodies,
-
- (3) multi-part message bodies, and
-
- (4) textual header information in character sets other than
- US-ASCII.
-
- These documents are based on earlier work documented in RFC 934, STD
- 11, and RFC 1049, but extends and revises them. Because RFC 822 said
- so little about message bodies, these documents are largely
- orthogonal to (rather than a revision of) RFC 822.
-
- This initial document specifies the various headers used to describe
- the structure of MIME messages. The second document, RFC 2046,
- defines the general structure of the MIME media typing system and
- defines an initial set of media types. The third document, RFC 2047,
- describes extensions to RFC 822 to allow non-US-ASCII text data in
-
-
-
-Freed & Borenstein Standards Track [Page 1]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
- Internet mail header fields. The fourth document, RFC 2048, specifies
- various IANA registration procedures for MIME-related facilities. The
- fifth and final document, RFC 2049, describes MIME conformance
- criteria as well as providing some illustrative examples of MIME
- message formats, acknowledgements, and the bibliography.
-
- These documents are revisions of RFCs 1521, 1522, and 1590, which
- themselves were revisions of RFCs 1341 and 1342. An appendix in RFC
- 2049 describes differences and changes from previous versions.
-
-Table of Contents
-
- 1. Introduction ......................................... 3
- 2. Definitions, Conventions, and Generic BNF Grammar .... 5
- 2.1 CRLF ................................................ 5
- 2.2 Character Set ....................................... 6
- 2.3 Message ............................................. 6
- 2.4 Entity .............................................. 6
- 2.5 Body Part ........................................... 7
- 2.6 Body ................................................ 7
- 2.7 7bit Data ........................................... 7
- 2.8 8bit Data ........................................... 7
- 2.9 Binary Data ......................................... 7
- 2.10 Lines .............................................. 7
- 3. MIME Header Fields ................................... 8
- 4. MIME-Version Header Field ............................ 8
- 5. Content-Type Header Field ............................ 10
- 5.1 Syntax of the Content-Type Header Field ............. 12
- 5.2 Content-Type Defaults ............................... 14
- 6. Content-Transfer-Encoding Header Field ............... 14
- 6.1 Content-Transfer-Encoding Syntax .................... 14
- 6.2 Content-Transfer-Encodings Semantics ................ 15
- 6.3 New Content-Transfer-Encodings ...................... 16
- 6.4 Interpretation and Use .............................. 16
- 6.5 Translating Encodings ............................... 18
- 6.6 Canonical Encoding Model ............................ 19
- 6.7 Quoted-Printable Content-Transfer-Encoding .......... 19
- 6.8 Base64 Content-Transfer-Encoding .................... 24
- 7. Content-ID Header Field .............................. 26
- 8. Content-Description Header Field ..................... 27
- 9. Additional MIME Header Fields ........................ 27
- 10. Summary ............................................. 27
- 11. Security Considerations ............................. 27
- 12. Authors' Addresses .................................. 28
- A. Collected Grammar .................................... 29
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 2]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
-1. Introduction
-
- Since its publication in 1982, RFC 822 has defined the standard
- format of textual mail messages on the Internet. Its success has
- been such that the RFC 822 format has been adopted, wholly or
- partially, well beyond the confines of the Internet and the Internet
- SMTP transport defined by RFC 821. As the format has seen wider use,
- a number of limitations have proven increasingly restrictive for the
- user community.
-
- RFC 822 was intended to specify a format for text messages. As such,
- non-text messages, such as multimedia messages that might include
- audio or images, are simply not mentioned. Even in the case of text,
- however, RFC 822 is inadequate for the needs of mail users whose
- languages require the use of character sets richer than US-ASCII.
- Since RFC 822 does not specify mechanisms for mail containing audio,
- video, Asian language text, or even text in most European languages,
- additional specifications are needed.
-
- One of the notable limitations of RFC 821/822 based mail systems is
- the fact that they limit the contents of electronic mail messages to
- relatively short lines (e.g. 1000 characters or less [RFC-821]) of
- 7bit US-ASCII. This forces users to convert any non-textual data
- that they may wish to send into seven-bit bytes representable as
- printable US-ASCII characters before invoking a local mail UA (User
- Agent, a program with which human users send and receive mail).
- Examples of such encodings currently used in the Internet include
- pure hexadecimal, uuencode, the 3-in-4 base 64 scheme specified in
- RFC 1421, the Andrew Toolkit Representation [ATK], and many others.
-
- The limitations of RFC 822 mail become even more apparent as gateways
- are designed to allow for the exchange of mail messages between RFC
- 822 hosts and X.400 hosts. X.400 [X400] specifies mechanisms for the
- inclusion of non-textual material within electronic mail messages.
- The current standards for the mapping of X.400 messages to RFC 822
- messages specify either that X.400 non-textual material must be
- converted to (not encoded in) IA5Text format, or that they must be
- discarded, notifying the RFC 822 user that discarding has occurred.
- This is clearly undesirable, as information that a user may wish to
- receive is lost. Even though a user agent may not have the
- capability of dealing with the non-textual material, the user might
- have some mechanism external to the UA that can extract useful
- information from the material. Moreover, it does not allow for the
- fact that the message may eventually be gatewayed back into an X.400
- message handling system (i.e., the X.400 message is "tunneled"
- through Internet mail), where the non-textual information would
- definitely become useful again.
-
-
-
-
-Freed & Borenstein Standards Track [Page 3]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
- This document describes several mechanisms that combine to solve most
- of these problems without introducing any serious incompatibilities
- with the existing world of RFC 822 mail. In particular, it
- describes:
-
- (1) A MIME-Version header field, which uses a version
- number to declare a message to be conformant with MIME
- and allows mail processing agents to distinguish
- between such messages and those generated by older or
- non-conformant software, which are presumed to lack
- such a field.
-
- (2) A Content-Type header field, generalized from RFC 1049,
- which can be used to specify the media type and subtype
- of data in the body of a message and to fully specify
- the native representation (canonical form) of such
- data.
-
- (3) A Content-Transfer-Encoding header field, which can be
- used to specify both the encoding transformation that
- was applied to the body and the domain of the result.
- Encoding transformations other than the identity
- transformation are usually applied to data in order to
- allow it to pass through mail transport mechanisms
- which may have data or character set limitations.
-
- (4) Two additional header fields that can be used to
- further describe the data in a body, the Content-ID and
- Content-Description header fields.
-
- All of the header fields defined in this document are subject to the
- general syntactic rules for header fields specified in RFC 822. In
- particular, all of these header fields except for Content-Disposition
- can include RFC 822 comments, which have no semantic content and
- should be ignored during MIME processing.
-
- Finally, to specify and promote interoperability, RFC 2049 provides a
- basic applicability statement for a subset of the above mechanisms
- that defines a minimal level of "conformance" with this document.
-
- HISTORICAL NOTE: Several of the mechanisms described in this set of
- documents may seem somewhat strange or even baroque at first reading.
- It is important to note that compatibility with existing standards
- AND robustness across existing practice were two of the highest
- priorities of the working group that developed this set of documents.
- In particular, compatibility was always favored over elegance.
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 4]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
- Please refer to the current edition of the "Internet Official
- Protocol Standards" for the standardization state and status of this
- protocol. RFC 822 and STD 3, RFC 1123 also provide essential
- background for MIME since no conforming implementation of MIME can
- violate them. In addition, several other informational RFC documents
- will be of interest to the MIME implementor, in particular RFC 1344,
- RFC 1345, and RFC 1524.
-
-2. Definitions, Conventions, and Generic BNF Grammar
-
- Although the mechanisms specified in this set of documents are all
- described in prose, most are also described formally in the augmented
- BNF notation of RFC 822. Implementors will need to be familiar with
- this notation in order to understand this set of documents, and are
- referred to RFC 822 for a complete explanation of the augmented BNF
- notation.
-
- Some of the augmented BNF in this set of documents makes named
- references to syntax rules defined in RFC 822. A complete formal
- grammar, then, is obtained by combining the collected grammar
- appendices in each document in this set with the BNF of RFC 822 plus
- the modifications to RFC 822 defined in RFC 1123 (which specifically
- changes the syntax for `return', `date' and `mailbox').
-
- All numeric and octet values are given in decimal notation in this
- set of documents. All media type values, subtype values, and
- parameter names as defined are case-insensitive. However, parameter
- values are case-sensitive unless otherwise specified for the specific
- parameter.
-
- FORMATTING NOTE: Notes, such at this one, provide additional
- nonessential information which may be skipped by the reader without
- missing anything essential. The primary purpose of these non-
- essential notes is to convey information about the rationale of this
- set of documents, or to place these documents in the proper
- historical or evolutionary context. Such information may in
- particular be skipped by those who are focused entirely on building a
- conformant implementation, but may be of use to those who wish to
- understand why certain design choices were made.
-
-2.1. CRLF
-
- The term CRLF, in this set of documents, refers to the sequence of
- octets corresponding to the two US-ASCII characters CR (decimal value
- 13) and LF (decimal value 10) which, taken together, in this order,
- denote a line break in RFC 822 mail.
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 5]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
-2.2. Character Set
-
- The term "character set" is used in MIME to refer to a method of
- converting a sequence of octets into a sequence of characters. Note
- that unconditional and unambiguous conversion in the other direction
- is not required, in that not all characters may be representable by a
- given character set and a character set may provide more than one
- sequence of octets to represent a particular sequence of characters.
-
- This definition is intended to allow various kinds of character
- encodings, from simple single-table mappings such as US-ASCII to
- complex table switching methods such as those that use ISO 2022's
- techniques, to be used as character sets. However, the definition
- associated with a MIME character set name must fully specify the
- mapping to be performed. In particular, use of external profiling
- information to determine the exact mapping is not permitted.
-
- NOTE: The term "character set" was originally to describe such
- straightforward schemes as US-ASCII and ISO-8859-1 which have a
- simple one-to-one mapping from single octets to single characters.
- Multi-octet coded character sets and switching techniques make the
- situation more complex. For example, some communities use the term
- "character encoding" for what MIME calls a "character set", while
- using the phrase "coded character set" to denote an abstract mapping
- from integers (not octets) to characters.
-
-2.3. Message
-
- The term "message", when not further qualified, means either a
- (complete or "top-level") RFC 822 message being transferred on a
- network, or a message encapsulated in a body of type "message/rfc822"
- or "message/partial".
-
-2.4. Entity
-
- The term "entity", refers specifically to the MIME-defined header
- fields and contents of either a message or one of the parts in the
- body of a multipart entity. The specification of such entities is
- the essence of MIME. Since the contents of an entity are often
- called the "body", it makes sense to speak about the body of an
- entity. Any sort of field may be present in the header of an entity,
- but only those fields whose names begin with "content-" actually have
- any MIME-related meaning. Note that this does NOT imply thay they
- have no meaning at all -- an entity that is also a message has non-
- MIME header fields whose meanings are defined by RFC 822.
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 6]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
-2.5. Body Part
-
- The term "body part" refers to an entity inside of a multipart
- entity.
-
-2.6. Body
-
- The term "body", when not further qualified, means the body of an
- entity, that is, the body of either a message or of a body part.
-
- NOTE: The previous four definitions are clearly circular. This is
- unavoidable, since the overall structure of a MIME message is indeed
- recursive.
-
-2.7. 7bit Data
-
- "7bit data" refers to data that is all represented as relatively
- short lines with 998 octets or less between CRLF line separation
- sequences [RFC-821]. No octets with decimal values greater than 127
- are allowed and neither are NULs (octets with decimal value 0). CR
- (decimal value 13) and LF (decimal value 10) octets only occur as
- part of CRLF line separation sequences.
-
-2.8. 8bit Data
-
- "8bit data" refers to data that is all represented as relatively
- short lines with 998 octets or less between CRLF line separation
- sequences [RFC-821]), but octets with decimal values greater than 127
- may be used. As with "7bit data" CR and LF octets only occur as part
- of CRLF line separation sequences and no NULs are allowed.
-
-2.9. Binary Data
-
- "Binary data" refers to data where any sequence of octets whatsoever
- is allowed.
-
-2.10. Lines
-
- "Lines" are defined as sequences of octets separated by a CRLF
- sequences. This is consistent with both RFC 821 and RFC 822.
- "Lines" only refers to a unit of data in a message, which may or may
- not correspond to something that is actually displayed by a user
- agent.
-
-
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 7]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
-3. MIME Header Fields
-
- MIME defines a number of new RFC 822 header fields that are used to
- describe the content of a MIME entity. These header fields occur in
- at least two contexts:
-
- (1) As part of a regular RFC 822 message header.
-
- (2) In a MIME body part header within a multipart
- construct.
-
- The formal definition of these header fields is as follows:
-
- entity-headers := [ content CRLF ]
- [ encoding CRLF ]
- [ id CRLF ]
- [ description CRLF ]
- *( MIME-extension-field CRLF )
-
- MIME-message-headers := entity-headers
- fields
- version CRLF
- ; The ordering of the header
- ; fields implied by this BNF
- ; definition should be ignored.
-
- MIME-part-headers := entity-headers
- [ fields ]
- ; Any field not beginning with
- ; "content-" can have no defined
- ; meaning and may be ignored.
- ; The ordering of the header
- ; fields implied by this BNF
- ; definition should be ignored.
-
- The syntax of the various specific MIME header fields will be
- described in the following sections.
-
-4. MIME-Version Header Field
-
- Since RFC 822 was published in 1982, there has really been only one
- format standard for Internet messages, and there has been little
- perceived need to declare the format standard in use. This document
- is an independent specification that complements RFC 822. Although
- the extensions in this document have been defined in such a way as to
- be compatible with RFC 822, there are still circumstances in which it
- might be desirable for a mail-processing agent to know whether a
- message was composed with the new standard in mind.
-
-
-
-Freed & Borenstein Standards Track [Page 8]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
- Therefore, this document defines a new header field, "MIME-Version",
- which is to be used to declare the version of the Internet message
- body format standard in use.
-
- Messages composed in accordance with this document MUST include such
- a header field, with the following verbatim text:
-
- MIME-Version: 1.0
-
- The presence of this header field is an assertion that the message
- has been composed in compliance with this document.
-
- Since it is possible that a future document might extend the message
- format standard again, a formal BNF is given for the content of the
- MIME-Version field:
-
- version := "MIME-Version" ":" 1*DIGIT "." 1*DIGIT
-
- Thus, future format specifiers, which might replace or extend "1.0",
- are constrained to be two integer fields, separated by a period. If
- a message is received with a MIME-version value other than "1.0", it
- cannot be assumed to conform with this document.
-
- Note that the MIME-Version header field is required at the top level
- of a message. It is not required for each body part of a multipart
- entity. It is required for the embedded headers of a body of type
- "message/rfc822" or "message/partial" if and only if the embedded
- message is itself claimed to be MIME-conformant.
-
- It is not possible to fully specify how a mail reader that conforms
- with MIME as defined in this document should treat a message that
- might arrive in the future with some value of MIME-Version other than
- "1.0".
-
- It is also worth noting that version control for specific media types
- is not accomplished using the MIME-Version mechanism. In particular,
- some formats (such as application/postscript) have version numbering
- conventions that are internal to the media format. Where such
- conventions exist, MIME does nothing to supersede them. Where no
- such conventions exist, a MIME media type might use a "version"
- parameter in the content-type field if necessary.
-
-
-
-
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 9]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
- NOTE TO IMPLEMENTORS: When checking MIME-Version values any RFC 822
- comment strings that are present must be ignored. In particular, the
- following four MIME-Version fields are equivalent:
-
- MIME-Version: 1.0
-
- MIME-Version: 1.0 (produced by MetaSend Vx.x)
-
- MIME-Version: (produced by MetaSend Vx.x) 1.0
-
- MIME-Version: 1.(produced by MetaSend Vx.x)0
-
- In the absence of a MIME-Version field, a receiving mail user agent
- (whether conforming to MIME requirements or not) may optionally
- choose to interpret the body of the message according to local
- conventions. Many such conventions are currently in use and it
- should be noted that in practice non-MIME messages can contain just
- about anything.
-
- It is impossible to be certain that a non-MIME mail message is
- actually plain text in the US-ASCII character set since it might well
- be a message that, using some set of nonstandard local conventions
- that predate MIME, includes text in another character set or non-
- textual data presented in a manner that cannot be automatically
- recognized (e.g., a uuencoded compressed UNIX tar file).
-
-5. Content-Type Header Field
-
- The purpose of the Content-Type field is to describe the data
- contained in the body fully enough that the receiving user agent can
- pick an appropriate agent or mechanism to present the data to the
- user, or otherwise deal with the data in an appropriate manner. The
- value in this field is called a media type.
-
- HISTORICAL NOTE: The Content-Type header field was first defined in
- RFC 1049. RFC 1049 used a simpler and less powerful syntax, but one
- that is largely compatible with the mechanism given here.
-
- The Content-Type header field specifies the nature of the data in the
- body of an entity by giving media type and subtype identifiers, and
- by providing auxiliary information that may be required for certain
- media types. After the media type and subtype names, the remainder
- of the header field is simply a set of parameters, specified in an
- attribute=value notation. The ordering of parameters is not
- significant.
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 10]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
- In general, the top-level media type is used to declare the general
- type of data, while the subtype specifies a specific format for that
- type of data. Thus, a media type of "image/xyz" is enough to tell a
- user agent that the data is an image, even if the user agent has no
- knowledge of the specific image format "xyz". Such information can
- be used, for example, to decide whether or not to show a user the raw
- data from an unrecognized subtype -- such an action might be
- reasonable for unrecognized subtypes of text, but not for
- unrecognized subtypes of image or audio. For this reason, registered
- subtypes of text, image, audio, and video should not contain embedded
- information that is really of a different type. Such compound
- formats should be represented using the "multipart" or "application"
- types.
-
- Parameters are modifiers of the media subtype, and as such do not
- fundamentally affect the nature of the content. The set of
- meaningful parameters depends on the media type and subtype. Most
- parameters are associated with a single specific subtype. However, a
- given top-level media type may define parameters which are applicable
- to any subtype of that type. Parameters may be required by their
- defining content type or subtype or they may be optional. MIME
- implementations must ignore any parameters whose names they do not
- recognize.
-
- For example, the "charset" parameter is applicable to any subtype of
- "text", while the "boundary" parameter is required for any subtype of
- the "multipart" media type.
-
- There are NO globally-meaningful parameters that apply to all media
- types. Truly global mechanisms are best addressed, in the MIME
- model, by the definition of additional Content-* header fields.
-
- An initial set of seven top-level media types is defined in RFC 2046.
- Five of these are discrete types whose content is essentially opaque
- as far as MIME processing is concerned. The remaining two are
- composite types whose contents require additional handling by MIME
- processors.
-
- This set of top-level media types is intended to be substantially
- complete. It is expected that additions to the larger set of
- supported types can generally be accomplished by the creation of new
- subtypes of these initial types. In the future, more top-level types
- may be defined only by a standards-track extension to this standard.
- If another top-level type is to be used for any reason, it must be
- given a name starting with "X-" to indicate its non-standard status
- and to avoid a potential conflict with a future official name.
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 11]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
-5.1. Syntax of the Content-Type Header Field
-
- In the Augmented BNF notation of RFC 822, a Content-Type header field
- value is defined as follows:
-
- content := "Content-Type" ":" type "/" subtype
- *(";" parameter)
- ; Matching of media type and subtype
- ; is ALWAYS case-insensitive.
-
- type := discrete-type / composite-type
-
- discrete-type := "text" / "image" / "audio" / "video" /
- "application" / extension-token
-
- composite-type := "message" / "multipart" / extension-token
-
- extension-token := ietf-token / x-token
-
- ietf-token := <An extension token defined by a
- standards-track RFC and registered
- with IANA.>
-
- x-token := <The two characters "X-" or "x-" followed, with
- no intervening white space, by any token>
-
- subtype := extension-token / iana-token
-
- iana-token := <A publicly-defined extension token. Tokens
- of this form must be registered with IANA
- as specified in RFC 2048.>
-
- parameter := attribute "=" value
-
- attribute := token
- ; Matching of attributes
- ; is ALWAYS case-insensitive.
-
- value := token / quoted-string
-
- token := 1*<any (US-ASCII) CHAR except SPACE, CTLs,
- or tspecials>
-
- tspecials := "(" / ")" / "<" / ">" / "@" /
- "," / ";" / ":" / "\" / <">
- "/" / "[" / "]" / "?" / "="
- ; Must be in quoted-string,
- ; to use within parameter values
-
-
-
-Freed & Borenstein Standards Track [Page 12]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
- Note that the definition of "tspecials" is the same as the RFC 822
- definition of "specials" with the addition of the three characters
- "/", "?", and "=", and the removal of ".".
-
- Note also that a subtype specification is MANDATORY -- it may not be
- omitted from a Content-Type header field. As such, there are no
- default subtypes.
-
- The type, subtype, and parameter names are not case sensitive. For
- example, TEXT, Text, and TeXt are all equivalent top-level media
- types. Parameter values are normally case sensitive, but sometimes
- are interpreted in a case-insensitive fashion, depending on the
- intended use. (For example, multipart boundaries are case-sensitive,
- but the "access-type" parameter for message/External-body is not
- case-sensitive.)
-
- Note that the value of a quoted string parameter does not include the
- quotes. That is, the quotation marks in a quoted-string are not a
- part of the value of the parameter, but are merely used to delimit
- that parameter value. In addition, comments are allowed in
- accordance with RFC 822 rules for structured header fields. Thus the
- following two forms
-
- Content-type: text/plain; charset=us-ascii (Plain text)
-
- Content-type: text/plain; charset="us-ascii"
-
- are completely equivalent.
-
- Beyond this syntax, the only syntactic constraint on the definition
- of subtype names is the desire that their uses must not conflict.
- That is, it would be undesirable to have two different communities
- using "Content-Type: application/foobar" to mean two different
- things. The process of defining new media subtypes, then, is not
- intended to be a mechanism for imposing restrictions, but simply a
- mechanism for publicizing their definition and usage. There are,
- therefore, two acceptable mechanisms for defining new media subtypes:
-
- (1) Private values (starting with "X-") may be defined
- bilaterally between two cooperating agents without
- outside registration or standardization. Such values
- cannot be registered or standardized.
-
- (2) New standard values should be registered with IANA as
- described in RFC 2048.
-
- The second document in this set, RFC 2046, defines the initial set of
- media types for MIME.
-
-
-
-Freed & Borenstein Standards Track [Page 13]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
-5.2. Content-Type Defaults
-
- Default RFC 822 messages without a MIME Content-Type header are taken
- by this protocol to be plain text in the US-ASCII character set,
- which can be explicitly specified as:
-
- Content-type: text/plain; charset=us-ascii
-
- This default is assumed if no Content-Type header field is specified.
- It is also recommend that this default be assumed when a
- syntactically invalid Content-Type header field is encountered. In
- the presence of a MIME-Version header field and the absence of any
- Content-Type header field, a receiving User Agent can also assume
- that plain US-ASCII text was the sender's intent. Plain US-ASCII
- text may still be assumed in the absence of a MIME-Version or the
- presence of an syntactically invalid Content-Type header field, but
- the sender's intent might have been otherwise.
-
-6. Content-Transfer-Encoding Header Field
-
- Many media types which could be usefully transported via email are
- represented, in their "natural" format, as 8bit character or binary
- data. Such data cannot be transmitted over some transfer protocols.
- For example, RFC 821 (SMTP) restricts mail messages to 7bit US-ASCII
- data with lines no longer than 1000 characters including any trailing
- CRLF line separator.
-
- It is necessary, therefore, to define a standard mechanism for
- encoding such data into a 7bit short line format. Proper labelling
- of unencoded material in less restrictive formats for direct use over
- less restrictive transports is also desireable. This document
- specifies that such encodings will be indicated by a new "Content-
- Transfer-Encoding" header field. This field has not been defined by
- any previous standard.
-
-6.1. Content-Transfer-Encoding Syntax
-
- The Content-Transfer-Encoding field's value is a single token
- specifying the type of encoding, as enumerated below. Formally:
-
- encoding := "Content-Transfer-Encoding" ":" mechanism
-
- mechanism := "7bit" / "8bit" / "binary" /
- "quoted-printable" / "base64" /
- ietf-token / x-token
-
- These values are not case sensitive -- Base64 and BASE64 and bAsE64
- are all equivalent. An encoding type of 7BIT requires that the body
-
-
-
-Freed & Borenstein Standards Track [Page 14]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
- is already in a 7bit mail-ready representation. This is the default
- value -- that is, "Content-Transfer-Encoding: 7BIT" is assumed if the
- Content-Transfer-Encoding header field is not present.
-
-6.2. Content-Transfer-Encodings Semantics
-
- This single Content-Transfer-Encoding token actually provides two
- pieces of information. It specifies what sort of encoding
- transformation the body was subjected to and hence what decoding
- operation must be used to restore it to its original form, and it
- specifies what the domain of the result is.
-
- The transformation part of any Content-Transfer-Encodings specifies,
- either explicitly or implicitly, a single, well-defined decoding
- algorithm, which for any sequence of encoded octets either transforms
- it to the original sequence of octets which was encoded, or shows
- that it is illegal as an encoded sequence. Content-Transfer-
- Encodings transformations never depend on any additional external
- profile information for proper operation. Note that while decoders
- must produce a single, well-defined output for a valid encoding no
- such restrictions exist for encoders: Encoding a given sequence of
- octets to different, equivalent encoded sequences is perfectly legal.
-
- Three transformations are currently defined: identity, the "quoted-
- printable" encoding, and the "base64" encoding. The domains are
- "binary", "8bit" and "7bit".
-
- The Content-Transfer-Encoding values "7bit", "8bit", and "binary" all
- mean that the identity (i.e. NO) encoding transformation has been
- performed. As such, they serve simply as indicators of the domain of
- the body data, and provide useful information about the sort of
- encoding that might be needed for transmission in a given transport
- system. The terms "7bit data", "8bit data", and "binary data" are
- all defined in Section 2.
-
- The quoted-printable and base64 encodings transform their input from
- an arbitrary domain into material in the "7bit" range, thus making it
- safe to carry over restricted transports. The specific definition of
- the transformations are given below.
-
- The proper Content-Transfer-Encoding label must always be used.
- Labelling unencoded data containing 8bit characters as "7bit" is not
- allowed, nor is labelling unencoded non-line-oriented data as
- anything other than "binary" allowed.
-
- Unlike media subtypes, a proliferation of Content-Transfer-Encoding
- values is both undesirable and unnecessary. However, establishing
- only a single transformation into the "7bit" domain does not seem
-
-
-
-Freed & Borenstein Standards Track [Page 15]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
- possible. There is a tradeoff between the desire for a compact and
- efficient encoding of largely- binary data and the desire for a
- somewhat readable encoding of data that is mostly, but not entirely,
- 7bit. For this reason, at least two encoding mechanisms are
- necessary: a more or less readable encoding (quoted-printable) and a
- "dense" or "uniform" encoding (base64).
-
- Mail transport for unencoded 8bit data is defined in RFC 1652. As of
- the initial publication of this document, there are no standardized
- Internet mail transports for which it is legitimate to include
- unencoded binary data in mail bodies. Thus there are no
- circumstances in which the "binary" Content-Transfer-Encoding is
- actually valid in Internet mail. However, in the event that binary
- mail transport becomes a reality in Internet mail, or when MIME is
- used in conjunction with any other binary-capable mail transport
- mechanism, binary bodies must be labelled as such using this
- mechanism.
-
- NOTE: The five values defined for the Content-Transfer-Encoding field
- imply nothing about the media type other than the algorithm by which
- it was encoded or the transport system requirements if unencoded.
-
-6.3. New Content-Transfer-Encodings
-
- Implementors may, if necessary, define private Content-Transfer-
- Encoding values, but must use an x-token, which is a name prefixed by
- "X-", to indicate its non-standard status, e.g., "Content-Transfer-
- Encoding: x-my-new-encoding". Additional standardized Content-
- Transfer-Encoding values must be specified by a standards-track RFC.
- The requirements such specifications must meet are given in RFC 2048.
- As such, all content-transfer-encoding namespace except that
- beginning with "X-" is explicitly reserved to the IETF for future
- use.
-
- Unlike media types and subtypes, the creation of new Content-
- Transfer-Encoding values is STRONGLY discouraged, as it seems likely
- to hinder interoperability with little potential benefit
-
-6.4. Interpretation and Use
-
- If a Content-Transfer-Encoding header field appears as part of a
- message header, it applies to the entire body of that message. If a
- Content-Transfer-Encoding header field appears as part of an entity's
- headers, it applies only to the body of that entity. If an entity is
- of type "multipart" the Content-Transfer-Encoding is not permitted to
- have any value other than "7bit", "8bit" or "binary". Even more
- severe restrictions apply to some subtypes of the "message" type.
-
-
-
-
-Freed & Borenstein Standards Track [Page 16]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
- It should be noted that most media types are defined in terms of
- octets rather than bits, so that the mechanisms described here are
- mechanisms for encoding arbitrary octet streams, not bit streams. If
- a bit stream is to be encoded via one of these mechanisms, it must
- first be converted to an 8bit byte stream using the network standard
- bit order ("big-endian"), in which the earlier bits in a stream
- become the higher-order bits in a 8bit byte. A bit stream not ending
- at an 8bit boundary must be padded with zeroes. RFC 2046 provides a
- mechanism for noting the addition of such padding in the case of the
- application/octet-stream media type, which has a "padding" parameter.
-
- The encoding mechanisms defined here explicitly encode all data in
- US-ASCII. Thus, for example, suppose an entity has header fields
- such as:
-
- Content-Type: text/plain; charset=ISO-8859-1
- Content-transfer-encoding: base64
-
- This must be interpreted to mean that the body is a base64 US-ASCII
- encoding of data that was originally in ISO-8859-1, and will be in
- that character set again after decoding.
-
- Certain Content-Transfer-Encoding values may only be used on certain
- media types. In particular, it is EXPRESSLY FORBIDDEN to use any
- encodings other than "7bit", "8bit", or "binary" with any composite
- media type, i.e. one that recursively includes other Content-Type
- fields. Currently the only composite media types are "multipart" and
- "message". All encodings that are desired for bodies of type
- multipart or message must be done at the innermost level, by encoding
- the actual body that needs to be encoded.
-
- It should also be noted that, by definition, if a composite entity
- has a transfer-encoding value such as "7bit", but one of the enclosed
- entities has a less restrictive value such as "8bit", then either the
- outer "7bit" labelling is in error, because 8bit data are included,
- or the inner "8bit" labelling placed an unnecessarily high demand on
- the transport system because the actual included data were actually
- 7bit-safe.
-
- NOTE ON ENCODING RESTRICTIONS: Though the prohibition against using
- content-transfer-encodings on composite body data may seem overly
- restrictive, it is necessary to prevent nested encodings, in which
- data are passed through an encoding algorithm multiple times, and
- must be decoded multiple times in order to be properly viewed.
- Nested encodings add considerable complexity to user agents: Aside
- from the obvious efficiency problems with such multiple encodings,
- they can obscure the basic structure of a message. In particular,
- they can imply that several decoding operations are necessary simply
-
-
-
-Freed & Borenstein Standards Track [Page 17]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
- to find out what types of bodies a message contains. Banning nested
- encodings may complicate the job of certain mail gateways, but this
- seems less of a problem than the effect of nested encodings on user
- agents.
-
- Any entity with an unrecognized Content-Transfer-Encoding must be
- treated as if it has a Content-Type of "application/octet-stream",
- regardless of what the Content-Type header field actually says.
-
- NOTE ON THE RELATIONSHIP BETWEEN CONTENT-TYPE AND CONTENT-TRANSFER-
- ENCODING: It may seem that the Content-Transfer-Encoding could be
- inferred from the characteristics of the media that is to be encoded,
- or, at the very least, that certain Content-Transfer-Encodings could
- be mandated for use with specific media types. There are several
- reasons why this is not the case. First, given the varying types of
- transports used for mail, some encodings may be appropriate for some
- combinations of media types and transports but not for others. (For
- example, in an 8bit transport, no encoding would be required for text
- in certain character sets, while such encodings are clearly required
- for 7bit SMTP.)
-
- Second, certain media types may require different types of transfer
- encoding under different circumstances. For example, many PostScript
- bodies might consist entirely of short lines of 7bit data and hence
- require no encoding at all. Other PostScript bodies (especially
- those using Level 2 PostScript's binary encoding mechanism) may only
- be reasonably represented using a binary transport encoding.
- Finally, since the Content-Type field is intended to be an open-ended
- specification mechanism, strict specification of an association
- between media types and encodings effectively couples the
- specification of an application protocol with a specific lower-level
- transport. This is not desirable since the developers of a media
- type should not have to be aware of all the transports in use and
- what their limitations are.
-
-6.5. Translating Encodings
-
- The quoted-printable and base64 encodings are designed so that
- conversion between them is possible. The only issue that arises in
- such a conversion is the handling of hard line breaks in quoted-
- printable encoding output. When converting from quoted-printable to
- base64 a hard line break in the quoted-printable form represents a
- CRLF sequence in the canonical form of the data. It must therefore be
- converted to a corresponding encoded CRLF in the base64 form of the
- data. Similarly, a CRLF sequence in the canonical form of the data
- obtained after base64 decoding must be converted to a quoted-
- printable hard line break, but ONLY when converting text data.
-
-
-
-
-Freed & Borenstein Standards Track [Page 18]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
-6.6. Canonical Encoding Model
-
- There was some confusion, in the previous versions of this RFC,
- regarding the model for when email data was to be converted to
- canonical form and encoded, and in particular how this process would
- affect the treatment of CRLFs, given that the representation of
- newlines varies greatly from system to system, and the relationship
- between content-transfer-encodings and character sets. A canonical
- model for encoding is presented in RFC 2049 for this reason.
-
-6.7. Quoted-Printable Content-Transfer-Encoding
-
- The Quoted-Printable encoding is intended to represent data that
- largely consists of octets that correspond to printable characters in
- the US-ASCII character set. It encodes the data in such a way that
- the resulting octets are unlikely to be modified by mail transport.
- If the data being encoded are mostly US-ASCII text, the encoded form
- of the data remains largely recognizable by humans. A body which is
- entirely US-ASCII may also be encoded in Quoted-Printable to ensure
- the integrity of the data should the message pass through a
- character-translating, and/or line-wrapping gateway.
-
- In this encoding, octets are to be represented as determined by the
- following rules:
-
- (1) (General 8bit representation) Any octet, except a CR or
- LF that is part of a CRLF line break of the canonical
- (standard) form of the data being encoded, may be
- represented by an "=" followed by a two digit
- hexadecimal representation of the octet's value. The
- digits of the hexadecimal alphabet, for this purpose,
- are "0123456789ABCDEF". Uppercase letters must be
- used; lowercase letters are not allowed. Thus, for
- example, the decimal value 12 (US-ASCII form feed) can
- be represented by "=0C", and the decimal value 61 (US-
- ASCII EQUAL SIGN) can be represented by "=3D". This
- rule must be followed except when the following rules
- allow an alternative encoding.
-
- (2) (Literal representation) Octets with decimal values of
- 33 through 60 inclusive, and 62 through 126, inclusive,
- MAY be represented as the US-ASCII characters which
- correspond to those octets (EXCLAMATION POINT through
- LESS THAN, and GREATER THAN through TILDE,
- respectively).
-
- (3) (White Space) Octets with values of 9 and 32 MAY be
- represented as US-ASCII TAB (HT) and SPACE characters,
-
-
-
-Freed & Borenstein Standards Track [Page 19]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
- respectively, but MUST NOT be so represented at the end
- of an encoded line. Any TAB (HT) or SPACE characters
- on an encoded line MUST thus be followed on that line
- by a printable character. In particular, an "=" at the
- end of an encoded line, indicating a soft line break
- (see rule #5) may follow one or more TAB (HT) or SPACE
- characters. It follows that an octet with decimal
- value 9 or 32 appearing at the end of an encoded line
- must be represented according to Rule #1. This rule is
- necessary because some MTAs (Message Transport Agents,
- programs which transport messages from one user to
- another, or perform a portion of such transfers) are
- known to pad lines of text with SPACEs, and others are
- known to remove "white space" characters from the end
- of a line. Therefore, when decoding a Quoted-Printable
- body, any trailing white space on a line must be
- deleted, as it will necessarily have been added by
- intermediate transport agents.
-
- (4) (Line Breaks) A line break in a text body, represented
- as a CRLF sequence in the text canonical form, must be
- represented by a (RFC 822) line break, which is also a
- CRLF sequence, in the Quoted-Printable encoding. Since
- the canonical representation of media types other than
- text do not generally include the representation of
- line breaks as CRLF sequences, no hard line breaks
- (i.e. line breaks that are intended to be meaningful
- and to be displayed to the user) can occur in the
- quoted-printable encoding of such types. Sequences
- like "=0D", "=0A", "=0A=0D" and "=0D=0A" will routinely
- appear in non-text data represented in quoted-
- printable, of course.
-
- Note that many implementations may elect to encode the
- local representation of various content types directly
- rather than converting to canonical form first,
- encoding, and then converting back to local
- representation. In particular, this may apply to plain
- text material on systems that use newline conventions
- other than a CRLF terminator sequence. Such an
- implementation optimization is permissible, but only
- when the combined canonicalization-encoding step is
- equivalent to performing the three steps separately.
-
- (5) (Soft Line Breaks) The Quoted-Printable encoding
- REQUIRES that encoded lines be no more than 76
- characters long. If longer lines are to be encoded
- with the Quoted-Printable encoding, "soft" line breaks
-
-
-
-Freed & Borenstein Standards Track [Page 20]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
- must be used. An equal sign as the last character on a
- encoded line indicates such a non-significant ("soft")
- line break in the encoded text.
-
- Thus if the "raw" form of the line is a single unencoded line that
- says:
-
- Now's the time for all folk to come to the aid of their country.
-
- This can be represented, in the Quoted-Printable encoding, as:
-
- Now's the time =
- for all folk to come=
- to the aid of their country.
-
- This provides a mechanism with which long lines are encoded in such a
- way as to be restored by the user agent. The 76 character limit does
- not count the trailing CRLF, but counts all other characters,
- including any equal signs.
-
- Since the hyphen character ("-") may be represented as itself in the
- Quoted-Printable encoding, care must be taken, when encapsulating a
- quoted-printable encoded body inside one or more multipart entities,
- to ensure that the boundary delimiter does not appear anywhere in the
- encoded body. (A good strategy is to choose a boundary that includes
- a character sequence such as "=_" which can never appear in a
- quoted-printable body. See the definition of multipart messages in
- RFC 2046.)
-
- NOTE: The quoted-printable encoding represents something of a
- compromise between readability and reliability in transport. Bodies
- encoded with the quoted-printable encoding will work reliably over
- most mail gateways, but may not work perfectly over a few gateways,
- notably those involving translation into EBCDIC. A higher level of
- confidence is offered by the base64 Content-Transfer-Encoding. A way
- to get reasonably reliable transport through EBCDIC gateways is to
- also quote the US-ASCII characters
-
- !"#$@[\]^`{|}~
-
- according to rule #1.
-
- Because quoted-printable data is generally assumed to be line-
- oriented, it is to be expected that the representation of the breaks
- between the lines of quoted-printable data may be altered in
- transport, in the same manner that plain text mail has always been
- altered in Internet mail when passing between systems with differing
- newline conventions. If such alterations are likely to constitute a
-
-
-
-Freed & Borenstein Standards Track [Page 21]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
- corruption of the data, it is probably more sensible to use the
- base64 encoding rather than the quoted-printable encoding.
-
- NOTE: Several kinds of substrings cannot be generated according to
- the encoding rules for the quoted-printable content-transfer-
- encoding, and hence are formally illegal if they appear in the output
- of a quoted-printable encoder. This note enumerates these cases and
- suggests ways to handle such illegal substrings if any are
- encountered in quoted-printable data that is to be decoded.
-
- (1) An "=" followed by two hexadecimal digits, one or both
- of which are lowercase letters in "abcdef", is formally
- illegal. A robust implementation might choose to
- recognize them as the corresponding uppercase letters.
-
- (2) An "=" followed by a character that is neither a
- hexadecimal digit (including "abcdef") nor the CR
- character of a CRLF pair is illegal. This case can be
- the result of US-ASCII text having been included in a
- quoted-printable part of a message without itself
- having been subjected to quoted-printable encoding. A
- reasonable approach by a robust implementation might be
- to include the "=" character and the following
- character in the decoded data without any
- transformation and, if possible, indicate to the user
- that proper decoding was not possible at this point in
- the data.
-
- (3) An "=" cannot be the ultimate or penultimate character
- in an encoded object. This could be handled as in case
- (2) above.
-
- (4) Control characters other than TAB, or CR and LF as
- parts of CRLF pairs, must not appear. The same is true
- for octets with decimal values greater than 126. If
- found in incoming quoted-printable data by a decoder, a
- robust implementation might exclude them from the
- decoded data and warn the user that illegal characters
- were discovered.
-
- (5) Encoded lines must not be longer than 76 characters,
- not counting the trailing CRLF. If longer lines are
- found in incoming, encoded data, a robust
- implementation might nevertheless decode the lines, and
- might report the erroneous encoding to the user.
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 22]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
- WARNING TO IMPLEMENTORS: If binary data is encoded in quoted-
- printable, care must be taken to encode CR and LF characters as "=0D"
- and "=0A", respectively. In particular, a CRLF sequence in binary
- data should be encoded as "=0D=0A". Otherwise, if CRLF were
- represented as a hard line break, it might be incorrectly decoded on
- platforms with different line break conventions.
-
- For formalists, the syntax of quoted-printable data is described by
- the following grammar:
-
- quoted-printable := qp-line *(CRLF qp-line)
-
- qp-line := *(qp-segment transport-padding CRLF)
- qp-part transport-padding
-
- qp-part := qp-section
- ; Maximum length of 76 characters
-
- qp-segment := qp-section *(SPACE / TAB) "="
- ; Maximum length of 76 characters
-
- qp-section := [*(ptext / SPACE / TAB) ptext]
-
- ptext := hex-octet / safe-char
-
- safe-char := <any octet with decimal value of 33 through
- 60 inclusive, and 62 through 126>
- ; Characters not listed as "mail-safe" in
- ; RFC 2049 are also not recommended.
-
- hex-octet := "=" 2(DIGIT / "A" / "B" / "C" / "D" / "E" / "F")
- ; Octet must be used for characters > 127, =,
- ; SPACEs or TABs at the ends of lines, and is
- ; recommended for any character not listed in
- ; RFC 2049 as "mail-safe".
-
- transport-padding := *LWSP-char
- ; Composers MUST NOT generate
- ; non-zero length transport
- ; padding, but receivers MUST
- ; be able to handle padding
- ; added by message transports.
-
- IMPORTANT: The addition of LWSP between the elements shown in this
- BNF is NOT allowed since this BNF does not specify a structured
- header field.
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 23]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
-6.8. Base64 Content-Transfer-Encoding
-
- The Base64 Content-Transfer-Encoding is designed to represent
- arbitrary sequences of octets in a form that need not be humanly
- readable. The encoding and decoding algorithms are simple, but the
- encoded data are consistently only about 33 percent larger than the
- unencoded data. This encoding is virtually identical to the one used
- in Privacy Enhanced Mail (PEM) applications, as defined in RFC 1421.
-
- A 65-character subset of US-ASCII is used, enabling 6 bits to be
- represented per printable character. (The extra 65th character, "=",
- is used to signify a special processing function.)
-
- NOTE: This subset has the important property that it is represented
- identically in all versions of ISO 646, including US-ASCII, and all
- characters in the subset are also represented identically in all
- versions of EBCDIC. Other popular encodings, such as the encoding
- used by the uuencode utility, Macintosh binhex 4.0 [RFC-1741], and
- the base85 encoding specified as part of Level 2 PostScript, do not
- share these properties, and thus do not fulfill the portability
- requirements a binary transport encoding for mail must meet.
-
- The encoding process represents 24-bit groups of input bits as output
- strings of 4 encoded characters. Proceeding from left to right, a
- 24-bit input group is formed by concatenating 3 8bit input groups.
- These 24 bits are then treated as 4 concatenated 6-bit groups, each
- of which is translated into a single digit in the base64 alphabet.
- When encoding a bit stream via the base64 encoding, the bit stream
- must be presumed to be ordered with the most-significant-bit first.
- That is, the first bit in the stream will be the high-order bit in
- the first 8bit byte, and the eighth bit will be the low-order bit in
- the first 8bit byte, and so on.
-
- Each 6-bit group is used as an index into an array of 64 printable
- characters. The character referenced by the index is placed in the
- output string. These characters, identified in Table 1, below, are
- selected so as to be universally representable, and the set excludes
- characters with particular significance to SMTP (e.g., ".", CR, LF)
- and to the multipart boundary delimiters defined in RFC 2046 (e.g.,
- "-").
-
-
-
-
-
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 24]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
- Table 1: The Base64 Alphabet
-
- Value Encoding Value Encoding Value Encoding Value Encoding
- 0 A 17 R 34 i 51 z
- 1 B 18 S 35 j 52 0
- 2 C 19 T 36 k 53 1
- 3 D 20 U 37 l 54 2
- 4 E 21 V 38 m 55 3
- 5 F 22 W 39 n 56 4
- 6 G 23 X 40 o 57 5
- 7 H 24 Y 41 p 58 6
- 8 I 25 Z 42 q 59 7
- 9 J 26 a 43 r 60 8
- 10 K 27 b 44 s 61 9
- 11 L 28 c 45 t 62 +
- 12 M 29 d 46 u 63 /
- 13 N 30 e 47 v
- 14 O 31 f 48 w (pad) =
- 15 P 32 g 49 x
- 16 Q 33 h 50 y
-
- The encoded output stream must be represented in lines of no more
- than 76 characters each. All line breaks or other characters not
- found in Table 1 must be ignored by decoding software. In base64
- data, characters other than those in Table 1, line breaks, and other
- white space probably indicate a transmission error, about which a
- warning message or even a message rejection might be appropriate
- under some circumstances.
-
- Special processing is performed if fewer than 24 bits are available
- at the end of the data being encoded. A full encoding quantum is
- always completed at the end of a body. When fewer than 24 input bits
- are available in an input group, zero bits are added (on the right)
- to form an integral number of 6-bit groups. Padding at the end of
- the data is performed using the "=" character. Since all base64
- input is an integral number of octets, only the following cases can
- arise: (1) the final quantum of encoding input is an integral
- multiple of 24 bits; here, the final unit of encoded output will be
- an integral multiple of 4 characters with no "=" padding, (2) the
- final quantum of encoding input is exactly 8 bits; here, the final
- unit of encoded output will be two characters followed by two "="
- padding characters, or (3) the final quantum of encoding input is
- exactly 16 bits; here, the final unit of encoded output will be three
- characters followed by one "=" padding character.
-
- Because it is used only for padding at the end of the data, the
- occurrence of any "=" characters may be taken as evidence that the
- end of the data has been reached (without truncation in transit). No
-
-
-
-Freed & Borenstein Standards Track [Page 25]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
- such assurance is possible, however, when the number of octets
- transmitted was a multiple of three and no "=" characters are
- present.
-
- Any characters outside of the base64 alphabet are to be ignored in
- base64-encoded data.
-
- Care must be taken to use the proper octets for line breaks if base64
- encoding is applied directly to text material that has not been
- converted to canonical form. In particular, text line breaks must be
- converted into CRLF sequences prior to base64 encoding. The
- important thing to note is that this may be done directly by the
- encoder rather than in a prior canonicalization step in some
- implementations.
-
- NOTE: There is no need to worry about quoting potential boundary
- delimiters within base64-encoded bodies within multipart entities
- because no hyphen characters are used in the base64 encoding.
-
-7. Content-ID Header Field
-
- In constructing a high-level user agent, it may be desirable to allow
- one body to make reference to another. Accordingly, bodies may be
- labelled using the "Content-ID" header field, which is syntactically
- identical to the "Message-ID" header field:
-
- id := "Content-ID" ":" msg-id
-
- Like the Message-ID values, Content-ID values must be generated to be
- world-unique.
-
- The Content-ID value may be used for uniquely identifying MIME
- entities in several contexts, particularly for caching data
- referenced by the message/external-body mechanism. Although the
- Content-ID header is generally optional, its use is MANDATORY in
- implementations which generate data of the optional MIME media type
- "message/external-body". That is, each message/external-body entity
- must have a Content-ID field to permit caching of such data.
-
- It is also worth noting that the Content-ID value has special
- semantics in the case of the multipart/alternative media type. This
- is explained in the section of RFC 2046 dealing with
- multipart/alternative.
-
-
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 26]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
-8. Content-Description Header Field
-
- The ability to associate some descriptive information with a given
- body is often desirable. For example, it may be useful to mark an
- "image" body as "a picture of the Space Shuttle Endeavor." Such text
- may be placed in the Content-Description header field. This header
- field is always optional.
-
- description := "Content-Description" ":" *text
-
- The description is presumed to be given in the US-ASCII character
- set, although the mechanism specified in RFC 2047 may be used for
- non-US-ASCII Content-Description values.
-
-9. Additional MIME Header Fields
-
- Future documents may elect to define additional MIME header fields
- for various purposes. Any new header field that further describes
- the content of a message should begin with the string "Content-" to
- allow such fields which appear in a message header to be
- distinguished from ordinary RFC 822 message header fields.
-
- MIME-extension-field := <Any RFC 822 header field which
- begins with the string
- "Content-">
-
-10. Summary
-
- Using the MIME-Version, Content-Type, and Content-Transfer-Encoding
- header fields, it is possible to include, in a standardized way,
- arbitrary types of data with RFC 822 conformant mail messages. No
- restrictions imposed by either RFC 821 or RFC 822 are violated, and
- care has been taken to avoid problems caused by additional
- restrictions imposed by the characteristics of some Internet mail
- transport mechanisms (see RFC 2049).
-
- The next document in this set, RFC 2046, specifies the initial set of
- media types that can be labelled and transported using these headers.
-
-11. Security Considerations
-
- Security issues are discussed in the second document in this set, RFC
- 2046.
-
-
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 27]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
-12. Authors' Addresses
-
- For more information, the authors of this document are best contacted
- via Internet mail:
-
- Ned Freed
- Innosoft International, Inc.
- 1050 East Garvey Avenue South
- West Covina, CA 91790
- USA
-
- Phone: +1 818 919 3600
- Fax: +1 818 919 3614
- EMail: ned at innosoft.com
-
-
- Nathaniel S. Borenstein
- First Virtual Holdings
- 25 Washington Avenue
- Morristown, NJ 07960
- USA
-
- Phone: +1 201 540 8967
- Fax: +1 201 993 3032
- EMail: nsb at nsb.fv.com
-
-
- MIME is a result of the work of the Internet Engineering Task Force
- Working Group on RFC 822 Extensions. The chairman of that group,
- Greg Vaudreuil, may be reached at:
-
- Gregory M. Vaudreuil
- Octel Network Services
- 17080 Dallas Parkway
- Dallas, TX 75248-1905
- USA
-
- EMail: Greg.Vaudreuil at Octel.Com
-
-
-
-
-
-
-
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 28]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
-Appendix A -- Collected Grammar
-
- This appendix contains the complete BNF grammar for all the syntax
- specified by this document.
-
- By itself, however, this grammar is incomplete. It refers by name to
- several syntax rules that are defined by RFC 822. Rather than
- reproduce those definitions here, and risk unintentional differences
- between the two, this document simply refers the reader to RFC 822
- for the remaining definitions. Wherever a term is undefined, it
- refers to the RFC 822 definition.
-
- attribute := token
- ; Matching of attributes
- ; is ALWAYS case-insensitive.
-
- composite-type := "message" / "multipart" / extension-token
-
- content := "Content-Type" ":" type "/" subtype
- *(";" parameter)
- ; Matching of media type and subtype
- ; is ALWAYS case-insensitive.
-
- description := "Content-Description" ":" *text
-
- discrete-type := "text" / "image" / "audio" / "video" /
- "application" / extension-token
-
- encoding := "Content-Transfer-Encoding" ":" mechanism
-
- entity-headers := [ content CRLF ]
- [ encoding CRLF ]
- [ id CRLF ]
- [ description CRLF ]
- *( MIME-extension-field CRLF )
-
- extension-token := ietf-token / x-token
-
- hex-octet := "=" 2(DIGIT / "A" / "B" / "C" / "D" / "E" / "F")
- ; Octet must be used for characters > 127, =,
- ; SPACEs or TABs at the ends of lines, and is
- ; recommended for any character not listed in
- ; RFC 2049 as "mail-safe".
-
- iana-token := <A publicly-defined extension token. Tokens
- of this form must be registered with IANA
- as specified in RFC 2048.>
-
-
-
-
-Freed & Borenstein Standards Track [Page 29]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
- ietf-token := <An extension token defined by a
- standards-track RFC and registered
- with IANA.>
-
- id := "Content-ID" ":" msg-id
-
- mechanism := "7bit" / "8bit" / "binary" /
- "quoted-printable" / "base64" /
- ietf-token / x-token
-
- MIME-extension-field := <Any RFC 822 header field which
- begins with the string
- "Content-">
-
- MIME-message-headers := entity-headers
- fields
- version CRLF
- ; The ordering of the header
- ; fields implied by this BNF
- ; definition should be ignored.
-
- MIME-part-headers := entity-headers
- [fields]
- ; Any field not beginning with
- ; "content-" can have no defined
- ; meaning and may be ignored.
- ; The ordering of the header
- ; fields implied by this BNF
- ; definition should be ignored.
-
- parameter := attribute "=" value
-
- ptext := hex-octet / safe-char
-
- qp-line := *(qp-segment transport-padding CRLF)
- qp-part transport-padding
-
- qp-part := qp-section
- ; Maximum length of 76 characters
-
- qp-section := [*(ptext / SPACE / TAB) ptext]
-
- qp-segment := qp-section *(SPACE / TAB) "="
- ; Maximum length of 76 characters
-
- quoted-printable := qp-line *(CRLF qp-line)
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 30]
-
-RFC 2045 Internet Message Bodies November 1996
-
-
- safe-char := <any octet with decimal value of 33 through
- 60 inclusive, and 62 through 126>
- ; Characters not listed as "mail-safe" in
- ; RFC 2049 are also not recommended.
-
- subtype := extension-token / iana-token
-
- token := 1*<any (US-ASCII) CHAR except SPACE, CTLs,
- or tspecials>
-
- transport-padding := *LWSP-char
- ; Composers MUST NOT generate
- ; non-zero length transport
- ; padding, but receivers MUST
- ; be able to handle padding
- ; added by message transports.
-
- tspecials := "(" / ")" / "<" / ">" / "@" /
- "," / ";" / ":" / "\" / <">
- "/" / "[" / "]" / "?" / "="
- ; Must be in quoted-string,
- ; to use within parameter values
-
- type := discrete-type / composite-type
-
- value := token / quoted-string
-
- version := "MIME-Version" ":" 1*DIGIT "." 1*DIGIT
-
- x-token := <The two characters "X-" or "x-" followed, with
- no intervening white space, by any token>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 31]
-
diff --git a/reference/rfc2046 Multipurpose Internet Mail Extensions (2).txt b/reference/rfc2046 Multipurpose Internet Mail Extensions (2).txt
deleted file mode 100644
index 38b23c7..0000000
--- a/reference/rfc2046 Multipurpose Internet Mail Extensions (2).txt
+++ /dev/null
@@ -1,2467 +0,0 @@
-
-
-
-
-
-Network Working Group N. Freed
-Request for Comments: 2046 Innosoft
-Obsoletes: 1521, 1522, 1590 N. Borenstein
-Category: Standards Track First Virtual
- November 1996
-
-
- Multipurpose Internet Mail Extensions
- (MIME) Part Two:
- Media Types
-
-Status of this Memo
-
- This document specifies an Internet standards track protocol for the
- Internet community, and requests discussion and suggestions for
- improvements. Please refer to the current edition of the "Internet
- Official Protocol Standards" (STD 1) for the standardization state
- and status of this protocol. Distribution of this memo is unlimited.
-
-Abstract
-
- STD 11, RFC 822 defines a message representation protocol specifying
- considerable detail about US-ASCII message headers, but which leaves
- the message content, or message body, as flat US-ASCII text. This
- set of documents, collectively called the Multipurpose Internet Mail
- Extensions, or MIME, redefines the format of messages to allow for
-
- (1) textual message bodies in character sets other than
- US-ASCII,
-
- (2) an extensible set of different formats for non-textual
- message bodies,
-
- (3) multi-part message bodies, and
-
- (4) textual header information in character sets other than
- US-ASCII.
-
- These documents are based on earlier work documented in RFC 934, STD
- 11, and RFC 1049, but extends and revises them. Because RFC 822 said
- so little about message bodies, these documents are largely
- orthogonal to (rather than a revision of) RFC 822.
-
- The initial document in this set, RFC 2045, specifies the various
- headers used to describe the structure of MIME messages. This second
- document defines the general structure of the MIME media typing
- system and defines an initial set of media types. The third document,
- RFC 2047, describes extensions to RFC 822 to allow non-US-ASCII text
-
-
-
-Freed & Borenstein Standards Track [Page 1]
-
-RFC 2046 Media Types November 1996
-
-
- data in Internet mail header fields. The fourth document, RFC 2048,
- specifies various IANA registration procedures for MIME-related
- facilities. The fifth and final document, RFC 2049, describes MIME
- conformance criteria as well as providing some illustrative examples
- of MIME message formats, acknowledgements, and the bibliography.
-
- These documents are revisions of RFCs 1521 and 1522, which themselves
- were revisions of RFCs 1341 and 1342. An appendix in RFC 2049
- describes differences and changes from previous versions.
-
-Table of Contents
-
- 1. Introduction ......................................... 3
- 2. Definition of a Top-Level Media Type ................. 4
- 3. Overview Of The Initial Top-Level Media Types ........ 4
- 4. Discrete Media Type Values ........................... 6
- 4.1 Text Media Type ..................................... 6
- 4.1.1 Representation of Line Breaks ..................... 7
- 4.1.2 Charset Parameter ................................. 7
- 4.1.3 Plain Subtype ..................................... 11
- 4.1.4 Unrecognized Subtypes ............................. 11
- 4.2 Image Media Type .................................... 11
- 4.3 Audio Media Type .................................... 11
- 4.4 Video Media Type .................................... 12
- 4.5 Application Media Type .............................. 12
- 4.5.1 Octet-Stream Subtype .............................. 13
- 4.5.2 PostScript Subtype ................................ 14
- 4.5.3 Other Application Subtypes ........................ 17
- 5. Composite Media Type Values .......................... 17
- 5.1 Multipart Media Type ................................ 17
- 5.1.1 Common Syntax ..................................... 19
- 5.1.2 Handling Nested Messages and Multiparts ........... 24
- 5.1.3 Mixed Subtype ..................................... 24
- 5.1.4 Alternative Subtype ............................... 24
- 5.1.5 Digest Subtype .................................... 26
- 5.1.6 Parallel Subtype .................................. 27
- 5.1.7 Other Multipart Subtypes .......................... 28
- 5.2 Message Media Type .................................. 28
- 5.2.1 RFC822 Subtype .................................... 28
- 5.2.2 Partial Subtype ................................... 29
- 5.2.2.1 Message Fragmentation and Reassembly ............ 30
- 5.2.2.2 Fragmentation and Reassembly Example ............ 31
- 5.2.3 External-Body Subtype ............................. 33
- 5.2.4 Other Message Subtypes ............................ 40
- 6. Experimental Media Type Values ....................... 40
- 7. Summary .............................................. 41
- 8. Security Considerations .............................. 41
- 9. Authors' Addresses ................................... 42
-
-
-
-Freed & Borenstein Standards Track [Page 2]
-
-RFC 2046 Media Types November 1996
-
-
- A. Collected Grammar .................................... 43
-
-1. Introduction
-
- The first document in this set, RFC 2045, defines a number of header
- fields, including Content-Type. The Content-Type field is used to
- specify the nature of the data in the body of a MIME entity, by
- giving media type and subtype identifiers, and by providing auxiliary
- information that may be required for certain media types. After the
- type and subtype names, the remainder of the header field is simply a
- set of parameters, specified in an attribute/value notation. The
- ordering of parameters is not significant.
-
- In general, the top-level media type is used to declare the general
- type of data, while the subtype specifies a specific format for that
- type of data. Thus, a media type of "image/xyz" is enough to tell a
- user agent that the data is an image, even if the user agent has no
- knowledge of the specific image format "xyz". Such information can
- be used, for example, to decide whether or not to show a user the raw
- data from an unrecognized subtype -- such an action might be
- reasonable for unrecognized subtypes of "text", but not for
- unrecognized subtypes of "image" or "audio". For this reason,
- registered subtypes of "text", "image", "audio", and "video" should
- not contain embedded information that is really of a different type.
- Such compound formats should be represented using the "multipart" or
- "application" types.
-
- Parameters are modifiers of the media subtype, and as such do not
- fundamentally affect the nature of the content. The set of
- meaningful parameters depends on the media type and subtype. Most
- parameters are associated with a single specific subtype. However, a
- given top-level media type may define parameters which are applicable
- to any subtype of that type. Parameters may be required by their
- defining media type or subtype or they may be optional. MIME
- implementations must also ignore any parameters whose names they do
- not recognize.
-
- MIME's Content-Type header field and media type mechanism has been
- carefully designed to be extensible, and it is expected that the set
- of media type/subtype pairs and their associated parameters will grow
- significantly over time. Several other MIME facilities, such as
- transfer encodings and "message/external-body" access types, are
- likely to have new values defined over time. In order to ensure that
- the set of such values is developed in an orderly, well-specified,
- and public manner, MIME sets up a registration process which uses the
- Internet Assigned Numbers Authority (IANA) as a central registry for
- MIME's various areas of extensibility. The registration process for
- these areas is described in a companion document, RFC 2048.
-
-
-
-Freed & Borenstein Standards Track [Page 3]
-
-RFC 2046 Media Types November 1996
-
-
- The initial seven standard top-level media type are defined and
- described in the remainder of this document.
-
-2. Definition of a Top-Level Media Type
-
- The definition of a top-level media type consists of:
-
- (1) a name and a description of the type, including
- criteria for whether a particular type would qualify
- under that type,
-
- (2) the names and definitions of parameters, if any, which
- are defined for all subtypes of that type (including
- whether such parameters are required or optional),
-
- (3) how a user agent and/or gateway should handle unknown
- subtypes of this type,
-
- (4) general considerations on gatewaying entities of this
- top-level type, if any, and
-
- (5) any restrictions on content-transfer-encodings for
- entities of this top-level type.
-
-3. Overview Of The Initial Top-Level Media Types
-
- The five discrete top-level media types are:
-
- (1) text -- textual information. The subtype "plain" in
- particular indicates plain text containing no
- formatting commands or directives of any sort. Plain
- text is intended to be displayed "as-is". No special
- software is required to get the full meaning of the
- text, aside from support for the indicated character
- set. Other subtypes are to be used for enriched text in
- forms where application software may enhance the
- appearance of the text, but such software must not be
- required in order to get the general idea of the
- content. Possible subtypes of "text" thus include any
- word processor format that can be read without
- resorting to software that understands the format. In
- particular, formats that employ embeddded binary
- formatting information are not considered directly
- readable. A very simple and portable subtype,
- "richtext", was defined in RFC 1341, with a further
- revision in RFC 1896 under the name "enriched".
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 4]
-
-RFC 2046 Media Types November 1996
-
-
- (2) image -- image data. "Image" requires a display device
- (such as a graphical display, a graphics printer, or a
- FAX machine) to view the information. An initial
- subtype is defined for the widely-used image format
- JPEG. . subtypes are defined for two widely-used image
- formats, jpeg and gif.
-
- (3) audio -- audio data. "Audio" requires an audio output
- device (such as a speaker or a telephone) to "display"
- the contents. An initial subtype "basic" is defined in
- this document.
-
- (4) video -- video data. "Video" requires the capability
- to display moving images, typically including
- specialized hardware and software. An initial subtype
- "mpeg" is defined in this document.
-
- (5) application -- some other kind of data, typically
- either uninterpreted binary data or information to be
- processed by an application. The subtype "octet-
- stream" is to be used in the case of uninterpreted
- binary data, in which case the simplest recommended
- action is to offer to write the information into a file
- for the user. The "PostScript" subtype is also defined
- for the transport of PostScript material. Other
- expected uses for "application" include spreadsheets,
- data for mail-based scheduling systems, and languages
- for "active" (computational) messaging, and word
- processing formats that are not directly readable.
- Note that security considerations may exist for some
- types of application data, most notably
- "application/PostScript" and any form of active
- messaging. These issues are discussed later in this
- document.
-
- The two composite top-level media types are:
-
- (1) multipart -- data consisting of multiple entities of
- independent data types. Four subtypes are initially
- defined, including the basic "mixed" subtype specifying
- a generic mixed set of parts, "alternative" for
- representing the same data in multiple formats,
- "parallel" for parts intended to be viewed
- simultaneously, and "digest" for multipart entities in
- which each part has a default type of "message/rfc822".
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 5]
-
-RFC 2046 Media Types November 1996
-
-
- (2) message -- an encapsulated message. A body of media
- type "message" is itself all or a portion of some kind
- of message object. Such objects may or may not in turn
- contain other entities. The "rfc822" subtype is used
- when the encapsulated content is itself an RFC 822
- message. The "partial" subtype is defined for partial
- RFC 822 messages, to permit the fragmented transmission
- of bodies that are thought to be too large to be passed
- through transport facilities in one piece. Another
- subtype, "external-body", is defined for specifying
- large bodies by reference to an external data source.
-
- It should be noted that the list of media type values given here may
- be augmented in time, via the mechanisms described above, and that
- the set of subtypes is expected to grow substantially.
-
-4. Discrete Media Type Values
-
- Five of the seven initial media type values refer to discrete bodies.
- The content of these types must be handled by non-MIME mechanisms;
- they are opaque to MIME processors.
-
-4.1. Text Media Type
-
- The "text" media type is intended for sending material which is
- principally textual in form. A "charset" parameter may be used to
- indicate the character set of the body text for "text" subtypes,
- notably including the subtype "text/plain", which is a generic
- subtype for plain text. Plain text does not provide for or allow
- formatting commands, font attribute specifications, processing
- instructions, interpretation directives, or content markup. Plain
- text is seen simply as a linear sequence of characters, possibly
- interrupted by line breaks or page breaks. Plain text may allow the
- stacking of several characters in the same position in the text.
- Plain text in scripts like Arabic and Hebrew may also include
- facilitites that allow the arbitrary mixing of text segments with
- opposite writing directions.
-
- Beyond plain text, there are many formats for representing what might
- be known as "rich text". An interesting characteristic of many such
- representations is that they are to some extent readable even without
- the software that interprets them. It is useful, then, to
- distinguish them, at the highest level, from such unreadable data as
- images, audio, or text represented in an unreadable form. In the
- absence of appropriate interpretation software, it is reasonable to
- show subtypes of "text" to the user, while it is not reasonable to do
- so with most nontextual data. Such formatted textual data should be
- represented using subtypes of "text".
-
-
-
-Freed & Borenstein Standards Track [Page 6]
-
-RFC 2046 Media Types November 1996
-
-
-4.1.1. Representation of Line Breaks
-
- The canonical form of any MIME "text" subtype MUST always represent a
- line break as a CRLF sequence. Similarly, any occurrence of CRLF in
- MIME "text" MUST represent a line break. Use of CR and LF outside of
- line break sequences is also forbidden.
-
- This rule applies regardless of format or character set or sets
- involved.
-
- NOTE: The proper interpretation of line breaks when a body is
- displayed depends on the media type. In particular, while it is
- appropriate to treat a line break as a transition to a new line when
- displaying a "text/plain" body, this treatment is actually incorrect
- for other subtypes of "text" like "text/enriched" [RFC-1896].
- Similarly, whether or not line breaks should be added during display
- operations is also a function of the media type. It should not be
- necessary to add any line breaks to display "text/plain" correctly,
- whereas proper display of "text/enriched" requires the appropriate
- addition of line breaks.
-
- NOTE: Some protocols defines a maximum line length. E.g. SMTP [RFC-
- 821] allows a maximum of 998 octets before the next CRLF sequence.
- To be transported by such protocols, data which includes too long
- segments without CRLF sequences must be encoded with a suitable
- content-transfer-encoding.
-
-4.1.2. Charset Parameter
-
- A critical parameter that may be specified in the Content-Type field
- for "text/plain" data is the character set. This is specified with a
- "charset" parameter, as in:
-
- Content-type: text/plain; charset=iso-8859-1
-
- Unlike some other parameter values, the values of the charset
- parameter are NOT case sensitive. The default character set, which
- must be assumed in the absence of a charset parameter, is US-ASCII.
-
- The specification for any future subtypes of "text" must specify
- whether or not they will also utilize a "charset" parameter, and may
- possibly restrict its values as well. For other subtypes of "text"
- than "text/plain", the semantics of the "charset" parameter should be
- defined to be identical to those specified here for "text/plain",
- i.e., the body consists entirely of characters in the given charset.
- In particular, definers of future "text" subtypes should pay close
- attention to the implications of multioctet character sets for their
- subtype definitions.
-
-
-
-Freed & Borenstein Standards Track [Page 7]
-
-RFC 2046 Media Types November 1996
-
-
- The charset parameter for subtypes of "text" gives a name of a
- character set, as "character set" is defined in RFC 2045. The rules
- regarding line breaks detailed in the previous section must also be
- observed -- a character set whose definition does not conform to
- these rules cannot be used in a MIME "text" subtype.
-
- An initial list of predefined character set names can be found at the
- end of this section. Additional character sets may be registered
- with IANA.
-
- Other media types than subtypes of "text" might choose to employ the
- charset parameter as defined here, but with the CRLF/line break
- restriction removed. Therefore, all character sets that conform to
- the general definition of "character set" in RFC 2045 can be
- registered for MIME use.
-
- Note that if the specified character set includes 8-bit characters
- and such characters are used in the body, a Content-Transfer-Encoding
- header field and a corresponding encoding on the data are required in
- order to transmit the body via some mail transfer protocols, such as
- SMTP [RFC-821].
-
- The default character set, US-ASCII, has been the subject of some
- confusion and ambiguity in the past. Not only were there some
- ambiguities in the definition, there have been wide variations in
- practice. In order to eliminate such ambiguity and variations in the
- future, it is strongly recommended that new user agents explicitly
- specify a character set as a media type parameter in the Content-Type
- header field. "US-ASCII" does not indicate an arbitrary 7-bit
- character set, but specifies that all octets in the body must be
- interpreted as characters according to the US-ASCII character set.
- National and application-oriented versions of ISO 646 [ISO-646] are
- usually NOT identical to US-ASCII, and in that case their use in
- Internet mail is explicitly discouraged. The omission of the ISO 646
- character set from this document is deliberate in this regard. The
- character set name of "US-ASCII" explicitly refers to the character
- set defined in ANSI X3.4-1986 [US- ASCII]. The new international
- reference version (IRV) of the 1991 edition of ISO 646 is identical
- to US-ASCII. The character set name "ASCII" is reserved and must not
- be used for any purpose.
-
- NOTE: RFC 821 explicitly specifies "ASCII", and references an earlier
- version of the American Standard. Insofar as one of the purposes of
- specifying a media type and character set is to permit the receiver
- to unambiguously determine how the sender intended the coded message
- to be interpreted, assuming anything other than "strict ASCII" as the
- default would risk unintentional and incompatible changes to the
- semantics of messages now being transmitted. This also implies that
-
-
-
-Freed & Borenstein Standards Track [Page 8]
-
-RFC 2046 Media Types November 1996
-
-
- messages containing characters coded according to other versions of
- ISO 646 than US-ASCII and the 1991 IRV, or using code-switching
- procedures (e.g., those of ISO 2022), as well as 8bit or multiple
- octet character encodings MUST use an appropriate character set
- specification to be consistent with MIME.
-
- The complete US-ASCII character set is listed in ANSI X3.4- 1986.
- Note that the control characters including DEL (0-31, 127) have no
- defined meaning in apart from the combination CRLF (US-ASCII values
- 13 and 10) indicating a new line. Two of the characters have de
- facto meanings in wide use: FF (12) often means "start subsequent
- text on the beginning of a new page"; and TAB or HT (9) often (though
- not always) means "move the cursor to the next available column after
- the current position where the column number is a multiple of 8
- (counting the first column as column 0)." Aside from these
- conventions, any use of the control characters or DEL in a body must
- either occur
-
- (1) because a subtype of text other than "plain"
- specifically assigns some additional meaning, or
-
- (2) within the context of a private agreement between the
- sender and recipient. Such private agreements are
- discouraged and should be replaced by the other
- capabilities of this document.
-
- NOTE: An enormous proliferation of character sets exist beyond US-
- ASCII. A large number of partially or totally overlapping character
- sets is NOT a good thing. A SINGLE character set that can be used
- universally for representing all of the world's languages in Internet
- mail would be preferrable. Unfortunately, existing practice in
- several communities seems to point to the continued use of multiple
- character sets in the near future. A small number of standard
- character sets are, therefore, defined for Internet use in this
- document.
-
- The defined charset values are:
-
- (1) US-ASCII -- as defined in ANSI X3.4-1986 [US-ASCII].
-
- (2) ISO-8859-X -- where "X" is to be replaced, as
- necessary, for the parts of ISO-8859 [ISO-8859]. Note
- that the ISO 646 character sets have deliberately been
- omitted in favor of their 8859 replacements, which are
- the designated character sets for Internet mail. As of
- the publication of this document, the legitimate values
- for "X" are the digits 1 through 10.
-
-
-
-
-Freed & Borenstein Standards Track [Page 9]
-
-RFC 2046 Media Types November 1996
-
-
- Characters in the range 128-159 has no assigned meaning in ISO-8859-
- X. Characters with values below 128 in ISO-8859-X have the same
- assigned meaning as they do in US-ASCII.
-
- Part 6 of ISO 8859 (Latin/Arabic alphabet) and part 8 (Latin/Hebrew
- alphabet) includes both characters for which the normal writing
- direction is right to left and characters for which it is left to
- right, but do not define a canonical ordering method for representing
- bi-directional text. The charset values "ISO-8859-6" and "ISO-8859-
- 8", however, specify that the visual method is used [RFC-1556].
-
- All of these character sets are used as pure 7bit or 8bit sets
- without any shift or escape functions. The meaning of shift and
- escape sequences in these character sets is not defined.
-
- The character sets specified above are the ones that were relatively
- uncontroversial during the drafting of MIME. This document does not
- endorse the use of any particular character set other than US-ASCII,
- and recognizes that the future evolution of world character sets
- remains unclear.
-
- Note that the character set used, if anything other than US- ASCII,
- must always be explicitly specified in the Content-Type field.
-
- No character set name other than those defined above may be used in
- Internet mail without the publication of a formal specification and
- its registration with IANA, or by private agreement, in which case
- the character set name must begin with "X-".
-
- Implementors are discouraged from defining new character sets unless
- absolutely necessary.
-
- The "charset" parameter has been defined primarily for the purpose of
- textual data, and is described in this section for that reason.
- However, it is conceivable that non-textual data might also wish to
- specify a charset value for some purpose, in which case the same
- syntax and values should be used.
-
- In general, composition software should always use the "lowest common
- denominator" character set possible. For example, if a body contains
- only US-ASCII characters, it SHOULD be marked as being in the US-
- ASCII character set, not ISO-8859-1, which, like all the ISO-8859
- family of character sets, is a superset of US-ASCII. More generally,
- if a widely-used character set is a subset of another character set,
- and a body contains only characters in the widely-used subset, it
- should be labelled as being in that subset. This will increase the
- chances that the recipient will be able to view the resulting entity
- correctly.
-
-
-
-Freed & Borenstein Standards Track [Page 10]
-
-RFC 2046 Media Types November 1996
-
-
-4.1.3. Plain Subtype
-
- The simplest and most important subtype of "text" is "plain". This
- indicates plain text that does not contain any formatting commands or
- directives. Plain text is intended to be displayed "as-is", that is,
- no interpretation of embedded formatting commands, font attribute
- specifications, processing instructions, interpretation directives,
- or content markup should be necessary for proper display. The
- default media type of "text/plain; charset=us-ascii" for Internet
- mail describes existing Internet practice. That is, it is the type
- of body defined by RFC 822.
-
- No other "text" subtype is defined by this document.
-
-4.1.4. Unrecognized Subtypes
-
- Unrecognized subtypes of "text" should be treated as subtype "plain"
- as long as the MIME implementation knows how to handle the charset.
- Unrecognized subtypes which also specify an unrecognized charset
- should be treated as "application/octet- stream".
-
-4.2. Image Media Type
-
- A media type of "image" indicates that the body contains an image.
- The subtype names the specific image format. These names are not
- case sensitive. An initial subtype is "jpeg" for the JPEG format
- using JFIF encoding [JPEG].
-
- The list of "image" subtypes given here is neither exclusive nor
- exhaustive, and is expected to grow as more types are registered with
- IANA, as described in RFC 2048.
-
- Unrecognized subtypes of "image" should at a miniumum be treated as
- "application/octet-stream". Implementations may optionally elect to
- pass subtypes of "image" that they do not specifically recognize to a
- secure and robust general-purpose image viewing application, if such
- an application is available.
-
- NOTE: Using of a generic-purpose image viewing application this way
- inherits the security problems of the most dangerous type supported
- by the application.
-
-4.3. Audio Media Type
-
- A media type of "audio" indicates that the body contains audio data.
- Although there is not yet a consensus on an "ideal" audio format for
- use with computers, there is a pressing need for a format capable of
- providing interoperable behavior.
-
-
-
-Freed & Borenstein Standards Track [Page 11]
-
-RFC 2046 Media Types November 1996
-
-
- The initial subtype of "basic" is specified to meet this requirement
- by providing an absolutely minimal lowest common denominator audio
- format. It is expected that richer formats for higher quality and/or
- lower bandwidth audio will be defined by a later document.
-
- The content of the "audio/basic" subtype is single channel audio
- encoded using 8bit ISDN mu-law [PCM] at a sample rate of 8000 Hz.
-
- Unrecognized subtypes of "audio" should at a miniumum be treated as
- "application/octet-stream". Implementations may optionally elect to
- pass subtypes of "audio" that they do not specifically recognize to a
- robust general-purpose audio playing application, if such an
- application is available.
-
-4.4. Video Media Type
-
- A media type of "video" indicates that the body contains a time-
- varying-picture image, possibly with color and coordinated sound.
- The term 'video' is used in its most generic sense, rather than with
- reference to any particular technology or format, and is not meant to
- preclude subtypes such as animated drawings encoded compactly. The
- subtype "mpeg" refers to video coded according to the MPEG standard
- [MPEG].
-
- Note that although in general this document strongly discourages the
- mixing of multiple media in a single body, it is recognized that many
- so-called video formats include a representation for synchronized
- audio, and this is explicitly permitted for subtypes of "video".
-
- Unrecognized subtypes of "video" should at a minumum be treated as
- "application/octet-stream". Implementations may optionally elect to
- pass subtypes of "video" that they do not specifically recognize to a
- robust general-purpose video display application, if such an
- application is available.
-
-4.5. Application Media Type
-
- The "application" media type is to be used for discrete data which do
- not fit in any of the other categories, and particularly for data to
- be processed by some type of application program. This is
- information which must be processed by an application before it is
- viewable or usable by a user. Expected uses for the "application"
- media type include file transfer, spreadsheets, data for mail-based
- scheduling systems, and languages for "active" (computational)
- material. (The latter, in particular, can pose security problems
- which must be understood by implementors, and are considered in
- detail in the discussion of the "application/PostScript" media type.)
-
-
-
-
-Freed & Borenstein Standards Track [Page 12]
-
-RFC 2046 Media Types November 1996
-
-
- For example, a meeting scheduler might define a standard
- representation for information about proposed meeting dates. An
- intelligent user agent would use this information to conduct a dialog
- with the user, and might then send additional material based on that
- dialog. More generally, there have been several "active" messaging
- languages developed in which programs in a suitably specialized
- language are transported to a remote location and automatically run
- in the recipient's environment.
-
- Such applications may be defined as subtypes of the "application"
- media type. This document defines two subtypes:
-
- octet-stream, and PostScript.
-
- The subtype of "application" will often be either the name or include
- part of the name of the application for which the data are intended.
- This does not mean, however, that any application program name may be
- used freely as a subtype of "application".
-
-4.5.1. Octet-Stream Subtype
-
- The "octet-stream" subtype is used to indicate that a body contains
- arbitrary binary data. The set of currently defined parameters is:
-
- (1) TYPE -- the general type or category of binary data.
- This is intended as information for the human recipient
- rather than for any automatic processing.
-
- (2) PADDING -- the number of bits of padding that were
- appended to the bit-stream comprising the actual
- contents to produce the enclosed 8bit byte-oriented
- data. This is useful for enclosing a bit-stream in a
- body when the total number of bits is not a multiple of
- 8.
-
- Both of these parameters are optional.
-
- An additional parameter, "CONVERSIONS", was defined in RFC 1341 but
- has since been removed. RFC 1341 also defined the use of a "NAME"
- parameter which gave a suggested file name to be used if the data
- were to be written to a file. This has been deprecated in
- anticipation of a separate Content-Disposition header field, to be
- defined in a subsequent RFC.
-
- The recommended action for an implementation that receives an
- "application/octet-stream" entity is to simply offer to put the data
- in a file, with any Content-Transfer-Encoding undone, or perhaps to
- use it as input to a user-specified process.
-
-
-
-Freed & Borenstein Standards Track [Page 13]
-
-RFC 2046 Media Types November 1996
-
-
- To reduce the danger of transmitting rogue programs, it is strongly
- recommended that implementations NOT implement a path-search
- mechanism whereby an arbitrary program named in the Content-Type
- parameter (e.g., an "interpreter=" parameter) is found and executed
- using the message body as input.
-
-4.5.2. PostScript Subtype
-
- A media type of "application/postscript" indicates a PostScript
- program. Currently two variants of the PostScript language are
- allowed; the original level 1 variant is described in [POSTSCRIPT]
- and the more recent level 2 variant is described in [POSTSCRIPT2].
-
- PostScript is a registered trademark of Adobe Systems, Inc. Use of
- the MIME media type "application/postscript" implies recognition of
- that trademark and all the rights it entails.
-
- The PostScript language definition provides facilities for internal
- labelling of the specific language features a given program uses.
- This labelling, called the PostScript document structuring
- conventions, or DSC, is very general and provides substantially more
- information than just the language level. The use of document
- structuring conventions, while not required, is strongly recommended
- as an aid to interoperability. Documents which lack proper
- structuring conventions cannot be tested to see whether or not they
- will work in a given environment. As such, some systems may assume
- the worst and refuse to process unstructured documents.
-
- The execution of general-purpose PostScript interpreters entails
- serious security risks, and implementors are discouraged from simply
- sending PostScript bodies to "off- the-shelf" interpreters. While it
- is usually safe to send PostScript to a printer, where the potential
- for harm is greatly constrained by typical printer environments,
- implementors should consider all of the following before they add
- interactive display of PostScript bodies to their MIME readers.
-
- The remainder of this section outlines some, though probably not all,
- of the possible problems with the transport of PostScript entities.
-
- (1) Dangerous operations in the PostScript language
- include, but may not be limited to, the PostScript
- operators "deletefile", "renamefile", "filenameforall",
- and "file". "File" is only dangerous when applied to
- something other than standard input or output.
- Implementations may also define additional nonstandard
- file operators; these may also pose a threat to
- security. "Filenameforall", the wildcard file search
- operator, may appear at first glance to be harmless.
-
-
-
-Freed & Borenstein Standards Track [Page 14]
-
-RFC 2046 Media Types November 1996
-
-
- Note, however, that this operator has the potential to
- reveal information about what files the recipient has
- access to, and this information may itself be
- sensitive. Message senders should avoid the use of
- potentially dangerous file operators, since these
- operators are quite likely to be unavailable in secure
- PostScript implementations. Message receiving and
- displaying software should either completely disable
- all potentially dangerous file operators or take
- special care not to delegate any special authority to
- their operation. These operators should be viewed as
- being done by an outside agency when interpreting
- PostScript documents. Such disabling and/or checking
- should be done completely outside of the reach of the
- PostScript language itself; care should be taken to
- insure that no method exists for re-enabling full-
- function versions of these operators.
-
- (2) The PostScript language provides facilities for exiting
- the normal interpreter, or server, loop. Changes made
- in this "outer" environment are customarily retained
- across documents, and may in some cases be retained
- semipermanently in nonvolatile memory. The operators
- associated with exiting the interpreter loop have the
- potential to interfere with subsequent document
- processing. As such, their unrestrained use
- constitutes a threat of service denial. PostScript
- operators that exit the interpreter loop include, but
- may not be limited to, the exitserver and startjob
- operators. Message sending software should not
- generate PostScript that depends on exiting the
- interpreter loop to operate, since the ability to exit
- will probably be unavailable in secure PostScript
- implementations. Message receiving and displaying
- software should completely disable the ability to make
- retained changes to the PostScript environment by
- eliminating or disabling the "startjob" and
- "exitserver" operations. If these operations cannot be
- eliminated or completely disabled the password
- associated with them should at least be set to a hard-
- to-guess value.
-
- (3) PostScript provides operators for setting system-wide
- and device-specific parameters. These parameter
- settings may be retained across jobs and may
- potentially pose a threat to the correct operation of
- the interpreter. The PostScript operators that set
- system and device parameters include, but may not be
-
-
-
-Freed & Borenstein Standards Track [Page 15]
-
-RFC 2046 Media Types November 1996
-
-
- limited to, the "setsystemparams" and "setdevparams"
- operators. Message sending software should not
- generate PostScript that depends on the setting of
- system or device parameters to operate correctly. The
- ability to set these parameters will probably be
- unavailable in secure PostScript implementations.
- Message receiving and displaying software should
- disable the ability to change system and device
- parameters. If these operators cannot be completely
- disabled the password associated with them should at
- least be set to a hard-to-guess value.
-
- (4) Some PostScript implementations provide nonstandard
- facilities for the direct loading and execution of
- machine code. Such facilities are quite obviously open
- to substantial abuse. Message sending software should
- not make use of such features. Besides being totally
- hardware-specific, they are also likely to be
- unavailable in secure implementations of PostScript.
- Message receiving and displaying software should not
- allow such operators to be used if they exist.
-
- (5) PostScript is an extensible language, and many, if not
- most, implementations of it provide a number of their
- own extensions. This document does not deal with such
- extensions explicitly since they constitute an unknown
- factor. Message sending software should not make use
- of nonstandard extensions; they are likely to be
- missing from some implementations. Message receiving
- and displaying software should make sure that any
- nonstandard PostScript operators are secure and don't
- present any kind of threat.
-
- (6) It is possible to write PostScript that consumes huge
- amounts of various system resources. It is also
- possible to write PostScript programs that loop
- indefinitely. Both types of programs have the
- potential to cause damage if sent to unsuspecting
- recipients. Message-sending software should avoid the
- construction and dissemination of such programs, which
- is antisocial. Message receiving and displaying
- software should provide appropriate mechanisms to abort
- processing after a reasonable amount of time has
- elapsed. In addition, PostScript interpreters should be
- limited to the consumption of only a reasonable amount
- of any given system resource.
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 16]
-
-RFC 2046 Media Types November 1996
-
-
- (7) It is possible to include raw binary information inside
- PostScript in various forms. This is not recommended
- for use in Internet mail, both because it is not
- supported by all PostScript interpreters and because it
- significantly complicates the use of a MIME Content-
- Transfer-Encoding. (Without such binary, PostScript
- may typically be viewed as line-oriented data. The
- treatment of CRLF sequences becomes extremely
- problematic if binary and line-oriented data are mixed
- in a single Postscript data stream.)
-
- (8) Finally, bugs may exist in some PostScript interpreters
- which could possibly be exploited to gain unauthorized
- access to a recipient's system. Apart from noting this
- possibility, there is no specific action to take to
- prevent this, apart from the timely correction of such
- bugs if any are found.
-
-4.5.3. Other Application Subtypes
-
- It is expected that many other subtypes of "application" will be
- defined in the future. MIME implementations must at a minimum treat
- any unrecognized subtypes as being equivalent to "application/octet-
- stream".
-
-5. Composite Media Type Values
-
- The remaining two of the seven initial Content-Type values refer to
- composite entities. Composite entities are handled using MIME
- mechanisms -- a MIME processor typically handles the body directly.
-
-5.1. Multipart Media Type
-
- In the case of multipart entities, in which one or more different
- sets of data are combined in a single body, a "multipart" media type
- field must appear in the entity's header. The body must then contain
- one or more body parts, each preceded by a boundary delimiter line,
- and the last one followed by a closing boundary delimiter line.
- After its boundary delimiter line, each body part then consists of a
- header area, a blank line, and a body area. Thus a body part is
- similar to an RFC 822 message in syntax, but different in meaning.
-
- A body part is an entity and hence is NOT to be interpreted as
- actually being an RFC 822 message. To begin with, NO header fields
- are actually required in body parts. A body part that starts with a
- blank line, therefore, is allowed and is a body part for which all
- default values are to be assumed. In such a case, the absence of a
- Content-Type header usually indicates that the corresponding body has
-
-
-
-Freed & Borenstein Standards Track [Page 17]
-
-RFC 2046 Media Types November 1996
-
-
- a content-type of "text/plain; charset=US-ASCII".
-
- The only header fields that have defined meaning for body parts are
- those the names of which begin with "Content-". All other header
- fields may be ignored in body parts. Although they should generally
- be retained if at all possible, they may be discarded by gateways if
- necessary. Such other fields are permitted to appear in body parts
- but must not be depended on. "X-" fields may be created for
- experimental or private purposes, with the recognition that the
- information they contain may be lost at some gateways.
-
- NOTE: The distinction between an RFC 822 message and a body part is
- subtle, but important. A gateway between Internet and X.400 mail,
- for example, must be able to tell the difference between a body part
- that contains an image and a body part that contains an encapsulated
- message, the body of which is a JPEG image. In order to represent
- the latter, the body part must have "Content-Type: message/rfc822",
- and its body (after the blank line) must be the encapsulated message,
- with its own "Content-Type: image/jpeg" header field. The use of
- similar syntax facilitates the conversion of messages to body parts,
- and vice versa, but the distinction between the two must be
- understood by implementors. (For the special case in which parts
- actually are messages, a "digest" subtype is also defined.)
-
- As stated previously, each body part is preceded by a boundary
- delimiter line that contains the boundary delimiter. The boundary
- delimiter MUST NOT appear inside any of the encapsulated parts, on a
- line by itself or as the prefix of any line. This implies that it is
- crucial that the composing agent be able to choose and specify a
- unique boundary parameter value that does not contain the boundary
- parameter value of an enclosing multipart as a prefix.
-
- All present and future subtypes of the "multipart" type must use an
- identical syntax. Subtypes may differ in their semantics, and may
- impose additional restrictions on syntax, but must conform to the
- required syntax for the "multipart" type. This requirement ensures
- that all conformant user agents will at least be able to recognize
- and separate the parts of any multipart entity, even those of an
- unrecognized subtype.
-
- As stated in the definition of the Content-Transfer-Encoding field
- [RFC 2045], no encoding other than "7bit", "8bit", or "binary" is
- permitted for entities of type "multipart". The "multipart" boundary
- delimiters and header fields are always represented as 7bit US-ASCII
- in any case (though the header fields may encode non-US-ASCII header
- text as per RFC 2047) and data within the body parts can be encoded
- on a part-by-part basis, with Content-Transfer-Encoding fields for
- each appropriate body part.
-
-
-
-Freed & Borenstein Standards Track [Page 18]
-
-RFC 2046 Media Types November 1996
-
-
-5.1.1. Common Syntax
-
- This section defines a common syntax for subtypes of "multipart".
- All subtypes of "multipart" must use this syntax. A simple example
- of a multipart message also appears in this section. An example of a
- more complex multipart message is given in RFC 2049.
-
- The Content-Type field for multipart entities requires one parameter,
- "boundary". The boundary delimiter line is then defined as a line
- consisting entirely of two hyphen characters ("-", decimal value 45)
- followed by the boundary parameter value from the Content-Type header
- field, optional linear whitespace, and a terminating CRLF.
-
- NOTE: The hyphens are for rough compatibility with the earlier RFC
- 934 method of message encapsulation, and for ease of searching for
- the boundaries in some implementations. However, it should be noted
- that multipart messages are NOT completely compatible with RFC 934
- encapsulations; in particular, they do not obey RFC 934 quoting
- conventions for embedded lines that begin with hyphens. This
- mechanism was chosen over the RFC 934 mechanism because the latter
- causes lines to grow with each level of quoting. The combination of
- this growth with the fact that SMTP implementations sometimes wrap
- long lines made the RFC 934 mechanism unsuitable for use in the event
- that deeply-nested multipart structuring is ever desired.
-
- WARNING TO IMPLEMENTORS: The grammar for parameters on the Content-
- type field is such that it is often necessary to enclose the boundary
- parameter values in quotes on the Content-type line. This is not
- always necessary, but never hurts. Implementors should be sure to
- study the grammar carefully in order to avoid producing invalid
- Content-type fields. Thus, a typical "multipart" Content-Type header
- field might look like this:
-
- Content-Type: multipart/mixed; boundary=gc0p4Jq0M2Yt08j34c0p
-
- But the following is not valid:
-
- Content-Type: multipart/mixed; boundary=gc0pJq0M:08jU534c0p
-
- (because of the colon) and must instead be represented as
-
- Content-Type: multipart/mixed; boundary="gc0pJq0M:08jU534c0p"
-
- This Content-Type value indicates that the content consists of one or
- more parts, each with a structure that is syntactically identical to
- an RFC 822 message, except that the header area is allowed to be
- completely empty, and that the parts are each preceded by the line
-
-
-
-
-Freed & Borenstein Standards Track [Page 19]
-
-RFC 2046 Media Types November 1996
-
-
- --gc0pJq0M:08jU534c0p
-
- The boundary delimiter MUST occur at the beginning of a line, i.e.,
- following a CRLF, and the initial CRLF is considered to be attached
- to the boundary delimiter line rather than part of the preceding
- part. The boundary may be followed by zero or more characters of
- linear whitespace. It is then terminated by either another CRLF and
- the header fields for the next part, or by two CRLFs, in which case
- there are no header fields for the next part. If no Content-Type
- field is present it is assumed to be "message/rfc822" in a
- "multipart/digest" and "text/plain" otherwise.
-
- NOTE: The CRLF preceding the boundary delimiter line is conceptually
- attached to the boundary so that it is possible to have a part that
- does not end with a CRLF (line break). Body parts that must be
- considered to end with line breaks, therefore, must have two CRLFs
- preceding the boundary delimiter line, the first of which is part of
- the preceding body part, and the second of which is part of the
- encapsulation boundary.
-
- Boundary delimiters must not appear within the encapsulated material,
- and must be no longer than 70 characters, not counting the two
- leading hyphens.
-
- The boundary delimiter line following the last body part is a
- distinguished delimiter that indicates that no further body parts
- will follow. Such a delimiter line is identical to the previous
- delimiter lines, with the addition of two more hyphens after the
- boundary parameter value.
-
- --gc0pJq0M:08jU534c0p--
-
- NOTE TO IMPLEMENTORS: Boundary string comparisons must compare the
- boundary value with the beginning of each candidate line. An exact
- match of the entire candidate line is not required; it is sufficient
- that the boundary appear in its entirety following the CRLF.
-
- There appears to be room for additional information prior to the
- first boundary delimiter line and following the final boundary
- delimiter line. These areas should generally be left blank, and
- implementations must ignore anything that appears before the first
- boundary delimiter line or after the last one.
-
- NOTE: These "preamble" and "epilogue" areas are generally not used
- because of the lack of proper typing of these parts and the lack of
- clear semantics for handling these areas at gateways, particularly
- X.400 gateways. However, rather than leaving the preamble area
- blank, many MIME implementations have found this to be a convenient
-
-
-
-Freed & Borenstein Standards Track [Page 20]
-
-RFC 2046 Media Types November 1996
-
-
- place to insert an explanatory note for recipients who read the
- message with pre-MIME software, since such notes will be ignored by
- MIME-compliant software.
-
- NOTE: Because boundary delimiters must not appear in the body parts
- being encapsulated, a user agent must exercise care to choose a
- unique boundary parameter value. The boundary parameter value in the
- example above could have been the result of an algorithm designed to
- produce boundary delimiters with a very low probability of already
- existing in the data to be encapsulated without having to prescan the
- data. Alternate algorithms might result in more "readable" boundary
- delimiters for a recipient with an old user agent, but would require
- more attention to the possibility that the boundary delimiter might
- appear at the beginning of some line in the encapsulated part. The
- simplest boundary delimiter line possible is something like "---",
- with a closing boundary delimiter line of "-----".
-
- As a very simple example, the following multipart message has two
- parts, both of them plain text, one of them explicitly typed and one
- of them implicitly typed:
-
- From: Nathaniel Borenstein <nsb at bellcore.com>
- To: Ned Freed <ned at innosoft.com>
- Date: Sun, 21 Mar 1993 23:56:48 -0800 (PST)
- Subject: Sample message
- MIME-Version: 1.0
- Content-type: multipart/mixed; boundary="simple boundary"
-
- This is the preamble. It is to be ignored, though it
- is a handy place for composition agents to include an
- explanatory note to non-MIME conformant readers.
-
- --simple boundary
-
- This is implicitly typed plain US-ASCII text.
- It does NOT end with a linebreak.
- --simple boundary
- Content-type: text/plain; charset=us-ascii
-
- This is explicitly typed plain US-ASCII text.
- It DOES end with a linebreak.
-
- --simple boundary--
-
- This is the epilogue. It is also to be ignored.
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 21]
-
-RFC 2046 Media Types November 1996
-
-
- The use of a media type of "multipart" in a body part within another
- "multipart" entity is explicitly allowed. In such cases, for obvious
- reasons, care must be taken to ensure that each nested "multipart"
- entity uses a different boundary delimiter. See RFC 2049 for an
- example of nested "multipart" entities.
-
- The use of the "multipart" media type with only a single body part
- may be useful in certain contexts, and is explicitly permitted.
-
- NOTE: Experience has shown that a "multipart" media type with a
- single body part is useful for sending non-text media types. It has
- the advantage of providing the preamble as a place to include
- decoding instructions. In addition, a number of SMTP gateways move
- or remove the MIME headers, and a clever MIME decoder can take a good
- guess at multipart boundaries even in the absence of the Content-Type
- header and thereby successfully decode the message.
-
- The only mandatory global parameter for the "multipart" media type is
- the boundary parameter, which consists of 1 to 70 characters from a
- set of characters known to be very robust through mail gateways, and
- NOT ending with white space. (If a boundary delimiter line appears to
- end with white space, the white space must be presumed to have been
- added by a gateway, and must be deleted.) It is formally specified
- by the following BNF:
-
- boundary := 0*69<bchars> bcharsnospace
-
- bchars := bcharsnospace / " "
-
- bcharsnospace := DIGIT / ALPHA / "'" / "(" / ")" /
- "+" / "_" / "," / "-" / "." /
- "/" / ":" / "=" / "?"
-
- Overall, the body of a "multipart" entity may be specified as
- follows:
-
- dash-boundary := "--" boundary
- ; boundary taken from the value of
- ; boundary parameter of the
- ; Content-Type field.
-
- multipart-body := [preamble CRLF]
- dash-boundary transport-padding CRLF
- body-part *encapsulation
- close-delimiter transport-padding
- [CRLF epilogue]
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 22]
-
-RFC 2046 Media Types November 1996
-
-
- transport-padding := *LWSP-char
- ; Composers MUST NOT generate
- ; non-zero length transport
- ; padding, but receivers MUST
- ; be able to handle padding
- ; added by message transports.
-
- encapsulation := delimiter transport-padding
- CRLF body-part
-
- delimiter := CRLF dash-boundary
-
- close-delimiter := delimiter "--"
-
- preamble := discard-text
-
- epilogue := discard-text
-
- discard-text := *(*text CRLF) *text
- ; May be ignored or discarded.
-
- body-part := MIME-part-headers [CRLF *OCTET]
- ; Lines in a body-part must not start
- ; with the specified dash-boundary and
- ; the delimiter must not appear anywhere
- ; in the body part. Note that the
- ; semantics of a body-part differ from
- ; the semantics of a message, as
- ; described in the text.
-
- OCTET := <any 0-255 octet value>
-
- IMPORTANT: The free insertion of linear-white-space and RFC 822
- comments between the elements shown in this BNF is NOT allowed since
- this BNF does not specify a structured header field.
-
- NOTE: In certain transport enclaves, RFC 822 restrictions such as
- the one that limits bodies to printable US-ASCII characters may not
- be in force. (That is, the transport domains may exist that resemble
- standard Internet mail transport as specified in RFC 821 and assumed
- by RFC 822, but without certain restrictions.) The relaxation of
- these restrictions should be construed as locally extending the
- definition of bodies, for example to include octets outside of the
- US-ASCII range, as long as these extensions are supported by the
- transport and adequately documented in the Content- Transfer-Encoding
- header field. However, in no event are headers (either message
- headers or body part headers) allowed to contain anything other than
- US-ASCII characters.
-
-
-
-Freed & Borenstein Standards Track [Page 23]
-
-RFC 2046 Media Types November 1996
-
-
- NOTE: Conspicuously missing from the "multipart" type is a notion of
- structured, related body parts. It is recommended that those wishing
- to provide more structured or integrated multipart messaging
- facilities should define subtypes of multipart that are syntactically
- identical but define relationships between the various parts. For
- example, subtypes of multipart could be defined that include a
- distinguished part which in turn is used to specify the relationships
- between the other parts, probably referring to them by their
- Content-ID field. Old implementations will not recognize the new
- subtype if this approach is used, but will treat it as
- multipart/mixed and will thus be able to show the user the parts that
- are recognized.
-
-5.1.2. Handling Nested Messages and Multiparts
-
- The "message/rfc822" subtype defined in a subsequent section of this
- document has no terminating condition other than running out of data.
- Similarly, an improperly truncated "multipart" entity may not have
- any terminating boundary marker, and can turn up operationally due to
- mail system malfunctions.
-
- It is essential that such entities be handled correctly when they are
- themselves imbedded inside of another "multipart" structure. MIME
- implementations are therefore required to recognize outer level
- boundary markers at ANY level of inner nesting. It is not sufficient
- to only check for the next expected marker or other terminating
- condition.
-
-5.1.3. Mixed Subtype
-
- The "mixed" subtype of "multipart" is intended for use when the body
- parts are independent and need to be bundled in a particular order.
- Any "multipart" subtypes that an implementation does not recognize
- must be treated as being of subtype "mixed".
-
-5.1.4. Alternative Subtype
-
- The "multipart/alternative" type is syntactically identical to
- "multipart/mixed", but the semantics are different. In particular,
- each of the body parts is an "alternative" version of the same
- information.
-
- Systems should recognize that the content of the various parts are
- interchangeable. Systems should choose the "best" type based on the
- local environment and references, in some cases even through user
- interaction. As with "multipart/mixed", the order of body parts is
- significant. In this case, the alternatives appear in an order of
- increasing faithfulness to the original content. In general, the
-
-
-
-Freed & Borenstein Standards Track [Page 24]
-
-RFC 2046 Media Types November 1996
-
-
- best choice is the LAST part of a type supported by the recipient
- system's local environment.
-
- "Multipart/alternative" may be used, for example, to send a message
- in a fancy text format in such a way that it can easily be displayed
- anywhere:
-
- From: Nathaniel Borenstein <nsb at bellcore.com>
- To: Ned Freed <ned at innosoft.com>
- Date: Mon, 22 Mar 1993 09:41:09 -0800 (PST)
- Subject: Formatted text mail
- MIME-Version: 1.0
- Content-Type: multipart/alternative; boundary=boundary42
-
- --boundary42
- Content-Type: text/plain; charset=us-ascii
-
- ... plain text version of message goes here ...
-
- --boundary42
- Content-Type: text/enriched
-
- ... RFC 1896 text/enriched version of same message
- goes here ...
-
- --boundary42
- Content-Type: application/x-whatever
-
- ... fanciest version of same message goes here ...
-
- --boundary42--
-
- In this example, users whose mail systems understood the
- "application/x-whatever" format would see only the fancy version,
- while other users would see only the enriched or plain text version,
- depending on the capabilities of their system.
-
- In general, user agents that compose "multipart/alternative" entities
- must place the body parts in increasing order of preference, that is,
- with the preferred format last. For fancy text, the sending user
- agent should put the plainest format first and the richest format
- last. Receiving user agents should pick and display the last format
- they are capable of displaying. In the case where one of the
- alternatives is itself of type "multipart" and contains unrecognized
- sub-parts, the user agent may choose either to show that alternative,
- an earlier alternative, or both.
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 25]
-
-RFC 2046 Media Types November 1996
-
-
- NOTE: From an implementor's perspective, it might seem more sensible
- to reverse this ordering, and have the plainest alternative last.
- However, placing the plainest alternative first is the friendliest
- possible option when "multipart/alternative" entities are viewed
- using a non-MIME-conformant viewer. While this approach does impose
- some burden on conformant MIME viewers, interoperability with older
- mail readers was deemed to be more important in this case.
-
- It may be the case that some user agents, if they can recognize more
- than one of the formats, will prefer to offer the user the choice of
- which format to view. This makes sense, for example, if a message
- includes both a nicely- formatted image version and an easily-edited
- text version. What is most critical, however, is that the user not
- automatically be shown multiple versions of the same data. Either
- the user should be shown the last recognized version or should be
- given the choice.
-
- THE SEMANTICS OF CONTENT-ID IN MULTIPART/ALTERNATIVE: Each part of a
- "multipart/alternative" entity represents the same data, but the
- mappings between the two are not necessarily without information
- loss. For example, information is lost when translating ODA to
- PostScript or plain text. It is recommended that each part should
- have a different Content-ID value in the case where the information
- content of the two parts is not identical. And when the information
- content is identical -- for example, where several parts of type
- "message/external-body" specify alternate ways to access the
- identical data -- the same Content-ID field value should be used, to
- optimize any caching mechanisms that might be present on the
- recipient's end. However, the Content-ID values used by the parts
- should NOT be the same Content-ID value that describes the
- "multipart/alternative" as a whole, if there is any such Content-ID
- field. That is, one Content-ID value will refer to the
- "multipart/alternative" entity, while one or more other Content-ID
- values will refer to the parts inside it.
-
-5.1.5. Digest Subtype
-
- This document defines a "digest" subtype of the "multipart" Content-
- Type. This type is syntactically identical to "multipart/mixed", but
- the semantics are different. In particular, in a digest, the default
- Content-Type value for a body part is changed from "text/plain" to
- "message/rfc822". This is done to allow a more readable digest
- format that is largely compatible (except for the quoting convention)
- with RFC 934.
-
- Note: Though it is possible to specify a Content-Type value for a
- body part in a digest which is other than "message/rfc822", such as a
- "text/plain" part containing a description of the material in the
-
-
-
-Freed & Borenstein Standards Track [Page 26]
-
-RFC 2046 Media Types November 1996
-
-
- digest, actually doing so is undesireble. The "multipart/digest"
- Content-Type is intended to be used to send collections of messages.
- If a "text/plain" part is needed, it should be included as a seperate
- part of a "multipart/mixed" message.
-
- A digest in this format might, then, look something like this:
-
- From: Moderator-Address
- To: Recipient-List
- Date: Mon, 22 Mar 1994 13:34:51 +0000
- Subject: Internet Digest, volume 42
- MIME-Version: 1.0
- Content-Type: multipart/mixed;
- boundary="---- main boundary ----"
-
- ------ main boundary ----
-
- ...Introductory text or table of contents...
-
- ------ main boundary ----
- Content-Type: multipart/digest;
- boundary="---- next message ----"
-
- ------ next message ----
-
- From: someone-else
- Date: Fri, 26 Mar 1993 11:13:32 +0200
- Subject: my opinion
-
- ...body goes here ...
-
- ------ next message ----
-
- From: someone-else-again
- Date: Fri, 26 Mar 1993 10:07:13 -0500
- Subject: my different opinion
-
- ... another body goes here ...
-
- ------ next message ------
-
- ------ main boundary ------
-
-5.1.6. Parallel Subtype
-
- This document defines a "parallel" subtype of the "multipart"
- Content-Type. This type is syntactically identical to
- "multipart/mixed", but the semantics are different. In particular,
-
-
-
-Freed & Borenstein Standards Track [Page 27]
-
-RFC 2046 Media Types November 1996
-
-
- in a parallel entity, the order of body parts is not significant.
-
- A common presentation of this type is to display all of the parts
- simultaneously on hardware and software that are capable of doing so.
- However, composing agents should be aware that many mail readers will
- lack this capability and will show the parts serially in any event.
-
-5.1.7. Other Multipart Subtypes
-
- Other "multipart" subtypes are expected in the future. MIME
- implementations must in general treat unrecognized subtypes of
- "multipart" as being equivalent to "multipart/mixed".
-
-5.2. Message Media Type
-
- It is frequently desirable, in sending mail, to encapsulate another
- mail message. A special media type, "message", is defined to
- facilitate this. In particular, the "rfc822" subtype of "message" is
- used to encapsulate RFC 822 messages.
-
- NOTE: It has been suggested that subtypes of "message" might be
- defined for forwarded or rejected messages. However, forwarded and
- rejected messages can be handled as multipart messages in which the
- first part contains any control or descriptive information, and a
- second part, of type "message/rfc822", is the forwarded or rejected
- message. Composing rejection and forwarding messages in this manner
- will preserve the type information on the original message and allow
- it to be correctly presented to the recipient, and hence is strongly
- encouraged.
-
- Subtypes of "message" often impose restrictions on what encodings are
- allowed. These restrictions are described in conjunction with each
- specific subtype.
-
- Mail gateways, relays, and other mail handling agents are commonly
- known to alter the top-level header of an RFC 822 message. In
- particular, they frequently add, remove, or reorder header fields.
- These operations are explicitly forbidden for the encapsulated
- headers embedded in the bodies of messages of type "message."
-
-5.2.1. RFC822 Subtype
-
- A media type of "message/rfc822" indicates that the body contains an
- encapsulated message, with the syntax of an RFC 822 message.
- However, unlike top-level RFC 822 messages, the restriction that each
- "message/rfc822" body must include a "From", "Date", and at least one
- destination header is removed and replaced with the requirement that
- at least one of "From", "Subject", or "Date" must be present.
-
-
-
-Freed & Borenstein Standards Track [Page 28]
-
-RFC 2046 Media Types November 1996
-
-
- It should be noted that, despite the use of the numbers "822", a
- "message/rfc822" entity isn't restricted to material in strict
- conformance to RFC822, nor are the semantics of "message/rfc822"
- objects restricted to the semantics defined in RFC822. More
- specifically, a "message/rfc822" message could well be a News article
- or a MIME message.
-
- No encoding other than "7bit", "8bit", or "binary" is permitted for
- the body of a "message/rfc822" entity. The message header fields are
- always US-ASCII in any case, and data within the body can still be
- encoded, in which case the Content-Transfer-Encoding header field in
- the encapsulated message will reflect this. Non-US-ASCII text in the
- headers of an encapsulated message can be specified using the
- mechanisms described in RFC 2047.
-
-5.2.2. Partial Subtype
-
- The "partial" subtype is defined to allow large entities to be
- delivered as several separate pieces of mail and automatically
- reassembled by a receiving user agent. (The concept is similar to IP
- fragmentation and reassembly in the basic Internet Protocols.) This
- mechanism can be used when intermediate transport agents limit the
- size of individual messages that can be sent. The media type
- "message/partial" thus indicates that the body contains a fragment of
- a larger entity.
-
- Because data of type "message" may never be encoded in base64 or
- quoted-printable, a problem might arise if "message/partial" entities
- are constructed in an environment that supports binary or 8bit
- transport. The problem is that the binary data would be split into
- multiple "message/partial" messages, each of them requiring binary
- transport. If such messages were encountered at a gateway into a
- 7bit transport environment, there would be no way to properly encode
- them for the 7bit world, aside from waiting for all of the fragments,
- reassembling the inner message, and then encoding the reassembled
- data in base64 or quoted-printable. Since it is possible that
- different fragments might go through different gateways, even this is
- not an acceptable solution. For this reason, it is specified that
- entities of type "message/partial" must always have a content-
- transfer-encoding of 7bit (the default). In particular, even in
- environments that support binary or 8bit transport, the use of a
- content- transfer-encoding of "8bit" or "binary" is explicitly
- prohibited for MIME entities of type "message/partial". This in turn
- implies that the inner message must not use "8bit" or "binary"
- encoding.
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 29]
-
-RFC 2046 Media Types November 1996
-
-
- Because some message transfer agents may choose to automatically
- fragment large messages, and because such agents may use very
- different fragmentation thresholds, it is possible that the pieces of
- a partial message, upon reassembly, may prove themselves to comprise
- a partial message. This is explicitly permitted.
-
- Three parameters must be specified in the Content-Type field of type
- "message/partial": The first, "id", is a unique identifier, as close
- to a world-unique identifier as possible, to be used to match the
- fragments together. (In general, the identifier is essentially a
- message-id; if placed in double quotes, it can be ANY message-id, in
- accordance with the BNF for "parameter" given in RFC 2045.) The
- second, "number", an integer, is the fragment number, which indicates
- where this fragment fits into the sequence of fragments. The third,
- "total", another integer, is the total number of fragments. This
- third subfield is required on the final fragment, and is optional
- (though encouraged) on the earlier fragments. Note also that these
- parameters may be given in any order.
-
- Thus, the second piece of a 3-piece message may have either of the
- following header fields:
-
- Content-Type: Message/Partial; number=2; total=3;
- id="oc=jpbe0M2Yt4s at thumper.bellcore.com"
-
- Content-Type: Message/Partial;
- id="oc=jpbe0M2Yt4s at thumper.bellcore.com";
- number=2
-
- But the third piece MUST specify the total number of fragments:
-
- Content-Type: Message/Partial; number=3; total=3;
- id="oc=jpbe0M2Yt4s at thumper.bellcore.com"
-
- Note that fragment numbering begins with 1, not 0.
-
- When the fragments of an entity broken up in this manner are put
- together, the result is always a complete MIME entity, which may have
- its own Content-Type header field, and thus may contain any other
- data type.
-
-5.2.2.1. Message Fragmentation and Reassembly
-
- The semantics of a reassembled partial message must be those of the
- "inner" message, rather than of a message containing the inner
- message. This makes it possible, for example, to send a large audio
- message as several partial messages, and still have it appear to the
- recipient as a simple audio message rather than as an encapsulated
-
-
-
-Freed & Borenstein Standards Track [Page 30]
-
-RFC 2046 Media Types November 1996
-
-
- message containing an audio message. That is, the encapsulation of
- the message is considered to be "transparent".
-
- When generating and reassembling the pieces of a "message/partial"
- message, the headers of the encapsulated message must be merged with
- the headers of the enclosing entities. In this process the following
- rules must be observed:
-
- (1) Fragmentation agents must split messages at line
- boundaries only. This restriction is imposed because
- splits at points other than the ends of lines in turn
- depends on message transports being able to preserve
- the semantics of messages that don't end with a CRLF
- sequence. Many transports are incapable of preserving
- such semantics.
-
- (2) All of the header fields from the initial enclosing
- message, except those that start with "Content-" and
- the specific header fields "Subject", "Message-ID",
- "Encrypted", and "MIME-Version", must be copied, in
- order, to the new message.
-
- (3) The header fields in the enclosed message which start
- with "Content-", plus the "Subject", "Message-ID",
- "Encrypted", and "MIME-Version" fields, must be
- appended, in order, to the header fields of the new
- message. Any header fields in the enclosed message
- which do not start with "Content-" (except for the
- "Subject", "Message-ID", "Encrypted", and "MIME-
- Version" fields) will be ignored and dropped.
-
- (4) All of the header fields from the second and any
- subsequent enclosing messages are discarded by the
- reassembly process.
-
-5.2.2.2. Fragmentation and Reassembly Example
-
- If an audio message is broken into two pieces, the first piece might
- look something like this:
-
- X-Weird-Header-1: Foo
- From: Bill at host.com
- To: joe at otherhost.com
- Date: Fri, 26 Mar 1993 12:59:38 -0500 (EST)
- Subject: Audio mail (part 1 of 2)
- Message-ID: <id1 at host.com>
- MIME-Version: 1.0
- Content-type: message/partial; id="ABC at host.com";
-
-
-
-Freed & Borenstein Standards Track [Page 31]
-
-RFC 2046 Media Types November 1996
-
-
- number=1; total=2
-
- X-Weird-Header-1: Bar
- X-Weird-Header-2: Hello
- Message-ID: <anotherid at foo.com>
- Subject: Audio mail
- MIME-Version: 1.0
- Content-type: audio/basic
- Content-transfer-encoding: base64
-
- ... first half of encoded audio data goes here ...
-
- and the second half might look something like this:
-
- From: Bill at host.com
- To: joe at otherhost.com
- Date: Fri, 26 Mar 1993 12:59:38 -0500 (EST)
- Subject: Audio mail (part 2 of 2)
- MIME-Version: 1.0
- Message-ID: <id2 at host.com>
- Content-type: message/partial;
- id="ABC at host.com"; number=2; total=2
-
- ... second half of encoded audio data goes here ...
-
- Then, when the fragmented message is reassembled, the resulting
- message to be displayed to the user should look something like this:
-
- X-Weird-Header-1: Foo
- From: Bill at host.com
- To: joe at otherhost.com
- Date: Fri, 26 Mar 1993 12:59:38 -0500 (EST)
- Subject: Audio mail
- Message-ID: <anotherid at foo.com>
- MIME-Version: 1.0
- Content-type: audio/basic
- Content-transfer-encoding: base64
-
- ... first half of encoded audio data goes here ...
- ... second half of encoded audio data goes here ...
-
- The inclusion of a "References" field in the headers of the second
- and subsequent pieces of a fragmented message that references the
- Message-Id on the previous piece may be of benefit to mail readers
- that understand and track references. However, the generation of
- such "References" fields is entirely optional.
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 32]
-
-RFC 2046 Media Types November 1996
-
-
- Finally, it should be noted that the "Encrypted" header field has
- been made obsolete by Privacy Enhanced Messaging (PEM) [RFC-1421,
- RFC-1422, RFC-1423, RFC-1424], but the rules above are nevertheless
- believed to describe the correct way to treat it if it is encountered
- in the context of conversion to and from "message/partial" fragments.
-
-5.2.3. External-Body Subtype
-
- The external-body subtype indicates that the actual body data are not
- included, but merely referenced. In this case, the parameters
- describe a mechanism for accessing the external data.
-
- When a MIME entity is of type "message/external-body", it consists of
- a header, two consecutive CRLFs, and the message header for the
- encapsulated message. If another pair of consecutive CRLFs appears,
- this of course ends the message header for the encapsulated message.
- However, since the encapsulated message's body is itself external, it
- does NOT appear in the area that follows. For example, consider the
- following message:
-
- Content-type: message/external-body;
- access-type=local-file;
- name="/u/nsb/Me.jpeg"
-
- Content-type: image/jpeg
- Content-ID: <id42 at guppylake.bellcore.com>
- Content-Transfer-Encoding: binary
-
- THIS IS NOT REALLY THE BODY!
-
- The area at the end, which might be called the "phantom body", is
- ignored for most external-body messages. However, it may be used to
- contain auxiliary information for some such messages, as indeed it is
- when the access-type is "mail- server". The only access-type defined
- in this document that uses the phantom body is "mail-server", but
- other access-types may be defined in the future in other
- specifications that use this area.
-
- The encapsulated headers in ALL "message/external-body" entities MUST
- include a Content-ID header field to give a unique identifier by
- which to reference the data. This identifier may be used for caching
- mechanisms, and for recognizing the receipt of the data when the
- access-type is "mail-server".
-
- Note that, as specified here, the tokens that describe external-body
- data, such as file names and mail server commands, are required to be
- in the US-ASCII character set.
-
-
-
-
-Freed & Borenstein Standards Track [Page 33]
-
-RFC 2046 Media Types November 1996
-
-
- If this proves problematic in practice, a new mechanism may be
- required as a future extension to MIME, either as newly defined
- access-types for "message/external-body" or by some other mechanism.
-
- As with "message/partial", MIME entities of type "message/external-
- body" MUST have a content-transfer-encoding of 7bit (the default).
- In particular, even in environments that support binary or 8bit
- transport, the use of a content- transfer-encoding of "8bit" or
- "binary" is explicitly prohibited for entities of type
- "message/external-body".
-
-5.2.3.1. General External-Body Parameters
-
- The parameters that may be used with any "message/external- body"
- are:
-
- (1) ACCESS-TYPE -- A word indicating the supported access
- mechanism by which the file or data may be obtained.
- This word is not case sensitive. Values include, but
- are not limited to, "FTP", "ANON-FTP", "TFTP", "LOCAL-
- FILE", and "MAIL-SERVER". Future values, except for
- experimental values beginning with "X-", must be
- registered with IANA, as described in RFC 2048.
- This parameter is unconditionally mandatory and MUST be
- present on EVERY "message/external-body".
-
- (2) EXPIRATION -- The date (in the RFC 822 "date-time"
- syntax, as extended by RFC 1123 to permit 4 digits in
- the year field) after which the existence of the
- external data is not guaranteed. This parameter may be
- used with ANY access-type and is ALWAYS optional.
-
- (3) SIZE -- The size (in octets) of the data. The intent
- of this parameter is to help the recipient decide
- whether or not to expend the necessary resources to
- retrieve the external data. Note that this describes
- the size of the data in its canonical form, that is,
- before any Content-Transfer-Encoding has been applied
- or after the data have been decoded. This parameter
- may be used with ANY access-type and is ALWAYS
- optional.
-
- (4) PERMISSION -- A case-insensitive field that indicates
- whether or not it is expected that clients might also
- attempt to overwrite the data. By default, or if
- permission is "read", the assumption is that they are
- not, and that if the data is retrieved once, it is
- never needed again. If PERMISSION is "read-write",
-
-
-
-Freed & Borenstein Standards Track [Page 34]
-
-RFC 2046 Media Types November 1996
-
-
- this assumption is invalid, and any local copy must be
- considered no more than a cache. "Read" and "Read-
- write" are the only defined values of permission. This
- parameter may be used with ANY access-type and is
- ALWAYS optional.
-
- The precise semantics of the access-types defined here are described
- in the sections that follow.
-
-5.2.3.2. The 'ftp' and 'tftp' Access-Types
-
- An access-type of FTP or TFTP indicates that the message body is
- accessible as a file using the FTP [RFC-959] or TFTP [RFC- 783]
- protocols, respectively. For these access-types, the following
- additional parameters are mandatory:
-
- (1) NAME -- The name of the file that contains the actual
- body data.
-
- (2) SITE -- A machine from which the file may be obtained,
- using the given protocol. This must be a fully
- qualified domain name, not a nickname.
-
- (3) Before any data are retrieved, using FTP, the user will
- generally need to be asked to provide a login id and a
- password for the machine named by the site parameter.
- For security reasons, such an id and password are not
- specified as content-type parameters, but must be
- obtained from the user.
-
- In addition, the following parameters are optional:
-
- (1) DIRECTORY -- A directory from which the data named by
- NAME should be retrieved.
-
- (2) MODE -- A case-insensitive string indicating the mode
- to be used when retrieving the information. The valid
- values for access-type "TFTP" are "NETASCII", "OCTET",
- and "MAIL", as specified by the TFTP protocol [RFC-
- 783]. The valid values for access-type "FTP" are
- "ASCII", "EBCDIC", "IMAGE", and "LOCALn" where "n" is a
- decimal integer, typically 8. These correspond to the
- representation types "A" "E" "I" and "L n" as specified
- by the FTP protocol [RFC-959]. Note that "BINARY" and
- "TENEX" are not valid values for MODE and that "OCTET"
- or "IMAGE" or "LOCAL8" should be used instead. IF MODE
- is not specified, the default value is "NETASCII" for
- TFTP and "ASCII" otherwise.
-
-
-
-Freed & Borenstein Standards Track [Page 35]
-
-RFC 2046 Media Types November 1996
-
-
-5.2.3.3. The 'anon-ftp' Access-Type
-
- The "anon-ftp" access-type is identical to the "ftp" access type,
- except that the user need not be asked to provide a name and password
- for the specified site. Instead, the ftp protocol will be used with
- login "anonymous" and a password that corresponds to the user's mail
- address.
-
-5.2.3.4. The 'local-file' Access-Type
-
- An access-type of "local-file" indicates that the actual body is
- accessible as a file on the local machine. Two additional parameters
- are defined for this access type:
-
- (1) NAME -- The name of the file that contains the actual
- body data. This parameter is mandatory for the
- "local-file" access-type.
-
- (2) SITE -- A domain specifier for a machine or set of
- machines that are known to have access to the data
- file. This optional parameter is used to describe the
- locality of reference for the data, that is, the site
- or sites at which the file is expected to be visible.
- Asterisks may be used for wildcard matching to a part
- of a domain name, such as "*.bellcore.com", to indicate
- a set of machines on which the data should be directly
- visible, while a single asterisk may be used to
- indicate a file that is expected to be universally
- available, e.g., via a global file system.
-
-5.2.3.5. The 'mail-server' Access-Type
-
- The "mail-server" access-type indicates that the actual body is
- available from a mail server. Two additional parameters are defined
- for this access-type:
-
- (1) SERVER -- The addr-spec of the mail server from which
- the actual body data can be obtained. This parameter
- is mandatory for the "mail-server" access-type.
-
- (2) SUBJECT -- The subject that is to be used in the mail
- that is sent to obtain the data. Note that keying mail
- servers on Subject lines is NOT recommended, but such
- mail servers are known to exist. This is an optional
- parameter.
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 36]
-
-RFC 2046 Media Types November 1996
-
-
- Because mail servers accept a variety of syntaxes, some of which is
- multiline, the full command to be sent to a mail server is not
- included as a parameter in the content-type header field. Instead,
- it is provided as the "phantom body" when the media type is
- "message/external-body" and the access-type is mail-server.
-
- Note that MIME does not define a mail server syntax. Rather, it
- allows the inclusion of arbitrary mail server commands in the phantom
- body. Implementations must include the phantom body in the body of
- the message it sends to the mail server address to retrieve the
- relevant data.
-
- Unlike other access-types, mail-server access is asynchronous and
- will happen at an unpredictable time in the future. For this reason,
- it is important that there be a mechanism by which the returned data
- can be matched up with the original "message/external-body" entity.
- MIME mail servers must use the same Content-ID field on the returned
- message that was used in the original "message/external-body"
- entities, to facilitate such matching.
-
-5.2.3.6. External-Body Security Issues
-
- "Message/external-body" entities give rise to two important security
- issues:
-
- (1) Accessing data via a "message/external-body" reference
- effectively results in the message recipient performing
- an operation that was specified by the message
- originator. It is therefore possible for the message
- originator to trick a recipient into doing something
- they would not have done otherwise. For example, an
- originator could specify a action that attempts
- retrieval of material that the recipient is not
- authorized to obtain, causing the recipient to
- unwittingly violate some security policy. For this
- reason, user agents capable of resolving external
- references must always take steps to describe the
- action they are to take to the recipient and ask for
- explicit permisssion prior to performing it.
-
- The 'mail-server' access-type is particularly
- vulnerable, in that it causes the recipient to send a
- new message whose contents are specified by the
- original message's originator. Given the potential for
- abuse, any such request messages that are constructed
- should contain a clear indication that they were
- generated automatically (e.g. in a Comments: header
- field) in an attempt to resolve a MIME
-
-
-
-Freed & Borenstein Standards Track [Page 37]
-
-RFC 2046 Media Types November 1996
-
-
- "message/external-body" reference.
-
- (2) MIME will sometimes be used in environments that
- provide some guarantee of message integrity and
- authenticity. If present, such guarantees may apply
- only to the actual direct content of messages -- they
- may or may not apply to data accessed through MIME's
- "message/external-body" mechanism. In particular, it
- may be possible to subvert certain access mechanisms
- even when the messaging system itself is secure.
-
- It should be noted that this problem exists either with
- or without the availabilty of MIME mechanisms. A
- casual reference to an FTP site containing a document
- in the text of a secure message brings up similar
- issues -- the only difference is that MIME provides for
- automatic retrieval of such material, and users may
- place unwarranted trust is such automatic retrieval
- mechanisms.
-
-5.2.3.7. Examples and Further Explanations
-
- When the external-body mechanism is used in conjunction with the
- "multipart/alternative" media type it extends the functionality of
- "multipart/alternative" to include the case where the same entity is
- provided in the same format but via different accces mechanisms.
- When this is done the originator of the message must order the parts
- first in terms of preferred formats and then by preferred access
- mechanisms. The recipient's viewer should then evaluate the list
- both in terms of format and access mechanisms.
-
- With the emerging possibility of very wide-area file systems, it
- becomes very hard to know in advance the set of machines where a file
- will and will not be accessible directly from the file system.
- Therefore it may make sense to provide both a file name, to be tried
- directly, and the name of one or more sites from which the file is
- known to be accessible. An implementation can try to retrieve remote
- files using FTP or any other protocol, using anonymous file retrieval
- or prompting the user for the necessary name and password. If an
- external body is accessible via multiple mechanisms, the sender may
- include multiple entities of type "message/external-body" within the
- body parts of an enclosing "multipart/alternative" entity.
-
- However, the external-body mechanism is not intended to be limited to
- file retrieval, as shown by the mail-server access-type. Beyond
- this, one can imagine, for example, using a video server for external
- references to video clips.
-
-
-
-
-Freed & Borenstein Standards Track [Page 38]
-
-RFC 2046 Media Types November 1996
-
-
- The embedded message header fields which appear in the body of the
- "message/external-body" data must be used to declare the media type
- of the external body if it is anything other than plain US-ASCII
- text, since the external body does not have a header section to
- declare its type. Similarly, any Content-transfer-encoding other
- than "7bit" must also be declared here. Thus a complete
- "message/external-body" message, referring to an object in PostScript
- format, might look like this:
-
- From: Whomever
- To: Someone
- Date: Whenever
- Subject: whatever
- MIME-Version: 1.0
- Message-ID: <id1 at host.com>
- Content-Type: multipart/alternative; boundary=42
- Content-ID: <id001 at guppylake.bellcore.com>
-
- --42
- Content-Type: message/external-body; name="BodyFormats.ps";
- site="thumper.bellcore.com"; mode="image";
- access-type=ANON-FTP; directory="pub";
- expiration="Fri, 14 Jun 1991 19:13:14 -0400 (EDT)"
-
- Content-type: application/postscript
- Content-ID: <id42 at guppylake.bellcore.com>
-
- --42
- Content-Type: message/external-body; access-type=local-file;
- name="/u/nsb/writing/rfcs/RFC-MIME.ps";
- site="thumper.bellcore.com";
- expiration="Fri, 14 Jun 1991 19:13:14 -0400 (EDT)"
-
- Content-type: application/postscript
- Content-ID: <id42 at guppylake.bellcore.com>
-
- --42
- Content-Type: message/external-body;
- access-type=mail-server
- server="listserv at bogus.bitnet";
- expiration="Fri, 14 Jun 1991 19:13:14 -0400 (EDT)"
-
- Content-type: application/postscript
- Content-ID: <id42 at guppylake.bellcore.com>
-
- get RFC-MIME.DOC
-
- --42--
-
-
-
-Freed & Borenstein Standards Track [Page 39]
-
-RFC 2046 Media Types November 1996
-
-
- Note that in the above examples, the default Content-transfer-
- encoding of "7bit" is assumed for the external postscript data.
-
- Like the "message/partial" type, the "message/external-body" media
- type is intended to be transparent, that is, to convey the data type
- in the external body rather than to convey a message with a body of
- that type. Thus the headers on the outer and inner parts must be
- merged using the same rules as for "message/partial". In particular,
- this means that the Content-type and Subject fields are overridden,
- but the From field is preserved.
-
- Note that since the external bodies are not transported along with
- the external body reference, they need not conform to transport
- limitations that apply to the reference itself. In particular,
- Internet mail transports may impose 7bit and line length limits, but
- these do not automatically apply to binary external body references.
- Thus a Content-Transfer-Encoding is not generally necessary, though
- it is permitted.
-
- Note that the body of a message of type "message/external-body" is
- governed by the basic syntax for an RFC 822 message. In particular,
- anything before the first consecutive pair of CRLFs is header
- information, while anything after it is body information, which is
- ignored for most access-types.
-
-5.2.4. Other Message Subtypes
-
- MIME implementations must in general treat unrecognized subtypes of
- "message" as being equivalent to "application/octet-stream".
-
- Future subtypes of "message" intended for use with email should be
- restricted to "7bit" encoding. A type other than "message" should be
- used if restriction to "7bit" is not possible.
-
-6. Experimental Media Type Values
-
- A media type value beginning with the characters "X-" is a private
- value, to be used by consenting systems by mutual agreement. Any
- format without a rigorous and public definition must be named with an
- "X-" prefix, and publicly specified values shall never begin with
- "X-". (Older versions of the widely used Andrew system use the "X-
- BE2" name, so new systems should probably choose a different name.)
-
- In general, the use of "X-" top-level types is strongly discouraged.
- Implementors should invent subtypes of the existing types whenever
- possible. In many cases, a subtype of "application" will be more
- appropriate than a new top-level type.
-
-
-
-
-Freed & Borenstein Standards Track [Page 40]
-
-RFC 2046 Media Types November 1996
-
-
-7. Summary
-
- The five discrete media types provide provide a standardized
- mechanism for tagging entities as "audio", "image", or several other
- kinds of data. The composite "multipart" and "message" media types
- allow mixing and hierarchical structuring of entities of different
- types in a single message. A distinguished parameter syntax allows
- further specification of data format details, particularly the
- specification of alternate character sets. Additional optional
- header fields provide mechanisms for certain extensions deemed
- desirable by many implementors. Finally, a number of useful media
- types are defined for general use by consenting user agents, notably
- "message/partial" and "message/external-body".
-
-9. Security Considerations
-
- Security issues are discussed in the context of the
- "application/postscript" type, the "message/external-body" type, and
- in RFC 2048. Implementors should pay special attention to the
- security implications of any media types that can cause the remote
- execution of any actions in the recipient's environment. In such
- cases, the discussion of the "application/postscript" type may serve
- as a model for considering other media types with remote execution
- capabilities.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 41]
-
-RFC 2046 Media Types November 1996
-
-
-9. Authors' Addresses
-
- For more information, the authors of this document are best contacted
- via Internet mail:
-
- Ned Freed
- Innosoft International, Inc.
- 1050 East Garvey Avenue South
- West Covina, CA 91790
- USA
-
- Phone: +1 818 919 3600
- Fax: +1 818 919 3614
- EMail: ned at innosoft.com
-
-
- Nathaniel S. Borenstein
- First Virtual Holdings
- 25 Washington Avenue
- Morristown, NJ 07960
- USA
-
- Phone: +1 201 540 8967
- Fax: +1 201 993 3032
- EMail: nsb at nsb.fv.com
-
-
- MIME is a result of the work of the Internet Engineering Task Force
- Working Group on RFC 822 Extensions. The chairman of that group,
- Greg Vaudreuil, may be reached at:
-
- Gregory M. Vaudreuil
- Octel Network Services
- 17080 Dallas Parkway
- Dallas, TX 75248-1905
- USA
-
- EMail: Greg.Vaudreuil at Octel.Com
-
-
-
-
-
-
-
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 42]
-
-RFC 2046 Media Types November 1996
-
-
-Appendix A -- Collected Grammar
-
- This appendix contains the complete BNF grammar for all the syntax
- specified by this document.
-
- By itself, however, this grammar is incomplete. It refers by name to
- several syntax rules that are defined by RFC 822. Rather than
- reproduce those definitions here, and risk unintentional differences
- between the two, this document simply refers the reader to RFC 822
- for the remaining definitions. Wherever a term is undefined, it
- refers to the RFC 822 definition.
-
- boundary := 0*69<bchars> bcharsnospace
-
- bchars := bcharsnospace / " "
-
- bcharsnospace := DIGIT / ALPHA / "'" / "(" / ")" /
- "+" / "_" / "," / "-" / "." /
- "/" / ":" / "=" / "?"
-
- body-part := <"message" as defined in RFC 822, with all
- header fields optional, not starting with the
- specified dash-boundary, and with the
- delimiter not occurring anywhere in the
- body part. Note that the semantics of a
- part differ from the semantics of a message,
- as described in the text.>
-
- close-delimiter := delimiter "--"
-
- dash-boundary := "--" boundary
- ; boundary taken from the value of
- ; boundary parameter of the
- ; Content-Type field.
-
- delimiter := CRLF dash-boundary
-
- discard-text := *(*text CRLF)
- ; May be ignored or discarded.
-
- encapsulation := delimiter transport-padding
- CRLF body-part
-
- epilogue := discard-text
-
- multipart-body := [preamble CRLF]
- dash-boundary transport-padding CRLF
- body-part *encapsulation
-
-
-
-Freed & Borenstein Standards Track [Page 43]
-
-RFC 2046 Media Types November 1996
-
-
- close-delimiter transport-padding
- [CRLF epilogue]
-
- preamble := discard-text
-
- transport-padding := *LWSP-char
- ; Composers MUST NOT generate
- ; non-zero length transport
- ; padding, but receivers MUST
- ; be able to handle padding
- ; added by message transports.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 44]
-
-
diff --git a/reference/rfc2047 Multipurpose Internet Mail Extensions (3).txt b/reference/rfc2047 Multipurpose Internet Mail Extensions (3).txt
deleted file mode 100644
index 08de1f8..0000000
--- a/reference/rfc2047 Multipurpose Internet Mail Extensions (3).txt
+++ /dev/null
@@ -1,843 +0,0 @@
-
-
-
-
-
-Network Working Group K. Moore
-Request for Comments: 2047 University of Tennessee
-Obsoletes: 1521, 1522, 1590 November 1996
-Category: Standards Track
-
-
- MIME (Multipurpose Internet Mail Extensions) Part Three:
- Message Header Extensions for Non-ASCII Text
-
-Status of this Memo
-
- This document specifies an Internet standards track protocol for the
- Internet community, and requests discussion and suggestions for
- improvements. Please refer to the current edition of the "Internet
- Official Protocol Standards" (STD 1) for the standardization state
- and status of this protocol. Distribution of this memo is unlimited.
-
-Abstract
-
- STD 11, RFC 822, defines a message representation protocol specifying
- considerable detail about US-ASCII message headers, and leaves the
- message content, or message body, as flat US-ASCII text. This set of
- documents, collectively called the Multipurpose Internet Mail
- Extensions, or MIME, redefines the format of messages to allow for
-
- (1) textual message bodies in character sets other than US-ASCII,
-
- (2) an extensible set of different formats for non-textual message
- bodies,
-
- (3) multi-part message bodies, and
-
- (4) textual header information in character sets other than US-ASCII.
-
- These documents are based on earlier work documented in RFC 934, STD
- 11, and RFC 1049, but extends and revises them. Because RFC 822 said
- so little about message bodies, these documents are largely
- orthogonal to (rather than a revision of) RFC 822.
-
- This particular document is the third document in the series. It
- describes extensions to RFC 822 to allow non-US-ASCII text data in
- Internet mail header fields.
-
-
-
-
-
-
-
-
-
-Moore Standards Track [Page 1]
-
-RFC 2047 Message Header Extensions November 1996
-
-
- Other documents in this series include:
-
- + RFC 2045, which specifies the various headers used to describe
- the structure of MIME messages.
-
- + RFC 2046, which defines the general structure of the MIME media
- typing system and defines an initial set of media types,
-
- + RFC 2048, which specifies various IANA registration procedures
- for MIME-related facilities, and
-
- + RFC 2049, which describes MIME conformance criteria and
- provides some illustrative examples of MIME message formats,
- acknowledgements, and the bibliography.
-
- These documents are revisions of RFCs 1521, 1522, and 1590, which
- themselves were revisions of RFCs 1341 and 1342. An appendix in RFC
- 2049 describes differences and changes from previous versions.
-
-1. Introduction
-
- RFC 2045 describes a mechanism for denoting textual body parts which
- are coded in various character sets, as well as methods for encoding
- such body parts as sequences of printable US-ASCII characters. This
- memo describes similar techniques to allow the encoding of non-ASCII
- text in various portions of a RFC 822 [2] message header, in a manner
- which is unlikely to confuse existing message handling software.
-
- Like the encoding techniques described in RFC 2045, the techniques
- outlined here were designed to allow the use of non-ASCII characters
- in message headers in a way which is unlikely to be disturbed by the
- quirks of existing Internet mail handling programs. In particular,
- some mail relaying programs are known to (a) delete some message
- header fields while retaining others, (b) rearrange the order of
- addresses in To or Cc fields, (c) rearrange the (vertical) order of
- header fields, and/or (d) "wrap" message headers at different places
- than those in the original message. In addition, some mail reading
- programs are known to have difficulty correctly parsing message
- headers which, while legal according to RFC 822, make use of
- backslash-quoting to "hide" special characters such as "<", ",", or
- ":", or which exploit other infrequently-used features of that
- specification.
-
- While it is unfortunate that these programs do not correctly
- interpret RFC 822 headers, to "break" these programs would cause
- severe operational problems for the Internet mail system. The
- extensions described in this memo therefore do not rely on little-
- used features of RFC 822.
-
-
-
-Moore Standards Track [Page 2]
-
-RFC 2047 Message Header Extensions November 1996
-
-
- Instead, certain sequences of "ordinary" printable ASCII characters
- (known as "encoded-words") are reserved for use as encoded data. The
- syntax of encoded-words is such that they are unlikely to
- "accidentally" appear as normal text in message headers.
- Furthermore, the characters used in encoded-words are restricted to
- those which do not have special meanings in the context in which the
- encoded-word appears.
-
- Generally, an "encoded-word" is a sequence of printable ASCII
- characters that begins with "=?", ends with "?=", and has two "?"s in
- between. It specifies a character set and an encoding method, and
- also includes the original text encoded as graphic ASCII characters,
- according to the rules for that encoding method.
-
- A mail composer that implements this specification will provide a
- means of inputting non-ASCII text in header fields, but will
- translate these fields (or appropriate portions of these fields) into
- encoded-words before inserting them into the message header.
-
- A mail reader that implements this specification will recognize
- encoded-words when they appear in certain portions of the message
- header. Instead of displaying the encoded-word "as is", it will
- reverse the encoding and display the original text in the designated
- character set.
-
-NOTES
-
- This memo relies heavily on notation and terms defined RFC 822 and
- RFC 2045. In particular, the syntax for the ABNF used in this memo
- is defined in RFC 822, as well as many of the terminal or nonterminal
- symbols from RFC 822 are used in the grammar for the header
- extensions defined here. Among the symbols defined in RFC 822 and
- referenced in this memo are: 'addr-spec', 'atom', 'CHAR', 'comment',
- 'CTLs', 'ctext', 'linear-white-space', 'phrase', 'quoted-pair'.
- 'quoted-string', 'SPACE', and 'word'. Successful implementation of
- this protocol extension requires careful attention to the RFC 822
- definitions of these terms.
-
- When the term "ASCII" appears in this memo, it refers to the "7-Bit
- American Standard Code for Information Interchange", ANSI X3.4-1986.
- The MIME charset name for this character set is "US-ASCII". When not
- specifically referring to the MIME charset name, this document uses
- the term "ASCII", both for brevity and for consistency with RFC 822.
- However, implementors are warned that the character set name must be
- spelled "US-ASCII" in MIME message and body part headers.
-
-
-
-
-
-
-Moore Standards Track [Page 3]
-
-RFC 2047 Message Header Extensions November 1996
-
-
- This memo specifies a protocol for the representation of non-ASCII
- text in message headers. It specifically DOES NOT define any
- translation between "8-bit headers" and pure ASCII headers, nor is
- any such translation assumed to be possible.
-
-2. Syntax of encoded-words
-
- An 'encoded-word' is defined by the following ABNF grammar. The
- notation of RFC 822 is used, with the exception that white space
- characters MUST NOT appear between components of an 'encoded-word'.
-
- encoded-word = "=?" charset "?" encoding "?" encoded-text "?="
-
- charset = token ; see section 3
-
- encoding = token ; see section 4
-
- token = 1*<Any CHAR except SPACE, CTLs, and especials>
-
- especials = "(" / ")" / "<" / ">" / "@" / "," / ";" / ":" / "
- <"> / "/" / "[" / "]" / "?" / "." / "="
-
- encoded-text = 1*<Any printable ASCII character other than "?"
- or SPACE>
- ; (but see "Use of encoded-words in message
- ; headers", section 5)
-
- Both 'encoding' and 'charset' names are case-independent. Thus the
- charset name "ISO-8859-1" is equivalent to "iso-8859-1", and the
- encoding named "Q" may be spelled either "Q" or "q".
-
- An 'encoded-word' may not be more than 75 characters long, including
- 'charset', 'encoding', 'encoded-text', and delimiters. If it is
- desirable to encode more text than will fit in an 'encoded-word' of
- 75 characters, multiple 'encoded-word's (separated by CRLF SPACE) may
- be used.
-
- While there is no limit to the length of a multiple-line header
- field, each line of a header field that contains one or more
- 'encoded-word's is limited to 76 characters.
-
- The length restrictions are included both to ease interoperability
- through internetwork mail gateways, and to impose a limit on the
- amount of lookahead a header parser must employ (while looking for a
- final ?= delimiter) before it can decide whether a token is an
- "encoded-word" or something else.
-
-
-
-
-
-Moore Standards Track [Page 4]
-
-RFC 2047 Message Header Extensions November 1996
-
-
- IMPORTANT: 'encoded-word's are designed to be recognized as 'atom's
- by an RFC 822 parser. As a consequence, unencoded white space
- characters (such as SPACE and HTAB) are FORBIDDEN within an
- 'encoded-word'. For example, the character sequence
-
- =?iso-8859-1?q?this is some text?=
-
- would be parsed as four 'atom's, rather than as a single 'atom' (by
- an RFC 822 parser) or 'encoded-word' (by a parser which understands
- 'encoded-words'). The correct way to encode the string "this is some
- text" is to encode the SPACE characters as well, e.g.
-
- =?iso-8859-1?q?this=20is=20some=20text?=
-
- The characters which may appear in 'encoded-text' are further
- restricted by the rules in section 5.
-
-3. Character sets
-
- The 'charset' portion of an 'encoded-word' specifies the character
- set associated with the unencoded text. A 'charset' can be any of
- the character set names allowed in an MIME "charset" parameter of a
- "text/plain" body part, or any character set name registered with
- IANA for use with the MIME text/plain content-type.
-
- Some character sets use code-switching techniques to switch between
- "ASCII mode" and other modes. If unencoded text in an 'encoded-word'
- contains a sequence which causes the charset interpreter to switch
- out of ASCII mode, it MUST contain additional control codes such that
- ASCII mode is again selected at the end of the 'encoded-word'. (This
- rule applies separately to each 'encoded-word', including adjacent
- 'encoded-word's within a single header field.)
-
- When there is a possibility of using more than one character set to
- represent the text in an 'encoded-word', and in the absence of
- private agreements between sender and recipients of a message, it is
- recommended that members of the ISO-8859-* series be used in
- preference to other character sets.
-
-4. Encodings
-
- Initially, the legal values for "encoding" are "Q" and "B". These
- encodings are described below. The "Q" encoding is recommended for
- use when most of the characters to be encoded are in the ASCII
- character set; otherwise, the "B" encoding should be used.
- Nevertheless, a mail reader which claims to recognize 'encoded-word's
- MUST be able to accept either encoding for any character set which it
- supports.
-
-
-
-Moore Standards Track [Page 5]
-
-RFC 2047 Message Header Extensions November 1996
-
-
- Only a subset of the printable ASCII characters may be used in
- 'encoded-text'. Space and tab characters are not allowed, so that
- the beginning and end of an 'encoded-word' are obvious. The "?"
- character is used within an 'encoded-word' to separate the various
- portions of the 'encoded-word' from one another, and thus cannot
- appear in the 'encoded-text' portion. Other characters are also
- illegal in certain contexts. For example, an 'encoded-word' in a
- 'phrase' preceding an address in a From header field may not contain
- any of the "specials" defined in RFC 822. Finally, certain other
- characters are disallowed in some contexts, to ensure reliability for
- messages that pass through internetwork mail gateways.
-
- The "B" encoding automatically meets these requirements. The "Q"
- encoding allows a wide range of printable characters to be used in
- non-critical locations in the message header (e.g., Subject), with
- fewer characters available for use in other locations.
-
-4.1. The "B" encoding
-
- The "B" encoding is identical to the "BASE64" encoding defined by RFC
- 2045.
-
-4.2. The "Q" encoding
-
- The "Q" encoding is similar to the "Quoted-Printable" content-
- transfer-encoding defined in RFC 2045. It is designed to allow text
- containing mostly ASCII characters to be decipherable on an ASCII
- terminal without decoding.
-
- (1) Any 8-bit value may be represented by a "=" followed by two
- hexadecimal digits. For example, if the character set in use
- were ISO-8859-1, the "=" character would thus be encoded as
- "=3D", and a SPACE by "=20". (Upper case should be used for
- hexadecimal digits "A" through "F".)
-
- (2) The 8-bit hexadecimal value 20 (e.g., ISO-8859-1 SPACE) may be
- represented as "_" (underscore, ASCII 95.). (This character may
- not pass through some internetwork mail gateways, but its use
- will greatly enhance readability of "Q" encoded data with mail
- readers that do not support this encoding.) Note that the "_"
- always represents hexadecimal 20, even if the SPACE character
- occupies a different code position in the character set in use.
-
- (3) 8-bit values which correspond to printable ASCII characters other
- than "=", "?", and "_" (underscore), MAY be represented as those
- characters. (But see section 5 for restrictions.) In
- particular, SPACE and TAB MUST NOT be represented as themselves
- within encoded words.
-
-
-
-Moore Standards Track [Page 6]
-
-RFC 2047 Message Header Extensions November 1996
-
-
-5. Use of encoded-words in message headers
-
- An 'encoded-word' may appear in a message header or body part header
- according to the following rules:
-
-(1) An 'encoded-word' may replace a 'text' token (as defined by RFC 822)
- in any Subject or Comments header field, any extension message
- header field, or any MIME body part field for which the field body
- is defined as '*text'. An 'encoded-word' may also appear in any
- user-defined ("X-") message or body part header field.
-
- Ordinary ASCII text and 'encoded-word's may appear together in the
- same header field. However, an 'encoded-word' that appears in a
- header field defined as '*text' MUST be separated from any adjacent
- 'encoded-word' or 'text' by 'linear-white-space'.
-
-(2) An 'encoded-word' may appear within a 'comment' delimited by "(" and
- ")", i.e., wherever a 'ctext' is allowed. More precisely, the RFC
- 822 ABNF definition for 'comment' is amended as follows:
-
- comment = "(" *(ctext / quoted-pair / comment / encoded-word) ")"
-
- A "Q"-encoded 'encoded-word' which appears in a 'comment' MUST NOT
- contain the characters "(", ")" or "
- 'encoded-word' that appears in a 'comment' MUST be separated from
- any adjacent 'encoded-word' or 'ctext' by 'linear-white-space'.
-
- It is important to note that 'comment's are only recognized inside
- "structured" field bodies. In fields whose bodies are defined as
- '*text', "(" and ")" are treated as ordinary characters rather than
- comment delimiters, and rule (1) of this section applies. (See RFC
- 822, sections 3.1.2 and 3.1.3)
-
-(3) As a replacement for a 'word' entity within a 'phrase', for example,
- one that precedes an address in a From, To, or Cc header. The ABNF
- definition for 'phrase' from RFC 822 thus becomes:
-
- phrase = 1*( encoded-word / word )
-
- In this case the set of characters that may be used in a "Q"-encoded
- 'encoded-word' is restricted to: <upper and lower case ASCII
- letters, decimal digits, "!", "*", "+", "-", "/", "=", and "_"
- (underscore, ASCII 95.)>. An 'encoded-word' that appears within a
- 'phrase' MUST be separated from any adjacent 'word', 'text' or
- 'special' by 'linear-white-space'.
-
-
-
-
-
-
-Moore Standards Track [Page 7]
-
-RFC 2047 Message Header Extensions November 1996
-
-
- These are the ONLY locations where an 'encoded-word' may appear. In
- particular:
-
- + An 'encoded-word' MUST NOT appear in any portion of an 'addr-spec'.
-
- + An 'encoded-word' MUST NOT appear within a 'quoted-string'.
-
- + An 'encoded-word' MUST NOT be used in a Received header field.
-
- + An 'encoded-word' MUST NOT be used in parameter of a MIME
- Content-Type or Content-Disposition field, or in any structured
- field body except within a 'comment' or 'phrase'.
-
- The 'encoded-text' in an 'encoded-word' must be self-contained;
- 'encoded-text' MUST NOT be continued from one 'encoded-word' to
- another. This implies that the 'encoded-text' portion of a "B"
- 'encoded-word' will be a multiple of 4 characters long; for a "Q"
- 'encoded-word', any "=" character that appears in the 'encoded-text'
- portion will be followed by two hexadecimal characters.
-
- Each 'encoded-word' MUST encode an integral number of octets. The
- 'encoded-text' in each 'encoded-word' must be well-formed according
- to the encoding specified; the 'encoded-text' may not be continued in
- the next 'encoded-word'. (For example, "=?charset?Q?=?=
- =?charset?Q?AB?=" would be illegal, because the two hex digits "AB"
- must follow the "=" in the same 'encoded-word'.)
-
- Each 'encoded-word' MUST represent an integral number of characters.
- A multi-octet character may not be split across adjacent 'encoded-
- word's.
-
- Only printable and white space character data should be encoded using
- this scheme. However, since these encoding schemes allow the
- encoding of arbitrary octet values, mail readers that implement this
- decoding should also ensure that display of the decoded data on the
- recipient's terminal will not cause unwanted side-effects.
-
- Use of these methods to encode non-textual data (e.g., pictures or
- sounds) is not defined by this memo. Use of 'encoded-word's to
- represent strings of purely ASCII characters is allowed, but
- discouraged. In rare cases it may be necessary to encode ordinary
- text that looks like an 'encoded-word'.
-
-
-
-
-
-
-
-
-
-Moore Standards Track [Page 8]
-
-RFC 2047 Message Header Extensions November 1996
-
-
-6. Support of 'encoded-word's by mail readers
-
-6.1. Recognition of 'encoded-word's in message headers
-
- A mail reader must parse the message and body part headers according
- to the rules in RFC 822 to correctly recognize 'encoded-word's.
-
- 'encoded-word's are to be recognized as follows:
-
- (1) Any message or body part header field defined as '*text', or any
- user-defined header field, should be parsed as follows: Beginning
- at the start of the field-body and immediately following each
- occurrence of 'linear-white-space', each sequence of up to 75
- printable characters (not containing any 'linear-white-space')
- should be examined to see if it is an 'encoded-word' according to
- the syntax rules in section 2. Any other sequence of printable
- characters should be treated as ordinary ASCII text.
-
- (2) Any header field not defined as '*text' should be parsed
- according to the syntax rules for that header field. However,
- any 'word' that appears within a 'phrase' should be treated as an
- 'encoded-word' if it meets the syntax rules in section 2.
- Otherwise it should be treated as an ordinary 'word'.
-
- (3) Within a 'comment', any sequence of up to 75 printable characters
- (not containing 'linear-white-space'), that meets the syntax
- rules in section 2, should be treated as an 'encoded-word'.
- Otherwise it should be treated as normal comment text.
-
- (4) A MIME-Version header field is NOT required to be present for
- 'encoded-word's to be interpreted according to this
- specification. One reason for this is that the mail reader is
- not expected to parse the entire message header before displaying
- lines that may contain 'encoded-word's.
-
-6.2. Display of 'encoded-word's
-
- Any 'encoded-word's so recognized are decoded, and if possible, the
- resulting unencoded text is displayed in the original character set.
-
- NOTE: Decoding and display of encoded-words occurs *after* a
- structured field body is parsed into tokens. It is therefore
- possible to hide 'special' characters in encoded-words which, when
- displayed, will be indistinguishable from 'special' characters in the
- surrounding text. For this and other reasons, it is NOT generally
- possible to translate a message header containing 'encoded-word's to
- an unencoded form which can be parsed by an RFC 822 mail reader.
-
-
-
-
-Moore Standards Track [Page 9]
-
-RFC 2047 Message Header Extensions November 1996
-
-
- When displaying a particular header field that contains multiple
- 'encoded-word's, any 'linear-white-space' that separates a pair of
- adjacent 'encoded-word's is ignored. (This is to allow the use of
- multiple 'encoded-word's to represent long strings of unencoded text,
- without having to separate 'encoded-word's where spaces occur in the
- unencoded text.)
-
- In the event other encodings are defined in the future, and the mail
- reader does not support the encoding used, it may either (a) display
- the 'encoded-word' as ordinary text, or (b) substitute an appropriate
- message indicating that the text could not be decoded.
-
- If the mail reader does not support the character set used, it may
- (a) display the 'encoded-word' as ordinary text (i.e., as it appears
- in the header), (b) make a "best effort" to display using such
- characters as are available, or (c) substitute an appropriate message
- indicating that the decoded text could not be displayed.
-
- If the character set being used employs code-switching techniques,
- display of the encoded text implicitly begins in "ASCII mode". In
- addition, the mail reader must ensure that the output device is once
- again in "ASCII mode" after the 'encoded-word' is displayed.
-
-6.3. Mail reader handling of incorrectly formed 'encoded-word's
-
- It is possible that an 'encoded-word' that is legal according to the
- syntax defined in section 2, is incorrectly formed according to the
- rules for the encoding being used. For example:
-
- (1) An 'encoded-word' which contains characters which are not legal
- for a particular encoding (for example, a "-" in the "B"
- encoding, or a SPACE or HTAB in either the "B" or "Q" encoding),
- is incorrectly formed.
-
- (2) Any 'encoded-word' which encodes a non-integral number of
- characters or octets is incorrectly formed.
-
- A mail reader need not attempt to display the text associated with an
- 'encoded-word' that is incorrectly formed. However, a mail reader
- MUST NOT prevent the display or handling of a message because an
- 'encoded-word' is incorrectly formed.
-
-7. Conformance
-
- A mail composing program claiming compliance with this specification
- MUST ensure that any string of non-white-space printable ASCII
- characters within a '*text' or '*ctext' that begins with "=?" and
- ends with "?=" be a valid 'encoded-word'. ("begins" means: at the
-
-
-
-Moore Standards Track [Page 10]
-
-RFC 2047 Message Header Extensions November 1996
-
-
- start of the field-body, immediately following 'linear-white-space',
- or immediately following a "(" for an 'encoded-word' within '*ctext';
- "ends" means: at the end of the field-body, immediately preceding
- 'linear-white-space', or immediately preceding a ")" for an
- 'encoded-word' within '*ctext'.) In addition, any 'word' within a
- 'phrase' that begins with "=?" and ends with "?=" must be a valid
- 'encoded-word'.
-
- A mail reading program claiming compliance with this specification
- must be able to distinguish 'encoded-word's from 'text', 'ctext', or
- 'word's, according to the rules in section 6, anytime they appear in
- appropriate places in message headers. It must support both the "B"
- and "Q" encodings for any character set which it supports. The
- program must be able to display the unencoded text if the character
- set is "US-ASCII". For the ISO-8859-* character sets, the mail
- reading program must at least be able to display the characters which
- are also in the ASCII set.
-
-8. Examples
-
- The following are examples of message headers containing 'encoded-
- word's:
-
- From: =?US-ASCII?Q?Keith_Moore?= <moore at cs.utk.edu>
- To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld at dkuug.dk>
- CC: =?ISO-8859-1?Q?Andr=E9?= Pirard <PIRARD at vm1.ulg.ac.be>
- Subject: =?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?=
- =?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?=
-
- Note: In the first 'encoded-word' of the Subject field above, the
- last "=" at the end of the 'encoded-text' is necessary because each
- 'encoded-word' must be self-contained (the "=" character completes a
- group of 4 base64 characters representing 2 octets). An additional
- octet could have been encoded in the first 'encoded-word' (so that
- the encoded-word would contain an exact multiple of 3 encoded
- octets), except that the second 'encoded-word' uses a different
- 'charset' than the first one.
-
- From: =?ISO-8859-1?Q?Olle_J=E4rnefors?= <ojarnef at admin.kth.se>
- To: ietf-822 at dimacs.rutgers.edu, ojarnef at admin.kth.se
- Subject: Time for ISO 10646?
-
- To: Dave Crocker <dcrocker at mordor.stanford.edu>
- Cc: ietf-822 at dimacs.rutgers.edu, paf at comsol.se
- From: =?ISO-8859-1?Q?Patrik_F=E4ltstr=F6m?= <paf at nada.kth.se>
- Subject: Re: RFC-HDR care and feeding
-
-
-
-
-
-Moore Standards Track [Page 11]
-
-RFC 2047 Message Header Extensions November 1996
-
-
- From: Nathaniel Borenstein <nsb at thumper.bellcore.com>
- (=?iso-8859-8?b?7eXs+SDv4SDp7Oj08A==?=)
- To: Greg Vaudreuil <gvaudre at NRI.Reston.VA.US>, Ned Freed
- <ned at innosoft.com>, Keith Moore <moore at cs.utk.edu>
- Subject: Test of new header generator
- MIME-Version: 1.0
- Content-type: text/plain; charset=ISO-8859-1
-
- The following examples illustrate how text containing 'encoded-word's
- which appear in a structured field body. The rules are slightly
- different for fields defined as '*text' because "(" and ")" are not
- recognized as 'comment' delimiters. [Section 5, paragraph (1)].
-
- In each of the following examples, if the same sequence were to occur
- in a '*text' field, the "displayed as" form would NOT be treated as
- encoded words, but be identical to the "encoded form". This is
- because each of the encoded-words in the following examples is
- adjacent to a "(" or ")" character.
-
- encoded form displayed as
- ---------------------------------------------------------------------
- (=?ISO-8859-1?Q?a?=) (a)
-
- (=?ISO-8859-1?Q?a?= b) (a b)
-
- Within a 'comment', white space MUST appear between an
- 'encoded-word' and surrounding text. [Section 5,
- paragraph (2)]. However, white space is not needed between
- the initial "(" that begins the 'comment', and the
- 'encoded-word'.
-
-
- (=?ISO-8859-1?Q?a?= =?ISO-8859-1?Q?b?=) (ab)
-
- White space between adjacent 'encoded-word's is not
- displayed.
-
- (=?ISO-8859-1?Q?a?= =?ISO-8859-1?Q?b?=) (ab)
-
- Even multiple SPACEs between 'encoded-word's are ignored
- for the purpose of display.
-
- (=?ISO-8859-1?Q?a?= (ab)
- =?ISO-8859-1?Q?b?=)
-
- Any amount of linear-space-white between 'encoded-word's,
- even if it includes a CRLF followed by one or more SPACEs,
- is ignored for the purposes of display.
-
-
-
-Moore Standards Track [Page 12]
-
-RFC 2047 Message Header Extensions November 1996
-
-
- (=?ISO-8859-1?Q?a_b?=) (a b)
-
- In order to cause a SPACE to be displayed within a portion
- of encoded text, the SPACE MUST be encoded as part of the
- 'encoded-word'.
-
- (=?ISO-8859-1?Q?a?= =?ISO-8859-2?Q?_b?=) (a b)
-
- In order to cause a SPACE to be displayed between two strings
- of encoded text, the SPACE MAY be encoded as part of one of
- the 'encoded-word's.
-
-9. References
-
- [RFC 822] Crocker, D., "Standard for the Format of ARPA Internet Text
- Messages", STD 11, RFC 822, UDEL, August 1982.
-
- [RFC 2049] Borenstein, N., and N. Freed, "Multipurpose Internet Mail
- Extensions (MIME) Part Five: Conformance Criteria and Examples",
- RFC 2049, November 1996.
-
- [RFC 2045] Borenstein, N., and N. Freed, "Multipurpose Internet Mail
- Extensions (MIME) Part One: Format of Internet Message Bodies",
- RFC 2045, November 1996.
-
- [RFC 2046] Borenstein N., and N. Freed, "Multipurpose Internet Mail
- Extensions (MIME) Part Two: Media Types", RFC 2046,
- November 1996.
-
- [RFC 2048] Freed, N., Klensin, J., and J. Postel, "Multipurpose
- Internet Mail Extensions (MIME) Part Four: Registration
- Procedures", RFC 2048, November 1996.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Moore Standards Track [Page 13]
-
-RFC 2047 Message Header Extensions November 1996
-
-
-10. Security Considerations
-
- Security issues are not discussed in this memo.
-
-11. Acknowledgements
-
- The author wishes to thank Nathaniel Borenstein, Issac Chan, Lutz
- Donnerhacke, Paul Eggert, Ned Freed, Andreas M. Kirchwitz, Olle
- Jarnefors, Mike Rosin, Yutaka Sato, Bart Schaefer, and Kazuhiko
- Yamamoto, for their helpful advice, insightful comments, and
- illuminating questions in response to earlier versions of this
- specification.
-
-12. Author's Address
-
- Keith Moore
- University of Tennessee
- 107 Ayres Hall
- Knoxville TN 37996-1301
-
- EMail: moore at cs.utk.edu
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Moore Standards Track [Page 14]
-
-RFC 2047 Message Header Extensions November 1996
-
-
-Appendix - changes since RFC 1522 (in no particular order)
-
- + explicitly state that the MIME-Version is not requried to use
- 'encoded-word's.
-
- + add explicit note that SPACEs and TABs are not allowed within
- 'encoded-word's, explaining that an 'encoded-word' must look like an
- 'atom' to an RFC822 parser.values, to be precise).
-
- + add examples from Olle Jarnefors (thanks!) which illustrate how
- encoded-words with adjacent linear-white-space are displayed.
-
- + explicitly list terms defined in RFC822 and referenced in this memo
-
- + fix transcription typos that caused one or two lines and a couple of
- characters to disappear in the resulting text, due to nroff quirks.
-
- + clarify that encoded-words are allowed in '*text' fields in both
- RFC822 headers and MIME body part headers, but NOT as parameter
- values.
-
- + clarify the requirement to switch back to ASCII within the encoded
- portion of an 'encoded-word', for any charset that uses code switching
- sequences.
-
- + add a note about 'encoded-word's being delimited by "(" and ")"
- within a comment, but not in a *text (how bizarre!).
-
- + fix the Andre Pirard example to get rid of the trailing "_" after
- the =E9. (no longer needed post-1342).
-
- + clarification: an 'encoded-word' may appear immediately following
- the initial "(" or immediately before the final ")" that delimits a
- comment, not just adjacent to "(" and ")" *within* *ctext.
-
- + add a note to explain that a "B" 'encoded-word' will always have a
- multiple of 4 characters in the 'encoded-text' portion.
-
- + add note about the "=" in the examples
-
- + note that processing of 'encoded-word's occurs *after* parsing, and
- some of the implications thereof.
-
- + explicitly state that you can't expect to translate between
- 1522 and either vanilla 822 or so-called "8-bit headers".
-
- + explicitly state that 'encoded-word's are not valid within a
- 'quoted-string'.
-
-
-
-Moore Standards Track [Page 15]
-
-
diff --git a/reference/rfc2048 Multipurpose Internet Mail Extensions (4).txt b/reference/rfc2048 Multipurpose Internet Mail Extensions (4).txt
deleted file mode 100644
index 98b5327..0000000
--- a/reference/rfc2048 Multipurpose Internet Mail Extensions (4).txt
+++ /dev/null
@@ -1,1180 +0,0 @@
-
-
-
-
-
-
-Network Working Group N. Freed
-Request for Comments: 2048 Innosoft
-BCP: 13 J. Klensin
-Obsoletes: 1521, 1522, 1590 MCI
-Category: Best Current Practice J. Postel
- ISI
- November 1996
-
-
- Multipurpose Internet Mail Extensions
- (MIME) Part Four:
- Registration Procedures
-
-Status of this Memo
-
- This document specifies an Internet Best Current Practices for the
- Internet Community, and requests discussion and suggestions for
- improvements. Distribution of this memo is unlimited.
-
-Abstract
-
- STD 11, RFC 822, defines a message representation protocol specifying
- considerable detail about US-ASCII message headers, and leaves the
- message content, or message body, as flat US-ASCII text. This set of
- documents, collectively called the Multipurpose Internet Mail
- Extensions, or MIME, redefines the format of messages to allow for
-
- (1) textual message bodies in character sets other than
- US-ASCII,
-
- (2) an extensible set of different formats for non-textual
- message bodies,
-
- (3) multi-part message bodies, and
-
- (4) textual header information in character sets other than
- US-ASCII.
-
- These documents are based on earlier work documented in RFC 934, STD
- 11, and RFC 1049, but extends and revises them. Because RFC 822 said
- so little about message bodies, these documents are largely
- orthogonal to (rather than a revision of) RFC 822.
-
-
-
-
-
-
-
-
-
-Freed, et. al. Best Current Practice [Page 1]
-
-RFC 2048 MIME Registration Procedures November 1996
-
-
- This fourth document, RFC 2048, specifies various IANA registration
- procedures for the following MIME facilities:
-
- (1) media types,
-
- (2) external body access types,
-
- (3) content-transfer-encodings.
-
- Registration of character sets for use in MIME is covered elsewhere
- and is no longer addressed by this document.
-
- These documents are revisions of RFCs 1521 and 1522, which themselves
- were revisions of RFCs 1341 and 1342. An appendix in RFC 2049
- describes differences and changes from previous versions.
-
-Table of Contents
-
- 1. Introduction ......................................... 3
- 2. Media Type Registration .............................. 4
- 2.1 Registration Trees and Subtype Names ................ 4
- 2.1.1 IETF Tree ......................................... 4
- 2.1.2 Vendor Tree ....................................... 4
- 2.1.3 Personal or Vanity Tree ........................... 5
- 2.1.4 Special `x.' Tree ................................. 5
- 2.1.5 Additional Registration Trees ..................... 6
- 2.2 Registration Requirements ........................... 6
- 2.2.1 Functionality Requirement ......................... 6
- 2.2.2 Naming Requirements ............................... 6
- 2.2.3 Parameter Requirements ............................ 7
- 2.2.4 Canonicalization and Format Requirements .......... 7
- 2.2.5 Interchange Recommendations ....................... 8
- 2.2.6 Security Requirements ............................. 8
- 2.2.7 Usage and Implementation Non-requirements ......... 9
- 2.2.8 Publication Requirements .......................... 10
- 2.2.9 Additional Information ............................ 10
- 2.3 Registration Procedure .............................. 11
- 2.3.1 Present the Media Type to the Community for Review 11
- 2.3.2 IESG Approval ..................................... 12
- 2.3.3 IANA Registration ................................. 12
- 2.4 Comments on Media Type Registrations ................ 12
- 2.5 Location of Registered Media Type List .............. 12
- 2.6 IANA Procedures for Registering Media Types ......... 12
- 2.7 Change Control ...................................... 13
- 2.8 Registration Template ............................... 14
- 3. External Body Access Types ........................... 14
- 3.1 Registration Requirements ........................... 15
- 3.1.1 Naming Requirements ............................... 15
-
-
-
-Freed, et. al. Best Current Practice [Page 2]
-
-RFC 2048 MIME Registration Procedures November 1996
-
-
- 3.1.2 Mechanism Specification Requirements .............. 15
- 3.1.3 Publication Requirements .......................... 15
- 3.1.4 Security Requirements ............................. 15
- 3.2 Registration Procedure .............................. 15
- 3.2.1 Present the Access Type to the Community .......... 16
- 3.2.2 Access Type Reviewer .............................. 16
- 3.2.3 IANA Registration ................................. 16
- 3.3 Location of Registered Access Type List ............. 16
- 3.4 IANA Procedures for Registering Access Types ........ 16
- 4. Transfer Encodings ................................... 17
- 4.1 Transfer Encoding Requirements ...................... 17
- 4.1.1 Naming Requirements ............................... 17
- 4.1.2 Algorithm Specification Requirements .............. 18
- 4.1.3 Input Domain Requirements ......................... 18
- 4.1.4 Output Range Requirements ......................... 18
- 4.1.5 Data Integrity and Generality Requirements ........ 18
- 4.1.6 New Functionality Requirements .................... 18
- 4.2 Transfer Encoding Definition Procedure .............. 19
- 4.3 IANA Procedures for Transfer Encoding Registration... 19
- 4.4 Location of Registered Transfer Encodings List ...... 19
- 5. Authors' Addresses ................................... 20
- A. Grandfathered Media Types ............................ 21
-
-1. Introduction
-
- Recent Internet protocols have been carefully designed to be easily
- extensible in certain areas. In particular, MIME [RFC 2045] is an
- open-ended framework and can accommodate additional object types,
- character sets, and access methods without any changes to the basic
- protocol. A registration process is needed, however, to ensure that
- the set of such values is developed in an orderly, well-specified,
- and public manner.
-
- This document defines registration procedures which use the Internet
- Assigned Numbers Authority (IANA) as a central registry for such
- values.
-
- Historical Note: The registration process for media types was
- initially defined in the context of the asynchronous Internet mail
- environment. In this mail environment there is a need to limit the
- number of possible media types to increase the likelihood of
- interoperability when the capabilities of the remote mail system are
- not known. As media types are used in new environments, where the
- proliferation of media types is not a hindrance to interoperability,
- the original procedure was excessively restrictive and had to be
- generalized.
-
-
-
-
-
-Freed, et. al. Best Current Practice [Page 3]
-
-RFC 2048 MIME Registration Procedures November 1996
-
-
-2. Media Type Registration
-
- Registration of a new media type or types starts with the
- construction of a registration proposal. Registration may occur in
- several different registration trees, which have different
- requirements as discussed below. In general, the new registration
- proposal is circulated and reviewed in a fashion appropriate to the
- tree involved. The media type is then registered if the proposal is
- acceptable. The following sections describe the requirements and
- procedures used for each of the different registration trees.
-
-2.1. Registration Trees and Subtype Names
-
- In order to increase the efficiency and flexibility of the
- registration process, different structures of subtype names may be
- registered to accomodate the different natural requirements for,
- e.g., a subtype that will be recommended for wide support and
- implementation by the Internet Community or a subtype that is used to
- move files associated with proprietary software. The following
- subsections define registration "trees", distinguished by the use of
- faceted names (e.g., names of the form "tree.subtree...type"). Note
- that some media types defined prior to this document do not conform
- to the naming conventions described below. See Appendix A for a
- discussion of them.
-
-2.1.1. IETF Tree
-
- The IETF tree is intended for types of general interest to the
- Internet Community. Registration in the IETF tree requires approval
- by the IESG and publication of the media type registration as some
- form of RFC.
-
- Media types in the IETF tree are normally denoted by names that are
- not explicitly faceted, i.e., do not contain period (".", full stop)
- characters.
-
- The "owner" of a media type registration in the IETF tree is assumed
- to be the IETF itself. Modification or alteration of the
- specification requires the same level of processing (e.g. standards
- track) required for the initial registration.
-
-2.1.2. Vendor Tree
-
- The vendor tree is used for media types associated with commercially
- available products. "Vendor" or "producer" are construed as
- equivalent and very broadly in this context.
-
-
-
-
-
-Freed, et. al. Best Current Practice [Page 4]
-
-RFC 2048 MIME Registration Procedures November 1996
-
-
- A registration may be placed in the vendor tree by anyone who has
- need to interchange files associated with the particular product.
- However, the registration formally belongs to the vendor or
- organization producing the software or file format. Changes to the
- specification will be made at their request, as discussed in
- subsequent sections.
-
- Registrations in the vendor tree will be distinguished by the leading
- facet "vnd.". That may be followed, at the discretion of the
- registration, by either a media type name from a well-known producer
- (e.g., "vnd.mudpie") or by an IANA-approved designation of the
- producer's name which is then followed by a media type or product
- designation (e.g., vnd.bigcompany.funnypictures).
-
- While public exposure and review of media types to be registered in
- the vendor tree is not required, using the ietf-types list for review
- is strongly encouraged to improve the quality of those
- specifications. Registrations in the vendor tree may be submitted
- directly to the IANA.
-
-2.1.3. Personal or Vanity Tree
-
- Registrations for media types created experimentally or as part of
- products that are not distributed commercially may be registered in
- the personal or vanity tree. The registrations are distinguished by
- the leading facet "prs.".
-
- The owner of "personal" registrations and associated specifications
- is the person or entity making the registration, or one to whom
- responsibility has been transferred as described below.
-
- While public exposure and review of media types to be registered in
- the personal tree is not required, using the ietf-types list for
- review is strongly encouraged to improve the quality of those
- specifications. Registrations in the personl tree may be submitted
- directly to the IANA.
-
-2.1.4. Special `x.' Tree
-
- For convenience and symmetry with this registration scheme, media
- type names with "x." as the first facet may be used for the same
- purposes for which names starting in "x-" are normally used. These
- types are unregistered, experimental, and should be used only with
- the active agreement of the parties exchanging them.
-
-
-
-
-
-
-
-Freed, et. al. Best Current Practice [Page 5]
-
-RFC 2048 MIME Registration Procedures November 1996
-
-
- However, with the simplified registration procedures described above
- for vendor and personal trees, it should rarely, if ever, be
- necessary to use unregistered experimental types, and as such use of
- both "x-" and "x." forms is discouraged.
-
-2.1.5. Additional Registration Trees
-
- From time to time and as required by the community, the IANA may,
- with the advice and consent of the IESG, create new top-level
- registration trees. It is explicitly assumed that these trees may be
- created for external registration and management by well-known
- permanent bodies, such as scientific societies for media types
- specific to the sciences they cover. In general, the quality of
- review of specifications for one of these additional registration
- trees is expected to be equivalent to that which IETF would give to
- registrations in its own tree. Establishment of these new trees will
- be announced through RFC publication approved by the IESG.
-
-2.2. Registration Requirements
-
- Media type registration proposals are all expected to conform to
- various requirements laid out in the following sections. Note that
- requirement specifics sometimes vary depending on the registration
- tree, again as detailed in the following sections.
-
-2.2.1. Functionality Requirement
-
- Media types must function as an actual media format: Registration of
- things that are better thought of as a transfer encoding, as a
- character set, or as a collection of separate entities of another
- type, is not allowed. For example, although applications exist to
- decode the base64 transfer encoding [RFC 2045], base64 cannot be
- registered as a media type.
-
- This requirement applies regardless of the registration tree
- involved.
-
-2.2.2. Naming Requirements
-
- All registered media types must be assigned MIME type and subtype
- names. The combination of these names then serves to uniquely
- identify the media type and the format of the subtype name identifies
- the registration tree.
-
- The choice of top-level type name must take the nature of media type
- involved into account. For example, media normally used for
- representing still images should be a subtype of the image content
- type, whereas media capable of representing audio information belongs
-
-
-
-Freed, et. al. Best Current Practice [Page 6]
-
-RFC 2048 MIME Registration Procedures November 1996
-
-
- under the audio content type. See RFC 2046 for additional information
- on the basic set of top-level types and their characteristics.
-
- New subtypes of top-level types must conform to the restrictions of
- the top-level type, if any. For example, all subtypes of the
- multipart content type must use the same encapsulation syntax.
-
- In some cases a new media type may not "fit" under any currently
- defined top-level content type. Such cases are expected to be quite
- rare. However, if such a case arises a new top-level type can be
- defined to accommodate it. Such a definition must be done via
- standards-track RFC; no other mechanism can be used to define
- additional top-level content types.
-
- These requirements apply regardless of the registration tree
- involved.
-
-2.2.3. Parameter Requirements
-
- Media types may elect to use one or more MIME content type
- parameters, or some parameters may be automatically made available to
- the media type by virtue of being a subtype of a content type that
- defines a set of parameters applicable to any of its subtypes. In
- either case, the names, values, and meanings of any parameters must
- be fully specified when a media type is registered in the IETF tree,
- and should be specified as completely as possible when media types
- are registered in the vendor or personal trees.
-
- New parameters must not be defined as a way to introduce new
- functionality in types registered in the IETF tree, although new
- parameters may be added to convey additional information that does
- not otherwise change existing functionality. An example of this
- would be a "revision" parameter to indicate a revision level of an
- external specification such as JPEG. Similar behavior is encouraged
- for media types registered in the vendor or personal trees but is not
- required.
-
-2.2.4. Canonicalization and Format Requirements
-
- All registered media types must employ a single, canonical data
- format, regardless of registration tree.
-
- A precise and openly available specification of the format of each
- media type is required for all types registered in the IETF tree and
- must at a minimum be referenced by, if it isn't actually included in,
- the media type registration proposal itself.
-
-
-
-
-
-Freed, et. al. Best Current Practice [Page 7]
-
-RFC 2048 MIME Registration Procedures November 1996
-
-
- The specifications of format and processing particulars may or may
- not be publically available for media types registered in the vendor
- tree, and such registration proposals are explicitly permitted to
- include only a specification of which software and version produce or
- process such media types. References to or inclusion of format
- specifications in registration proposals is encouraged but not
- required.
-
- Format specifications are still required for registration in the
- personal tree, but may be either published as RFCs or otherwise
- deposited with IANA. The deposited specifications will meet the same
- criteria as those required to register a well-known TCP port and, in
- particular, need not be made public.
-
- Some media types involve the use of patented technology. The
- registration of media types involving patented technology is
- specifically permitted. However, the restrictions set forth in RFC
- 1602 on the use of patented technology in standards-track protocols
- must be respected when the specification of a media type is part of a
- standards-track protocol.
-
-2.2.5. Interchange Recommendations
-
- Media types should, whenever possible, interoperate across as many
- systems and applications as possible. However, some media types will
- inevitably have problems interoperating across different platforms.
- Problems with different versions, byte ordering, and specifics of
- gateway handling can and will arise.
-
- Universal interoperability of media types is not required, but known
- interoperability issues should be identified whenever possible.
- Publication of a media type does not require an exhaustive review of
- interoperability, and the interoperability considerations section is
- subject to continuing evaluation.
-
- These recommendations apply regardless of the registration tree
- involved.
-
-2.2.6. Security Requirements
-
- An analysis of security issues is required for for all types
- registered in the IETF Tree. (This is in accordance with the basic
- requirements for all IETF protocols.) A similar analysis for media
- types registered in the vendor or personal trees is encouraged but
- not required. However, regardless of what security analysis has or
- has not been done, all descriptions of security issues must be as
- accurate as possible regardless of registration tree. In particular,
- a statement that there are "no security issues associated with this
-
-
-
-Freed, et. al. Best Current Practice [Page 8]
-
-RFC 2048 MIME Registration Procedures November 1996
-
-
- type" must not be confused with "the security issues associates with
- this type have not been assessed".
-
- There is absolutely no requirement that media types registered in any
- tree be secure or completely free from risks. Nevertheless, all
- known security risks must be identified in the registration of a
- media type, again regardless of registration tree.
-
- The security considerations section of all registrations is subject
- to continuing evaluation and modification, and in particular may be
- extended by use of the "comments on media types" mechanism described
- in subsequent sections.
-
- Some of the issues that should be looked at in a security analysis of
- a media type are:
-
- (1) Complex media types may include provisions for
- directives that institute actions on a recipient's
- files or other resources. In many cases provision is
- made for originators to specify arbitrary actions in an
- unrestricted fashion which may then have devastating
- effects. See the registration of the
- application/postscript media type in RFC 2046 for
- an example of such directives and how to handle them.
-
- (2) Complex media types may include provisions for
- directives that institute actions which, while not
- directly harmful to the recipient, may result in
- disclosure of information that either facilitates a
- subsequent attack or else violates a recipient's
- privacy in some way. Again, the registration of the
- application/postscript media type illustrates how such
- directives can be handled.
-
- (3) A media type might be targeted for applications that
- require some sort of security assurance but not provide
- the necessary security mechanisms themselves. For
- example, a media type could be defined for storage of
- confidential medical information which in turn requires
- an external confidentiality service.
-
-2.2.7. Usage and Implementation Non-requirements
-
- In the asynchronous mail environment, where information on the
- capabilities of the remote mail agent is frequently not available to
- the sender, maximum interoperability is attained by restricting the
- number of media types used to those "common" formats expected to be
- widely implemented. This was asserted in the past as a reason to
-
-
-
-Freed, et. al. Best Current Practice [Page 9]
-
-RFC 2048 MIME Registration Procedures November 1996
-
-
- limit the number of possible media types and resulted in a
- registration process with a significant hurdle and delay for those
- registering media types.
-
- However, the need for "common" media types does not require limiting
- the registration of new media types. If a limited set of media types
- is recommended for a particular application, that should be asserted
- by a separate applicability statement specific for the application
- and/or environment.
-
- As such, universal support and implementation of a media type is NOT
- a requirement for registration. If, however, a media type is
- explicitly intended for limited use, this should be noted in its
- registration.
-
-2.2.8. Publication Requirements
-
- Proposals for media types registered in the IETF tree must be
- published as RFCs. RFC publication of vendor and personal media type
- proposals is encouraged but not required. In all cases IANA will
- retain copies of all media type proposals and "publish" them as part
- of the media types registration tree itself.
-
- Other than in the IETF tree, the registration of a data type does not
- imply endorsement, approval, or recommendation by IANA or IETF or
- even certification that the specification is adequate. To become
- Internet Standards, protocol, data objects, or whatever must go
- through the IETF standards process. This is too difficult and too
- lengthy a process for the convenient registration of media types.
-
- The IETF tree exists for media types that do require require a
- substantive review and approval process with the vendor and personal
- trees exist for those that do not. It is expected that applicability
- statements for particular applications will be published from time to
- time that recommend implementation of, and support for, media types
- that have proven particularly useful in those contexts.
-
- As discussed above, registration of a top-level type requires
- standards-track processing and, hence, RFC publication.
-
-2.2.9. Additional Information
-
- Various sorts of optional information may be included in the
- specification of a media type if it is available:
-
- (1) Magic number(s) (length, octet values). Magic numbers
- are byte sequences that are always present and thus can
- be used to identify entities as being of a given media
-
-
-
-Freed, et. al. Best Current Practice [Page 10]
-
-RFC 2048 MIME Registration Procedures November 1996
-
-
- type.
-
- (2) File extension(s) commonly used on one or more
- platforms to indicate that some file containing a given
- type of media.
-
- (3) Macintosh File Type code(s) (4 octets) used to label
- files containing a given type of media.
-
- Such information is often quite useful to implementors and if
- available should be provided.
-
-2.3. Registration Procedure
-
- The following procedure has been implemented by the IANA for review
- and approval of new media types. This is not a formal standards
- process, but rather an administrative procedure intended to allow
- community comment and sanity checking without excessive time delay.
- For registration in the IETF tree, the normal IETF processes should
- be followed, treating posting of an internet-draft and announcement
- on the ietf-types list (as described in the next subsection) as a
- first step. For registrations in the vendor or personal tree, the
- initial review step described below may be omitted and the type
- registered directly by submitting the template and an explanation
- directly to IANA (at iana at iana.org). However, authors of vendor or
- personal media type specifications are encouraged to seek community
- review and comment whenever that is feasible.
-
-2.3.1. Present the Media Type to the Community for Review
-
- Send a proposed media type registration to the "ietf-types at iana.org"
- mailing list for a two week review period. This mailing list has
- been established for the purpose of reviewing proposed media and
- access types. Proposed media types are not formally registered and
- must not be used; the "x-" prefix specified in RFC 2045 can be used
- until registration is complete.
-
- The intent of the public posting is to solicit comments and feedback
- on the choice of type/subtype name, the unambiguity of the references
- with respect to versions and external profiling information, and a
- review of any interoperability or security considerations. The
- submitter may submit a revised registration, or withdraw the
- registration completely, at any time.
-
-
-
-
-
-
-
-
-Freed, et. al. Best Current Practice [Page 11]
-
-RFC 2048 MIME Registration Procedures November 1996
-
-
-2.3.2. IESG Approval
-
- Media types registered in the IETF tree must be submitted to the IESG
- for approval.
-
-2.3.3. IANA Registration
-
- Provided that the media type meets the requirements for media types
- and has obtained approval that is necessary, the author may submit
- the registration request to the IANA, which will register the media
- type and make the media type registration available to the community.
-
-2.4. Comments on Media Type Registrations
-
- Comments on registered media types may be submitted by members of the
- community to IANA. These comments will be passed on to the "owner"
- of the media type if possible. Submitters of comments may request
- that their comment be attached to the media type registration itself,
- and if IANA approves of this the comment will be made accessible in
- conjunction with the type registration itself.
-
-2.5. Location of Registered Media Type List
-
- Media type registrations will be posted in the anonymous FTP
- directory "ftp://ftp.isi.edu/in-notes/iana/assignments/media-types/"
- and all registered media types will be listed in the periodically
- issued "Assigned Numbers" RFC [currently STD 2, RFC 1700]. The media
- type description and other supporting material may also be published
- as an Informational RFC by sending it to "rfc-editor at isi.edu" (please
- follow the instructions to RFC authors [RFC-1543]).
-
-2.6. IANA Procedures for Registering Media Types
-
- The IANA will only register media types in the IETF tree in response
- to a communication from the IESG stating that a given registration
- has been approved. Vendor and personal types will be registered by
- the IANA automatically and without any formal review as long as the
- following minimal conditions are met:
-
- (1) Media types must function as an actual media format.
- In particular, character sets and transfer encodings
- may not be registered as media types.
-
- (2) All media types must have properly formed type and
- subtype names. All type names must be defined by a
- standards-track RFC. All subtype names must be unique,
- must conform to the MIME grammar for such names, and
- must contain the proper tree prefix.
-
-
-
-Freed, et. al. Best Current Practice [Page 12]
-
-RFC 2048 MIME Registration Procedures November 1996
-
-
- (3) Types registered in the personal tree must either
- provide a format specification or a pointer to one.
-
- (4) Any security considerations given must not be obviously
- bogus. (It is neither possible nor necessary for the
- IANA to conduct a comprehensive security review of
- media type registrations. Nevertheless, IANA has the
- authority to identify obviously incompetent material
- and exclude it.)
-
-2.7. Change Control
-
- Once a media type has been published by IANA, the author may request
- a change to its definition. The descriptions of the different
- registration trees above designate the "owners" of each type of
- registration. The change request follows the same procedure as the
- registration request:
-
- (1) Publish the revised template on the ietf-types list.
-
- (2) Leave at least two weeks for comments.
-
- (3) Publish using IANA after formal review if required.
-
- Changes should be requested only when there are serious omission or
- errors in the published specification. When review is required, a
- change request may be denied if it renders entities that were valid
- under the previous definition invalid under the new definition.
-
- The owner of a content type may pass responsibility for the content
- type to another person or agency by informing IANA and the ietf-types
- list; this can be done without discussion or review.
-
- The IESG may reassign responsibility for a media type. The most
- common case of this will be to enable changes to be made to types
- where the author of the registration has died, moved out of contact
- or is otherwise unable to make changes that are important to the
- community.
-
- Media type registrations may not be deleted; media types which are no
- longer believed appropriate for use can be declared OBSOLETE by a
- change to their "intended use" field; such media types will be
- clearly marked in the lists published by IANA.
-
-
-
-
-
-
-
-
-Freed, et. al. Best Current Practice [Page 13]
-
-RFC 2048 MIME Registration Procedures November 1996
-
-
-2.8. Registration Template
-
- To: ietf-types at iana.org
- Subject: Registration of MIME media type XXX/YYY
-
- MIME media type name:
-
- MIME subtype name:
-
- Required parameters:
-
- Optional parameters:
-
- Encoding considerations:
-
- Security considerations:
-
- Interoperability considerations:
-
- Published specification:
-
- Applications which use this media type:
-
- Additional information:
-
- Magic number(s):
- File extension(s):
- Macintosh File Type Code(s):
-
- Person & email address to contact for further information:
-
- Intended usage:
-
- (One of COMMON, LIMITED USE or OBSOLETE)
-
- Author/Change controller:
-
- (Any other information that the author deems interesting may be
- added below this line.)
-
-3. External Body Access Types
-
- RFC 2046 defines the message/external-body media type, whereby a MIME
- entity can act as pointer to the actual body data in lieu of
- including the data directly in the entity body. Each
- message/external-body reference specifies an access type, which
- determines the mechanism used to retrieve the actual body data. RFC
- 2046 defines an initial set of access types, but allows for the
-
-
-
-Freed, et. al. Best Current Practice [Page 14]
-
-RFC 2048 MIME Registration Procedures November 1996
-
-
- registration of additional access types to accommodate new retrieval
- mechanisms.
-
-3.1. Registration Requirements
-
- New access type specifications must conform to a number of
- requirements as described below.
-
-3.1.1. Naming Requirements
-
- Each access type must have a unique name. This name appears in the
- access-type parameter in the message/external-body content-type
- header field, and must conform to MIME content type parameter syntax.
-
-3.1.2. Mechanism Specification Requirements
-
- All of the protocols, transports, and procedures used by a given
- access type must be described, either in the specification of the
- access type itself or in some other publicly available specification,
- in sufficient detail for the access type to be implemented by any
- competent implementor. Use of secret and/or proprietary methods in
- access types are expressly prohibited. The restrictions imposed by
- RFC 1602 on the standardization of patented algorithms must be
- respected as well.
-
-3.1.3. Publication Requirements
-
- All access types must be described by an RFC. The RFC may be
- informational rather than standards-track, although standard-track
- review and approval are encouraged for all access types.
-
-3.1.4. Security Requirements
-
- Any known security issues that arise from the use of the access type
- must be completely and fully described. It is not required that the
- access type be secure or that it be free from risks, but that the
- known risks be identified. Publication of a new access type does not
- require an exhaustive security review, and the security
- considerations section is subject to continuing evaluation.
- Additional security considerations should be addressed by publishing
- revised versions of the access type specification.
-
-3.2. Registration Procedure
-
- Registration of a new access type starts with the construction of a
- draft of an RFC.
-
-
-
-
-
-Freed, et. al. Best Current Practice [Page 15]
-
-RFC 2048 MIME Registration Procedures November 1996
-
-
-3.2.1. Present the Access Type to the Community
-
- Send a proposed access type specification to the "ietf-
- types at iana.org" mailing list for a two week review period. This
- mailing list has been established for the purpose of reviewing
- proposed access and media types. Proposed access types are not
- formally registered and must not be used.
-
- The intent of the public posting is to solicit comments and feedback
- on the access type specification and a review of any security
- considerations.
-
-3.2.2. Access Type Reviewer
-
- When the two week period has passed, the access type reviewer, who is
- appointed by the IETF Applications Area Director, either forwards the
- request to iana at isi.edu, or rejects it because of significant
- objections raised on the list.
-
- Decisions made by the reviewer must be posted to the ietf-types
- mailing list within 14 days. Decisions made by the reviewer may be
- appealed to the IESG.
-
-3.2.3. IANA Registration
-
- Provided that the access type has either passed review or has been
- successfully appealed to the IESG, the IANA will register the access
- type and make the registration available to the community. The
- specification of the access type must also be published as an RFC.
- Informational RFCs are published by sending them to "rfc-
- editor at isi.edu" (please follow the instructions to RFC authors [RFC-
- 1543]).
-
-3.3. Location of Registered Access Type List
-
- Access type registrations will be posted in the anonymous FTP
- directory "ftp://ftp.isi.edu/in-notes/iana/assignments/access-types/"
- and all registered access types will be listed in the periodically
- issued "Assigned Numbers" RFC [currently RFC-1700].
-
-3.4. IANA Procedures for Registering Access Types
-
- The identity of the access type reviewer is communicated to the IANA
- by the IESG. The IANA then only acts in response to access type
- definitions that either are approved by the access type reviewer and
- forwarded by the reviewer to the IANA for registration, or in
- response to a communication from the IESG that an access type
- definition appeal has overturned the access type reviewer's ruling.
-
-
-
-Freed, et. al. Best Current Practice [Page 16]
-
-RFC 2048 MIME Registration Procedures November 1996
-
-
-4. Transfer Encodings
-
- Transfer encodings are tranformations applied to MIME media types
- after conversion to the media type's canonical form. Transfer
- encodings are used for several purposes:
-
- (1) Many transports, especially message transports, can
- only handle data consisting of relatively short lines
- of text. There can also be severe restrictions on what
- characters can be used in these lines of text -- some
- transports are restricted to a small subset of US-ASCII
- and others cannot handle certain character sequences.
- Transfer encodings are used to transform binary data
- into textual form that can survive such transports.
- Examples of this sort of transfer encoding include the
- base64 and quoted-printable transfer encodings defined
- in RFC 2045.
-
- (2) Image, audio, video, and even application entities are
- sometimes quite large. Compression algorithms are often
- quite effective in reducing the size of large entities.
- Transfer encodings can be used to apply general-purpose
- non-lossy compression algorithms to MIME entities.
-
- (3) Transport encodings can be defined as a means of
- representing existing encoding formats in a MIME
- context.
-
- IMPORTANT: The standardization of a large numbers of different
- transfer encodings is seen as a significant barrier to widespread
- interoperability and is expressely discouraged. Nevertheless, the
- following procedure has been defined to provide a means of defining
- additional transfer encodings, should standardization actually be
- justified.
-
-4.1. Transfer Encoding Requirements
-
- Transfer encoding specifications must conform to a number of
- requirements as described below.
-
-4.1.1. Naming Requirements
-
- Each transfer encoding must have a unique name. This name appears in
- the Content-Transfer-Encoding header field and must conform to the
- syntax of that field.
-
-
-
-
-
-
-Freed, et. al. Best Current Practice [Page 17]
-
-RFC 2048 MIME Registration Procedures November 1996
-
-
-4.1.2. Algorithm Specification Requirements
-
- All of the algorithms used in a transfer encoding (e.g. conversion
- to printable form, compression) must be described in their entirety
- in the transfer encoding specification. Use of secret and/or
- proprietary algorithms in standardized transfer encodings are
- expressly prohibited. The restrictions imposed by RFC 1602 on the
- standardization of patented algorithms must be respected as well.
-
-4.1.3. Input Domain Requirements
-
- All transfer encodings must be applicable to an arbitrary sequence of
- octets of any length. Dependence on particular input forms is not
- allowed.
-
- It should be noted that the 7bit and 8bit encodings do not conform to
- this requirement. Aside from the undesireability of having
- specialized encodings, the intent here is to forbid the addition of
- additional encodings along the lines of 7bit and 8bit.
-
-4.1.4. Output Range Requirements
-
- There is no requirement that a particular tranfer encoding produce a
- particular form of encoded output. However, the output format for
- each transfer encoding must be fully and completely documented. In
- particular, each specification must clearly state whether the output
- format always lies within the confines of 7bit data, 8bit data, or is
- simply pure binary data.
-
-4.1.5. Data Integrity and Generality Requirements
-
- All transfer encodings must be fully invertible on any platform; it
- must be possible for anyone to recover the original data by
- performing the corresponding decoding operation. Note that this
- requirement effectively excludes all forms of lossy compression as
- well as all forms of encryption from use as a transfer encoding.
-
-4.1.6. New Functionality Requirements
-
- All transfer encodings must provide some sort of new functionality.
- Some degree of functionality overlap with previously defined transfer
- encodings is acceptable, but any new transfer encoding must also
- offer something no other transfer encoding provides.
-
-
-
-
-
-
-
-
-Freed, et. al. Best Current Practice [Page 18]
-
-RFC 2048 MIME Registration Procedures November 1996
-
-
-4.2. Transfer Encoding Definition Procedure
-
- Definition of a new transfer encoding starts with the construction of
- a draft of a standards-track RFC. The RFC must define the transfer
- encoding precisely and completely, and must also provide substantial
- justification for defining and standardizing a new transfer encoding.
- This specification must then be presented to the IESG for
- consideration. The IESG can
-
- (1) reject the specification outright as being
- inappropriate for standardization,
-
- (2) approve the formation of an IETF working group to work
- on the specification in accordance with IETF
- procedures, or,
-
- (3) accept the specification as-is and put it directly on
- the standards track.
-
- Transfer encoding specifications on the standards track follow normal
- IETF rules for standards track documents. A transfer encoding is
- considered to be defined and available for use once it is on the
- standards track.
-
-4.3. IANA Procedures for Transfer Encoding Registration
-
- There is no need for a special procedure for registering Transfer
- Encodings with the IANA. All legitimate transfer encoding
- registrations must appear as a standards-track RFC, so it is the
- IESG's responsibility to notify the IANA when a new transfer encoding
- has been approved.
-
-4.4. Location of Registered Transfer Encodings List
-
- Transfer encoding registrations will be posted in the anonymous FTP
- directory "ftp://ftp.isi.edu/in-notes/iana/assignments/transfer-
- encodings/" and all registered transfer encodings will be listed in
- the periodically issued "Assigned Numbers" RFC [currently RFC-1700].
-
-
-
-
-
-
-
-
-
-
-
-
-
-Freed, et. al. Best Current Practice [Page 19]
-
-RFC 2048 MIME Registration Procedures November 1996
-
-
-5. Authors' Addresses
-
- For more information, the authors of this document are best
- contacted via Internet mail:
-
- Ned Freed
- Innosoft International, Inc.
- 1050 East Garvey Avenue South
- West Covina, CA 91790
- USA
-
- Phone: +1 818 919 3600
- Fax: +1 818 919 3614
- EMail: ned at innosoft.com
-
-
- John Klensin
- MCI
- 2100 Reston Parkway
- Reston, VA 22091
-
- Phone: +1 703 715-7361
- Fax: +1 703 715-7436
- EMail: klensin at mci.net
-
-
- Jon Postel
- USC/Information Sciences Institute
- 4676 Admiralty Way
- Marina del Rey, CA 90292
- USA
-
-
- Phone: +1 310 822 1511
- Fax: +1 310 823 6714
- EMail: Postel at ISI.EDU
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Freed, et. al. Best Current Practice [Page 20]
-
-RFC 2048 MIME Registration Procedures November 1996
-
-
-Appendix A -- Grandfathered Media Types
-
- A number of media types, registered prior to 1996, would, if
- registered under the guidelines in this document, be placed into
- either the vendor or personal trees. Reregistration of those types
- to reflect the appropriate trees is encouraged, but not required.
- Ownership and change control principles outlined in this document
- apply to those types as if they had been registered in the trees
- described above.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Freed, et. al. Best Current Practice [Page 21]
-
\ No newline at end of file
diff --git a/reference/rfc2049 Multipurpose Internet Mail Extensions (5).txt b/reference/rfc2049 Multipurpose Internet Mail Extensions (5).txt
deleted file mode 100644
index 3b8b53f..0000000
--- a/reference/rfc2049 Multipurpose Internet Mail Extensions (5).txt
+++ /dev/null
@@ -1,1347 +0,0 @@
-
-
-
-
-
-
-Network Working Group N. Freed
-Request for Comments: 2049 Innosoft
-Obsoletes: 1521, 1522, 1590 N. Borenstein
-Category: Standards Track First Virtual
- November 1996
-
-
- Multipurpose Internet Mail Extensions
- (MIME) Part Five:
- Conformance Criteria and Examples
-
-Status of this Memo
-
- This document specifies an Internet standards track protocol for the
- Internet community, and requests discussion and suggestions for
- improvements. Please refer to the current edition of the "Internet
- Official Protocol Standards" (STD 1) for the standardization state
- and status of this protocol. Distribution of this memo is unlimited.
-
-Abstract
-
- STD 11, RFC 822, defines a message representation protocol specifying
- considerable detail about US-ASCII message headers, and leaves the
- message content, or message body, as flat US-ASCII text. This set of
- documents, collectively called the Multipurpose Internet Mail
- Extensions, or MIME, redefines the format of messages to allow for
-
- (1) textual message bodies in character sets other than
- US-ASCII,
-
- (2) an extensible set of different formats for non-textual
- message bodies,
-
- (3) multi-part message bodies, and
-
- (4) textual header information in character sets other than
- US-ASCII.
-
- These documents are based on earlier work documented in RFC 934, STD
- 11, and RFC 1049, but extends and revises them. Because RFC 822 said
- so little about message bodies, these documents are largely
- orthogonal to (rather than a revision of) RFC 822.
-
- The initial document in this set, RFC 2045, specifies the various
- headers used to describe the structure of MIME messages. The second
- document defines the general structure of the MIME media typing
- system and defines an initial set of media types. The third
- document, RFC 2047, describes extensions to RFC 822 to allow non-US-
-
-
-
-Freed & Borenstein Standards Track [Page 1]
-
-RFC 2049 MIME Conformance November 1996
-
-
- ASCII text data in Internet mail header fields. The fourth document,
- RFC 2048, specifies various IANA registration procedures for MIME-
- related facilities. This fifth and final document describes MIME
- conformance criteria as well as providing some illustrative examples
- of MIME message formats, acknowledgements, and the bibliography.
-
- These documents are revisions of RFCs 1521, 1522, and 1590, which
- themselves were revisions of RFCs 1341 and 1342. Appendix B of this
- document describes differences and changes from previous versions.
-
-Table of Contents
-
- 1. Introduction .......................................... 2
- 2. MIME Conformance ...................................... 2
- 3. Guidelines for Sending Email Data ..................... 6
- 4. Canonical Encoding Model .............................. 9
- 5. Summary ............................................... 12
- 6. Security Considerations ............................... 12
- 7. Authors' Addresses .................................... 12
- 8. Acknowledgements ...................................... 13
- A. A Complex Multipart Example ........................... 15
- B. Changes from RFC 1521, 1522, and 1590 ................. 16
- C. References ............................................ 20
-
-1. Introduction
-
- The first and second documents in this set define MIME header fields
- and the initial set of MIME media types. The third document
- describes extensions to RFC822 formats to allow for character sets
- other than US-ASCII. This document describes what portions of MIME
- must be supported by a conformant MIME implementation. It also
- describes various pitfalls of contemporary messaging systems as well
- as the canonical encoding model MIME is based on.
-
-2. MIME Conformance
-
- The mechanisms described in these documents are open-ended. It is
- definitely not expected that all implementations will support all
- available media types, nor that they will all share the same
- extensions. In order to promote interoperability, however, it is
- useful to define the concept of "MIME-conformance" to define a
- certain level of implementation that allows the useful interworking
- of messages with content that differs from US-ASCII text. In this
- section, we specify the requirements for such conformance.
-
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 2]
-
-RFC 2049 MIME Conformance November 1996
-
-
- A mail user agent that is MIME-conformant MUST:
-
- (1) Always generate a "MIME-Version: 1.0" header field in
- any message it creates.
-
- (2) Recognize the Content-Transfer-Encoding header field
- and decode all received data encoded by either quoted-
- printable or base64 implementations. The identity
- transformations 7bit, 8bit, and binary must also be
- recognized.
-
- Any non-7bit data that is sent without encoding must be
- properly labelled with a content-transfer-encoding of
- 8bit or binary, as appropriate. If the underlying
- transport does not support 8bit or binary (as SMTP
- [RFC-821] does not), the sender is required to both
- encode and label data using an appropriate Content-
- Transfer-Encoding such as quoted-printable or base64.
-
- (3) Must treat any unrecognized Content-Transfer-Encoding
- as if it had a Content-Type of "application/octet-
- stream", regardless of whether or not the actual
- Content-Type is recognized.
-
- (4) Recognize and interpret the Content-Type header field,
- and avoid showing users raw data with a Content-Type
- field other than text. Implementations must be able
- to send at least text/plain messages, with the
- character set specified with the charset parameter if
- it is not US-ASCII.
-
- (5) Ignore any content type parameters whose names they do
- not recognize.
-
- (6) Explicitly handle the following media type values, to
- at least the following extents:
-
- Text:
-
- -- Recognize and display "text" mail with the
- character set "US-ASCII."
-
- -- Recognize other character sets at least to the
- extent of being able to inform the user about what
- character set the message uses.
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 3]
-
-RFC 2049 MIME Conformance November 1996
-
-
- -- Recognize the "ISO-8859-*" character sets to the
- extent of being able to display those characters that
- are common to ISO-8859-* and US-ASCII, namely all
- characters represented by octet values 1-127.
-
- -- For unrecognized subtypes in a known character
- set, show or offer to show the user the "raw" version
- of the data after conversion of the content from
- canonical form to local form.
-
- -- Treat material in an unknown character set as if
- it were "application/octet-stream".
-
- Image, audio, and video:
-
- -- At a minumum provide facilities to treat any
- unrecognized subtypes as if they were
- "application/octet-stream".
-
- Application:
-
- -- Offer the ability to remove either of the quoted-
- printable or base64 encodings defined in this
- document if they were used and put the resulting
- information in a user file.
-
- Multipart:
-
- -- Recognize the mixed subtype. Display all relevant
- information on the message level and the body part
- header level and then display or offer to display
- each of the body parts individually.
-
- -- Recognize the "alternative" subtype, and avoid
- showing the user redundant parts of
- multipart/alternative mail.
-
- -- Recognize the "multipart/digest" subtype,
- specifically using "message/rfc822" rather than
- "text/plain" as the default media type for body parts
- inside "multipart/digest" entities.
-
- -- Treat any unrecognized subtypes as if they were
- "mixed".
-
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 4]
-
-RFC 2049 MIME Conformance November 1996
-
-
- Message:
-
- -- Recognize and display at least the RFC822 message
- encapsulation (message/rfc822) in such a way as to
- preserve any recursive structure, that is, displaying
- or offering to display the encapsulated data in
- accordance with its media type.
-
- -- Treat any unrecognized subtypes as if they were
- "application/octet-stream".
-
- (7) Upon encountering any unrecognized Content-Type field,
- an implementation must treat it as if it had a media
- type of "application/octet-stream" with no parameter
- sub-arguments. How such data are handled is up to an
- implementation, but likely options for handling such
- unrecognized data include offering the user to write it
- into a file (decoded from its mail transport format) or
- offering the user to name a program to which the
- decoded data should be passed as input.
-
- (8) Conformant user agents are required, if they provide
- non-standard support for non-MIME messages employing
- character sets other than US-ASCII, to do so on
- received messages only. Conforming user agents must not
- send non-MIME messages containing anything other than
- US-ASCII text.
-
- In particular, the use of non-US-ASCII text in mail
- messages without a MIME-Version field is strongly
- discouraged as it impedes interoperability when sending
- messages between regions with different localization
- conventions. Conforming user agents MUST include proper
- MIME labelling when sending anything other than plain
- text in the US-ASCII character set.
-
- In addition, non-MIME user agents should be upgraded if
- at all possible to include appropriate MIME header
- information in the messages they send even if nothing
- else in MIME is supported. This upgrade will have
- little, if any, effect on non-MIME recipients and will
- aid MIME in correctly displaying such messages. It
- also provides a smooth transition path to eventual
- adoption of other MIME capabilities.
-
- (9) Conforming user agents must ensure that any string of
- non-white-space printable US-ASCII characters within a
- "*text" or "*ctext" that begins with "=?" and ends with
-
-
-
-Freed & Borenstein Standards Track [Page 5]
-
-RFC 2049 MIME Conformance November 1996
-
-
- "?=" be a valid encoded-word. ("begins" means: At the
- start of the field-body or immediately following
- linear-white-space; "ends" means: At the end of the
- field-body or immediately preceding linear-white-
- space.) In addition, any "word" within a "phrase" that
- begins with "=?" and ends with "?=" must be a valid
- encoded-word.
-
- (10) Conforming user agents must be able to distinguish
- encoded-words from "text", "ctext", or "word"s,
- according to the rules in section 4, anytime they
- appear in appropriate places in message headers. It
- must support both the "B" and "Q" encodings for any
- character set which it supports. The program must be
- able to display the unencoded text if the character set
- is "US-ASCII". For the ISO-8859-* character sets, the
- mail reading program must at least be able to display
- the characters which are also in the US-ASCII set.
-
- A user agent that meets the above conditions is said to be MIME-
- conformant. The meaning of this phrase is that it is assumed to be
- "safe" to send virtually any kind of properly-marked data to users of
- such mail systems, because such systems will at least be able to
- treat the data as undifferentiated binary, and will not simply splash
- it onto the screen of unsuspecting users.
-
- There is another sense in which it is always "safe" to send data in a
- format that is MIME-conformant, which is that such data will not
- break or be broken by any known systems that are conformant with RFC
- 821 and RFC 822. User agents that are MIME-conformant have the
- additional guarantee that the user will not be shown data that were
- never intended to be viewed as text.
-
-3. Guidelines for Sending Email Data
-
- Internet email is not a perfect, homogeneous system. Mail may become
- corrupted at several stages in its travel to a final destination.
- Specifically, email sent throughout the Internet may travel across
- many networking technologies. Many networking and mail technologies
- do not support the full functionality possible in the SMTP transport
- environment. Mail traversing these systems is likely to be modified
- in order that it can be transported.
-
- There exist many widely-deployed non-conformant MTAs in the Internet.
- These MTAs, speaking the SMTP protocol, alter messages on the fly to
- take advantage of the internal data structure of the hosts they are
- implemented on, or are just plain broken.
-
-
-
-
-Freed & Borenstein Standards Track [Page 6]
-
-RFC 2049 MIME Conformance November 1996
-
-
- The following guidelines may be useful to anyone devising a data
- format (media type) that is supposed to survive the widest range of
- networking technologies and known broken MTAs unscathed. Note that
- anything encoded in the base64 encoding will satisfy these rules, but
- that some well-known mechanisms, notably the UNIX uuencode facility,
- will not. Note also that anything encoded in the Quoted-Printable
- encoding will survive most gateways intact, but possibly not some
- gateways to systems that use the EBCDIC character set.
-
- (1) Under some circumstances the encoding used for data may
- change as part of normal gateway or user agent
- operation. In particular, conversion from base64 to
- quoted-printable and vice versa may be necessary. This
- may result in the confusion of CRLF sequences with line
- breaks in text bodies. As such, the persistence of
- CRLF as something other than a line break must not be
- relied on.
-
- (2) Many systems may elect to represent and store text data
- using local newline conventions. Local newline
- conventions may not match the RFC822 CRLF convention --
- systems are known that use plain CR, plain LF, CRLF, or
- counted records. The result is that isolated CR and LF
- characters are not well tolerated in general; they may
- be lost or converted to delimiters on some systems, and
- hence must not be relied on.
-
- (3) The transmission of NULs (US-ASCII value 0) is
- problematic in Internet mail. (This is largely the
- result of NULs being used as a termination character by
- many of the standard runtime library routines in the C
- programming language.) The practice of using NULs as
- termination characters is so entrenched now that
- messages should not rely on them being preserved.
-
- (4) TAB (HT) characters may be misinterpreted or may be
- automatically converted to variable numbers of spaces.
- This is unavoidable in some environments, notably those
- not based on the US-ASCII character set. Such
- conversion is STRONGLY DISCOURAGED, but it may occur,
- and mail formats must not rely on the persistence of
- TAB (HT) characters.
-
- (5) Lines longer than 76 characters may be wrapped or
- truncated in some environments. Line wrapping or line
- truncation imposed by mail transports is STRONGLY
- DISCOURAGED, but unavoidable in some cases.
- Applications which require long lines must somehow
-
-
-
-Freed & Borenstein Standards Track [Page 7]
-
-RFC 2049 MIME Conformance November 1996
-
-
- differentiate between soft and hard line breaks. (A
- simple way to do this is to use the quoted-printable
- encoding.)
-
- (6) Trailing "white space" characters (SPACE, TAB (HT)) on
- a line may be discarded by some transport agents, while
- other transport agents may pad lines with these
- characters so that all lines in a mail file are of
- equal length. The persistence of trailing white space,
- therefore, must not be relied on.
-
- (7) Many mail domains use variations on the US-ASCII
- character set, or use character sets such as EBCDIC
- which contain most but not all of the US-ASCII
- characters. The correct translation of characters not
- in the "invariant" set cannot be depended on across
- character converting gateways. For example, this
- situation is a problem when sending uuencoded
- information across BITNET, an EBCDIC system. Similar
- problems can occur without crossing a gateway, since
- many Internet hosts use character sets other than US-
- ASCII internally. The definition of Printable Strings
- in X.400 adds further restrictions in certain special
- cases. In particular, the only characters that are
- known to be consistent across all gateways are the 73
- characters that correspond to the upper and lower case
- letters A-Z and a-z, the 10 digits 0-9, and the
- following eleven special characters:
-
- "'" (US-ASCII decimal value 39)
- "(" (US-ASCII decimal value 40)
- ")" (US-ASCII decimal value 41)
- "+" (US-ASCII decimal value 43)
- "," (US-ASCII decimal value 44)
- "-" (US-ASCII decimal value 45)
- "." (US-ASCII decimal value 46)
- "/" (US-ASCII decimal value 47)
- ":" (US-ASCII decimal value 58)
- "=" (US-ASCII decimal value 61)
- "?" (US-ASCII decimal value 63)
-
- A maximally portable mail representation will confine
- itself to relatively short lines of text in which the
- only meaningful characters are taken from this set of
- 73 characters. The base64 encoding follows this rule.
-
- (8) Some mail transport agents will corrupt data that
- includes certain literal strings. In particular, a
-
-
-
-Freed & Borenstein Standards Track [Page 8]
-
-RFC 2049 MIME Conformance November 1996
-
-
- period (".") alone on a line is known to be corrupted
- by some (incorrect) SMTP implementations, and a line
- that starts with the five characters "From " (the fifth
- character is a SPACE) are commonly corrupted as well.
- A careful composition agent can prevent these
- corruptions by encoding the data (e.g., in the quoted-
- printable encoding using "=46rom " in place of "From "
- at the start of a line, and "=2E" in place of "." alone
- on a line).
-
- Please note that the above list is NOT a list of recommended
- practices for MTAs. RFC 821 MTAs are prohibited from altering the
- character of white space or wrapping long lines. These BAD and
- invalid practices are known to occur on established networks, and
- implementations should be robust in dealing with the bad effects they
- can cause.
-
-4. Canonical Encoding Model
-
- There was some confusion, in earlier versions of these documents,
- regarding the model for when email data was to be converted to
- canonical form and encoded, and in particular how this process would
- affect the treatment of CRLFs, given that the representation of
- newlines varies greatly from system to system. For this reason, a
- canonical model for encoding is presented below.
-
- The process of composing a MIME entity can be modeled as being done
- in a number of steps. Note that these steps are roughly similar to
- those steps used in PEM [RFC-1421] and are performed for each
- "innermost level" body:
-
- (1) Creation of local form.
-
- The body to be transmitted is created in the system's
- native format. The native character set is used and,
- where appropriate, local end of line conventions are
- used as well. The body may be a UNIX-style text file,
- or a Sun raster image, or a VMS indexed file, or audio
- data in a system-dependent format stored only in
- memory, or anything else that corresponds to the local
- model for the representation of some form of
- information. Fundamentally, the data is created in the
- "native" form that corresponds to the type specified by
- the media type.
-
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 9]
-
-RFC 2049 MIME Conformance November 1996
-
-
- (2) Conversion to canonical form.
-
- The entire body, including "out-of-band" information
- such as record lengths and possibly file attribute
- information, is converted to a universal canonical
- form. The specific media type of the body as well as
- its associated attributes dictate the nature of the
- canonical form that is used. Conversion to the proper
- canonical form may involve character set conversion,
- transformation of audio data, compression, or various
- other operations specific to the various media types.
- If character set conversion is involved, however, care
- must be taken to understand the semantics of the media
- type, which may have strong implications for any
- character set conversion, e.g. with regard to
- syntactically meaningful characters in a text subtype
- other than "plain".
-
- For example, in the case of text/plain data, the text
- must be converted to a supported character set and
- lines must be delimited with CRLF delimiters in
- accordance with RFC 822. Note that the restriction on
- line lengths implied by RFC 822 is eliminated if the
- next step employs either quoted-printable or base64
- encoding.
-
- (3) Apply transfer encoding.
-
- A Content-Transfer-Encoding appropriate for this body
- is applied. Note that there is no fixed relationship
- between the media type and the transfer encoding. In
- particular, it may be appropriate to base the choice of
- base64 or quoted-printable on character frequency
- counts which are specific to a given instance of a
- body.
-
- (4) Insertion into entity.
-
- The encoded body is inserted into a MIME entity with
- appropriate headers. The entity is then inserted into
- the body of a higher-level entity (message or
- multipart) as needed.
-
- Conversion from entity form to local form is accomplished by
- reversing these steps. Note that reversal of these steps may produce
- differing results since there is no guarantee that the original and
- final local forms are the same.
-
-
-
-
-Freed & Borenstein Standards Track [Page 10]
-
-RFC 2049 MIME Conformance November 1996
-
-
- It is vital to note that these steps are only a model; they are
- specifically NOT a blueprint for how an actual system would be built.
- In particular, the model fails to account for two common designs:
-
- (1) In many cases the conversion to a canonical form prior
- to encoding will be subsumed into the encoder itself,
- which understands local formats directly. For example,
- the local newline convention for text bodies might be
- carried through to the encoder itself along with
- knowledge of what that format is.
-
- (2) The output of the encoders may have to pass through one
- or more additional steps prior to being transmitted as
- a message. As such, the output of the encoder may not
- be conformant with the formats specified by RFC 822.
- In particular, once again it may be appropriate for the
- converter's output to be expressed using local newline
- conventions rather than using the standard RFC 822 CRLF
- delimiters.
-
- Other implementation variations are conceivable as well. The vital
- aspect of this discussion is that, in spite of any optimizations,
- collapsings of required steps, or insertion of additional processing,
- the resulting messages must be consistent with those produced by the
- model described here. For example, a message with the following
- header fields:
-
- Content-type: text/foo; charset=bar
- Content-Transfer-Encoding: base64
-
- must be first represented in the text/foo form, then (if necessary)
- represented in the "bar" character set, and finally transformed via
- the base64 algorithm into a mail-safe form.
-
- NOTE: Some confusion has been caused by systems that represent
- messages in a format which uses local newline conventions which
- differ from the RFC822 CRLF convention. It is important to note that
- these formats are not canonical RFC822/MIME. These formats are
- instead *encodings* of RFC822, where CRLF sequences in the canonical
- representation of the message are encoded as the local newline
- convention. Note that formats which encode CRLF sequences as, for
- example, LF are not capable of representing MIME messages containing
- binary data which contains LF octets not part of CRLF line separation
- sequences.
-
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 11]
-
-RFC 2049 MIME Conformance November 1996
-
-
-5. Summary
-
- This document defines what is meant by MIME Conformance. It also
- details various problems known to exist in the Internet email system
- and how to use MIME to overcome them. Finally, it describes MIME's
- canonical encoding model.
-
-6. Security Considerations
-
- Security issues are discussed in the second document in this set, RFC
- 2046.
-
-7. Authors' Addresses
-
- For more information, the authors of this document are best contacted
- via Internet mail:
-
- Ned Freed
- Innosoft International, Inc.
- 1050 East Garvey Avenue South
- West Covina, CA 91790
- USA
-
- Phone: +1 818 919 3600
- Fax: +1 818 919 3614
- EMail: ned at innosoft.com
-
- Nathaniel S. Borenstein
- First Virtual Holdings
- 25 Washington Avenue
- Morristown, NJ 07960
- USA
-
- Phone: +1 201 540 8967
- Fax: +1 201 993 3032
- EMail: nsb at nsb.fv.com
-
- MIME is a result of the work of the Internet Engineering Task Force
- Working Group on RFC 822 Extensions. The chairman of that group,
- Greg Vaudreuil, may be reached at:
-
- Gregory M. Vaudreuil
- Octel Network Services
- 17080 Dallas Parkway
- Dallas, TX 75248-1905
- USA
-
- EMail: Greg.Vaudreuil at Octel.Com
-
-
-
-Freed & Borenstein Standards Track [Page 12]
-
-RFC 2049 MIME Conformance November 1996
-
-
-8. Acknowledgements
-
- This document is the result of the collective effort of a large
- number of people, at several IETF meetings, on the IETF-SMTP and
- IETF-822 mailing lists, and elsewhere. Although any enumeration
- seems doomed to suffer from egregious omissions, the following are
- among the many contributors to this effort:
-
- Harald Tveit Alvestrand Marc Andreessen
- Randall Atkinson Bob Braden
- Philippe Brandon Brian Capouch
- Kevin Carosso Uhhyung Choi
- Peter Clitherow Dave Collier-Brown
- Cristian Constantinof John Coonrod
- Mark Crispin Dave Crocker
- Stephen Crocker Terry Crowley
- Walt Daniels Jim Davis
- Frank Dawson Axel Deininger
- Hitoshi Doi Kevin Donnelly
- Steve Dorner Keith Edwards
- Chris Eich Dana S. Emery
- Johnny Eriksson Craig Everhart
- Patrik Faltstrom Erik E. Fair
- Roger Fajman Alain Fontaine
- Martin Forssen James M. Galvin
- Stephen Gildea Philip Gladstone
- Thomas Gordon Keld Simonsen
- Terry Gray Phill Gross
- James Hamilton David Herron
- Mark Horton Bruce Howard
- Bill Janssen Olle Jarnefors
- Risto Kankkunen Phil Karn
- Alan Katz Tim Kehres
- Neil Katin Steve Kille
- Kyuho Kim Anders Klemets
- John Klensin Valdis Kletniek
- Jim Knowles Stev Knowles
- Bob Kummerfeld Pekka Kytolaakso
- Stellan Lagerstrom Vincent Lau
- Timo Lehtinen Donald Lindsay
- Warner Losh Carlyn Lowery
- Laurence Lundblade Charles Lynn
- John R. MacMillan Larry Masinter
- Rick McGowan Michael J. McInerny
- Leo Mclaughlin Goli Montaser-Kohsari
- Tom Moore John Gardiner Myers
- Erik Naggum Mark Needleman
- Chris Newman John Noerenberg
-
-
-
-Freed & Borenstein Standards Track [Page 13]
-
-RFC 2049 MIME Conformance November 1996
-
-
- Mats Ohrman Julian Onions
- Michael Patton David J. Pepper
- Erik van der Poel Blake C. Ramsdell
- Christer Romson Luc Rooijakkers
- Marshall T. Rose Jonathan Rosenberg
- Guido van Rossum Jan Rynning
- Harri Salminen Michael Sanderson
- Yutaka Sato Markku Savela
- Richard Alan Schafer Masahiro Sekiguchi
- Mark Sherman Bob Smart
- Peter Speck Henry Spencer
- Einar Stefferud Michael Stein
- Klaus Steinberger Peter Svanberg
- James Thompson Steve Uhler
- Stuart Vance Peter Vanderbilt
- Greg Vaudreuil Ed Vielmetti
- Larry W. Virden Ryan Waldron
- Rhys Weatherly Jay Weber
- Dave Wecker Wally Wedel
- Sven-Ove Westberg Brian Wideen
- John Wobus Glenn Wright
- Rayan Zachariassen David Zimmerman
-
- The authors apologize for any omissions from this list, which are
- certainly unintentional.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 14]
-
-RFC 2049 MIME Conformance November 1996
-
-
-Appendix A -- A Complex Multipart Example
-
- What follows is the outline of a complex multipart message. This
- message contains five parts that are to be displayed serially: two
- introductory plain text objects, an embedded multipart message, a
- text/enriched object, and a closing encapsulated text message in a
- non-ASCII character set. The embedded multipart message itself
- contains two objects to be displayed in parallel, a picture and an
- audio fragment.
-
- MIME-Version: 1.0
- From: Nathaniel Borenstein <nsb at nsb.fv.com>
- To: Ned Freed <ned at innosoft.com>
- Date: Fri, 07 Oct 1994 16:15:05 -0700 (PDT)
- Subject: A multipart example
- Content-Type: multipart/mixed;
- boundary=unique-boundary-1
-
- This is the preamble area of a multipart message.
- Mail readers that understand multipart format
- should ignore this preamble.
-
- If you are reading this text, you might want to
- consider changing to a mail reader that understands
- how to properly display multipart messages.
-
- --unique-boundary-1
-
- ... Some text appears here ...
-
- [Note that the blank between the boundary and the start
- of the text in this part means no header fields were
- given and this is text in the US-ASCII character set.
- It could have been done with explicit typing as in the
- next part.]
-
- --unique-boundary-1
- Content-type: text/plain; charset=US-ASCII
-
- This could have been part of the previous part, but
- illustrates explicit versus implicit typing of body
- parts.
-
- --unique-boundary-1
- Content-Type: multipart/parallel; boundary=unique-boundary-2
-
- --unique-boundary-2
- Content-Type: audio/basic
-
-
-
-Freed & Borenstein Standards Track [Page 15]
-
-RFC 2049 MIME Conformance November 1996
-
-
- Content-Transfer-Encoding: base64
-
- ... base64-encoded 8000 Hz single-channel
- mu-law-format audio data goes here ...
-
- --unique-boundary-2
- Content-Type: image/jpeg
- Content-Transfer-Encoding: base64
-
- ... base64-encoded image data goes here ...
-
- --unique-boundary-2--
-
- --unique-boundary-1
- Content-type: text/enriched
-
- This is <bold><italic>enriched.</italic></bold>
- <smaller>as defined in RFC 1896</smaller>
-
- Isn't it
- <bigger><bigger>cool?</bigger></bigger>
-
- --unique-boundary-1
- Content-Type: message/rfc822
-
- From: (mailbox in US-ASCII)
- To: (address in US-ASCII)
- Subject: (subject in US-ASCII)
- Content-Type: Text/plain; charset=ISO-8859-1
- Content-Transfer-Encoding: Quoted-printable
-
- ... Additional text in ISO-8859-1 goes here ...
-
- --unique-boundary-1--
-
-Appendix B -- Changes from RFC 1521, 1522, and 1590
-
- These documents are a revision of RFC 1521, 1522, and 1590. For the
- convenience of those familiar with the earlier documents, the changes
- from those documents are summarized in this appendix. For further
- history, note that Appendix H in RFC 1521 specified how that document
- differed from its predecessor, RFC 1341.
-
- (1) This document has been completely reformatted and split
- into multiple documents. This was done to improve the
- quality of the plain text version of this document,
- which is required to be the reference copy.
-
-
-
-
-Freed & Borenstein Standards Track [Page 16]
-
-RFC 2049 MIME Conformance November 1996
-
-
- (2) BNF describing the overall structure of MIME object
- headers has been added. This is a documentation change
- only -- the underlying syntax has not changed in any
- way.
-
- (3) The specific BNF for the seven media types in MIME has
- been removed. This BNF was incorrect, incomplete, amd
- inconsistent with the type-indendependent BNF. And
- since the type-independent BNF already fully specifies
- the syntax of the various MIME headers, the type-
- specific BNF was, in the final analysis, completely
- unnecessary and caused more problems than it solved.
-
- (4) The more specific "US-ASCII" character set name has
- replaced the use of the informal term ASCII in many
- parts of these documents.
-
- (5) The informal concept of a primary subtype has been
- removed.
-
- (6) The term "object" was being used inconsistently. The
- definition of this term has been clarified, along with
- the related terms "body", "body part", and "entity",
- and usage has been corrected where appropriate.
-
- (7) The BNF for the multipart media type has been
- rearranged to make it clear that the CRLF preceeding
- the boundary marker is actually part of the marker
- itself rather than the preceeding body part.
-
- (8) The prose and BNF describing the multipart media type
- have been changed to make it clear that the body parts
- within a multipart object MUST NOT contain any lines
- beginning with the boundary parameter string.
-
- (9) In the rules on reassembling "message/partial" MIME
- entities, "Subject" is added to the list of headers to
- take from the inner message, and the example is
- modified to clarify this point.
-
- (10) "Message/partial" fragmenters are restricted to
- splitting MIME objects only at line boundaries.
-
- (11) In the discussion of the application/postscript type,
- an additional paragraph has been added warning about
- possible interoperability problems caused by embedding
- of binary data inside a PostScript MIME entity.
-
-
-
-
-Freed & Borenstein Standards Track [Page 17]
-
-RFC 2049 MIME Conformance November 1996
-
-
- (12) Added a clarifying note to the basic syntax rules for
- the Content-Type header field to make it clear that the
- following two forms:
-
- Content-type: text/plain; charset=us-ascii (comment)
-
- Content-type: text/plain; charset="us-ascii"
-
- are completely equivalent.
-
- (13) The following sentence has been removed from the
- discussion of the MIME-Version header: "However,
- conformant software is encouraged to check the version
- number and at least warn the user if an unrecognized
- MIME-version is encountered."
-
- (14) A typo was fixed that said "application/external-body"
- instead of "message/external-body".
-
- (15) The definition of a character set has been reorganized
- to make the requirements clearer.
-
- (16) The definition of the "image/gif" media type has been
- moved to a separate document. This change was made
- because of potential conflicts with IETF rules
- governing the standardization of patented technology.
-
- (17) The definitions of "7bit" and "8bit" have been
- tightened so that use of bare CR, LF can only be used
- as end-of-line sequences. The document also no longer
- requires that NUL characters be preserved, which brings
- MIME into alignment with real-world implementations.
-
- (18) The definition of canonical text in MIME has been
- tightened so that line breaks must be represented by a
- CRLF sequence. CR and LF characters are not allowed
- outside of this usage. The definition of quoted-
- printable encoding has been altered accordingly.
-
- (19) The definition of the quoted-printable encoding now
- includes a number of suggestions for how quoted-
- printable encoders might best handle improperly encoded
- material.
-
- (20) Prose was added to clarify the use of the "7bit",
- "8bit", and "binary" transfer-encodings on multipart or
- message entities encapsulating "8bit" or "binary" data.
-
-
-
-
-Freed & Borenstein Standards Track [Page 18]
-
-RFC 2049 MIME Conformance November 1996
-
-
- (21) In the section on MIME Conformance, "multipart/digest"
- support was added to the list of requirements for
- minimal MIME conformance. Also, the requirement for
- "message/rfc822" support were strengthened to clarify
- the importance of recognizing recursive structure.
-
- (22) The various restrictions on subtypes of "message" are
- now specified entirely on a subtype by subtype basis.
-
- (23) The definition of "message/rfc822" was changed to
- indicate that at least one of the "From", "Subject", or
- "Date" headers must be present.
-
- (24) The required handling of unrecognized subtypes as
- "application/octet-stream" has been made more explicit
- in both the type definitions sections and the
- conformance guidelines.
-
- (25) Examples using text/richtext were changed to
- text/enriched.
-
- (26) The BNF definition of subtype has been changed to make
- it clear that either an IANA registered subtype or a
- nonstandard "X-" subtype must be used in a Content-Type
- header field.
-
- (27) MIME media types that are simply registered for use and
- those that are standardized by the IETF are now
- distinguished in the MIME BNF.
-
- (28) All of the various MIME registration procedures have
- been extensively revised. IANA registration procedures
- for character sets have been moved to a separate
- document that is no included in this set of documents.
-
- (29) The use of escape and shift mechanisms in the US-ASCII
- and ISO-8859-X character sets these documents define
- have been clarified: Such mechanisms should never be
- used in conjunction with these character sets and their
- effect if they are used is undefined.
-
- (30) The definition of the AFS access-type for
- message/external-body has been removed.
-
- (31) The handling of the combination of
- multipart/alternative and message/external-body is now
- specifically addressed.
-
-
-
-
-Freed & Borenstein Standards Track [Page 19]
-
-RFC 2049 MIME Conformance November 1996
-
-
- (32) Security issues specific to message/external-body are
- now discussed in some detail.
-
-Appendix C -- References
-
- [ATK]
- Borenstein, Nathaniel S., Multimedia Applications
- Development with the Andrew Toolkit, Prentice-Hall, 1990.
-
- [ISO-2022]
- International Standard -- Information Processing --
- Character Code Structure and Extension Techniques,
- ISO/IEC 2022:1994, 4th ed.
-
- [ISO-8859]
- International Standard -- Information Processing -- 8-bit
- Single-Byte Coded Graphic Character Sets
- - Part 1: Latin Alphabet No. 1, ISO 8859-1:1987, 1st ed.
- - Part 2: Latin Alphabet No. 2, ISO 8859-2:1987, 1st ed.
- - Part 3: Latin Alphabet No. 3, ISO 8859-3:1988, 1st ed.
- - Part 4: Latin Alphabet No. 4, ISO 8859-4:1988, 1st ed.
- - Part 5: Latin/Cyrillic Alphabet, ISO 8859-5:1988, 1st
- ed.
- - Part 6: Latin/Arabic Alphabet, ISO 8859-6:1987, 1st ed.
- - Part 7: Latin/Greek Alphabet, ISO 8859-7:1987, 1st ed.
- - Part 8: Latin/Hebrew Alphabet, ISO 8859-8:1988, 1st ed.
- - Part 9: Latin Alphabet No. 5, ISO/IEC 8859-9:1989, 1st
- ed.
- International Standard -- Information Technology -- 8-bit
- Single-Byte Coded Graphic Character Sets
- - Part 10: Latin Alphabet No. 6, ISO/IEC 8859-10:1992,
- 1st ed.
-
- [ISO-646]
- International Standard -- Information Technology -- ISO
- 7-bit Coded Character Set for Information Interchange,
- ISO 646:1991, 3rd ed..
-
- [JPEG]
- JPEG Draft Standard ISO 10918-1 CD.
-
- [MPEG]
- Video Coding Draft Standard ISO 11172 CD, ISO
- IEC/JTC1/SC2/WG11 (Motion Picture Experts Group), May,
- 1991.
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 20]
-
-RFC 2049 MIME Conformance November 1996
-
-
- [PCM]
- CCITT, Fascicle III.4 - Recommendation G.711, "Pulse Code
- Modulation (PCM) of Voice Frequencies", Geneva, 1972.
-
- [POSTSCRIPT]
- Adobe Systems, Inc., PostScript Language Reference
- Manual, Addison-Wesley, 1985.
-
- [POSTSCRIPT2]
- Adobe Systems, Inc., PostScript Language Reference
- Manual, Addison-Wesley, Second Ed., 1990.
-
- [RFC-783]
- Sollins, K.R., "TFTP Protocol (revision 2)", RFC-783,
- MIT, June 1981.
-
- [RFC-821]
- Postel, J.B., "Simple Mail Transfer Protocol", STD 10,
- RFC 821, USC/Information Sciences Institute, August 1982.
-
- [RFC-822]
- Crocker, D., "Standard for the Format of ARPA Internet
- Text Messages", STD 11, RFC 822, UDEL, August 1982.
-
- [RFC-934]
- Rose, M. and E. Stefferud, "Proposed Standard for Message
- Encapsulation", RFC 934, Delaware and NMA, January 1985.
-
- [RFC-959]
- Postel, J. and J. Reynolds, "File Transfer Protocol", STD
- 9, RFC 959, USC/Information Sciences Institute, October
- 1985.
-
- [RFC-1049]
- Sirbu, M., "Content-Type Header Field for Internet
- Messages", RFC 1049, CMU, March 1988.
-
- [RFC-1154]
- Robinson, D., and R. Ullmann, "Encoding Header Field for
- Internet Messages", RFC 1154, Prime Computer, Inc., April
- 1990.
-
- [RFC-1341]
- Borenstein, N., and N. Freed, "MIME (Multipurpose
- Internet Mail Extensions): Mechanisms for Specifying and
- Describing the Format of Internet Message Bodies", RFC
- 1341, Bellcore, Innosoft, June 1992.
-
-
-
-
-Freed & Borenstein Standards Track [Page 21]
-
-RFC 2049 MIME Conformance November 1996
-
-
- [RFC-1342]
- Moore, K., "Representation of Non-Ascii Text in Internet
- Message Headers", RFC 1342, University of Tennessee, June
- 1992.
-
- [RFC-1344]
- Borenstein, N., "Implications of MIME for Internet Mail
- Gateways", RFC 1344, Bellcore, June 1992.
-
- [RFC-1345]
- Simonsen, K., "Character Mnemonics & Character Sets", RFC
- 1345, Rationel Almen Planlaegning, June 1992.
-
- [RFC-1421]
- Linn, J., "Privacy Enhancement for Internet Electronic
- Mail: Part I -- Message Encryption and Authentication
- Procedures", RFC 1421, IAB IRTF PSRG, IETF PEM WG,
- February 1993.
-
- [RFC-1422]
- Kent, S., "Privacy Enhancement for Internet Electronic
- Mail: Part II -- Certificate-Based Key Management", RFC
- 1422, IAB IRTF PSRG, IETF PEM WG, February 1993.
-
- [RFC-1423]
- Balenson, D., "Privacy Enhancement for Internet
- Electronic Mail: Part III -- Algorithms, Modes, and
- Identifiers", IAB IRTF PSRG, IETF PEM WG, February 1993.
-
- [RFC-1424]
- Kaliski, B., "Privacy Enhancement for Internet Electronic
- Mail: Part IV -- Key Certification and Related
- Services", IAB IRTF PSRG, IETF PEM WG, February 1993.
-
- [RFC-1521]
- Borenstein, N., and Freed, N., "MIME (Multipurpose
- Internet Mail Extensions): Mechanisms for Specifying and
- Describing the Format of Internet Message Bodies", RFC
- 1521, Bellcore, Innosoft, September, 1993.
-
- [RFC-1522]
- Moore, K., "Representation of Non-ASCII Text in Internet
- Message Headers", RFC 1522, University of Tennessee,
- September 1993.
-
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 22]
-
-RFC 2049 MIME Conformance November 1996
-
-
- [RFC-1524]
- Borenstein, N., "A User Agent Configuration Mechanism for
- Multimedia Mail Format Information", RFC 1524, Bellcore,
- September 1993.
-
- [RFC-1543]
- Postel, J., "Instructions to RFC Authors", RFC 1543,
- USC/Information Sciences Institute, October 1993.
-
- [RFC-1556]
- Nussbacher, H., "Handling of Bi-directional Texts in
- MIME", RFC 1556, Israeli Inter-University Computer
- Center, December 1993.
-
- [RFC-1590]
- Postel, J., "Media Type Registration Procedure", RFC
- 1590, USC/Information Sciences Institute, March 1994.
-
- [RFC-1602]
- Internet Architecture Board, Internet Engineering
- Steering Group, Huitema, C., Gross, P., "The Internet
- Standards Process -- Revision 2", March 1994.
-
- [RFC-1652]
- Klensin, J., (WG Chair), Freed, N., (Editor), Rose, M.,
- Stefferud, E., and Crocker, D., "SMTP Service Extension
- for 8bit-MIME transport", RFC 1652, United Nations
- University, Innosoft, Dover Beach Consulting, Inc.,
- Network Management Associates, Inc., The Branch Office,
- March 1994.
-
- [RFC-1700]
- Reynolds, J. and J. Postel, "Assigned Numbers", STD 2,
- RFC 1700, USC/Information Sciences Institute, October
- 1994.
-
- [RFC-1741]
- Faltstrom, P., Crocker, D., and Fair, E., "MIME Content
- Type for BinHex Encoded Files", December 1994.
-
- [RFC-1896]
- Resnick, P., and A. Walker, "The text/enriched MIME
- Content-type", RFC 1896, February, 1996.
-
-
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 23]
-
-RFC 2049 MIME Conformance November 1996
-
-
- [RFC-2045]
- Freed, N., and and N. Borenstein, "Multipurpose Internet Mail
- Extensions (MIME) Part One: Format of Internet Message
- Bodies", RFC 2045, Innosoft, First Virtual Holdings,
- November 1996.
-
- [RFC-2046]
- Freed, N., and N. Borenstein, "Multipurpose Internet Mail
- Extensions (MIME) Part Two: Media Types", RFC 2046,
- Innosoft, First Virtual Holdings, November 1996.
-
- [RFC-2047]
- Moore, K., "Multipurpose Internet Mail Extensions (MIME)
- Part Three: Representation of Non-ASCII Text in Internet
- Message Headers", RFC 2047, University of
- Tennessee, November 1996.
-
- [RFC-2048]
- Freed, N., Klensin, J., and J. Postel, "Multipurpose
- Internet Mail Extensions (MIME) Part Four: MIME
- Registration Procedures", RFC 2048, Innosoft, MCI,
- ISI, November 1996.
-
- [RFC-2049]
- Freed, N. and N. Borenstein, "Multipurpose Internet Mail
- Extensions (MIME) Part Five: Conformance Criteria and
- Examples", RFC 2049 (this document), Innosoft, First
- Virtual Holdings, November 1996.
-
- [US-ASCII]
- Coded Character Set -- 7-Bit American Standard Code for
- Information Interchange, ANSI X3.4-1986.
-
- [X400]
- Schicker, Pietro, "Message Handling Systems, X.400",
- Message Handling Systems and Distributed Applications, E.
- Stefferud, O-j. Jacobsen, and P. Schicker, eds., North-
- Holland, 1989, pp. 3-41.
-
-
-
-
-
-
-
-
-
-
-
-
-
-Freed & Borenstein Standards Track [Page 24]
-
\ No newline at end of file
diff --git a/reference/rfc2111 Content-ID and Message-ID URLs.txt b/reference/rfc2111 Content-ID and Message-ID URLs.txt
deleted file mode 100644
index 3ccd234..0000000
--- a/reference/rfc2111 Content-ID and Message-ID URLs.txt
+++ /dev/null
@@ -1,283 +0,0 @@
-
-
-
-
-
-
-Network Working Group E. Levinson
-Request for Comments: 2111 XIson, Inc.
-Category: Standards Track March 1997
-
-
- Content-ID and Message-ID Uniform Resource Locators
-
-Status of this Memo
-
- This document specifies an Internet standards track protocol for the
- Internet community, and requests discussion and suggestions for
- improvements. Please refer to the current edition of the "Internet
- Official Protocol Standards" (STD 1) for the standardization state
- and status of this protocol. Distribution of this memo is unlimited.
-
-Abstract
-
- The Uniform Resource Locator (URL) schemes, "cid:" and "mid:" allow
- references to messages and the body parts of messages. For example,
- within a single multipart message, one HTML body part might include
- embedded references to other parts of the same message.
-
-1. Introduction
-
- The use of [MIME] within email to convey Web pages and their
- associated images requires a URL scheme to permit the HTML to refer
- to the images or other data included in the message. The Content-ID
- Uniform Resource Locator, "cid:", serves that purpose.
-
- Similarly Net News readers use Message-IDs to link related messages
- together. The Message-ID URL provides a scheme, "mid:", to refer to
- such messages as a "resource".
-
- The "mid" (Message-ID) and "cid" (Content-ID) URL schemes provide
- identifiers for messages and their body parts. The "mid" scheme uses
- (a part of) the message-id of an email message to refer to a specific
- message. The "cid" scheme refers to a specific body part of a
- message; its use is generally limited to references to other body
- parts in the same message as the referring body part. The "mid"
- scheme may also refer to a specific body part within a designated
- message, by including the content-ID's address.
-
- A note on terminology. The terms "body part" and "MIME entity" are
- used interchangeably. They refer to the headers and body of a MIME
- message, either the message itself or one of the body parts contained
- in a Multipart message.
-
-
-
-
-
-Levinson Standards Track [Page 1]
-
-RFC 2111 CID and MID URLs March 1997
-
-
-2. The MID and CID URL Schemes
-
- RFC1738 [URL] reserves the "mid" and "cid" schemes for Message-ID and
- Content-ID respectively. This memorandum defines the syntax for
- those URLs. Because they use the same syntactic elements they are
- presented together.
-
- The URLs take the form
-
- content-id = url-addr-spec
-
- message-id = url-addr-spec
-
- url-addr-spec = addr-spec ; URL encoding of RFC 822 addr-spec
-
- cid-url = "cid" ":" content-id
-
- mid-url = "mid" ":" message-id [ "/" content-id ]
-
- Note: in Internet mail messages, the addr-spec in a Content-ID
- [MIME] or Message-ID [822] header are enclosed in angle brackets
- (<>). Since addr-spec in a Message-ID or Content-ID might contain
- characters not allowed within a URL; any such character (including
- "/", which is reserved within the "mid" scheme) must be hex-
- encoded using the %hh escape mechanism in [URL].
-
- A "mid" URL with only a "message-id" refers to an entire message.
- With the appended "content-id", it refers to a body part within a
- message, as does a "cid" URL. The Content-ID of a MIME body part is
- required to be globally unique. However, in many systems that store
- messages, body parts are not indexed independently their context
- (message). The "mid" URL long form was designed to supply the
- context needed to support interoperability with such systems.
-
- A implementation conforming to this specification is required to
- support the "mid" URL long form (message-id/content-id). Conforming
- implementations can choose to, but are not required to, take
- advantage of the content-id's uniqueness and interpret a "cid" URL to
- refer to any body part within the message store.
-
- In limited circumstances (e.g., within multipart/alternate), a single
- message may contain several body parts that have the same Content-ID.
- That occurs, for example, when identical data can be accessed through
- different methods [MIME, sect. 7.2.3]. In those cases, conforming
- implementations are required to use the rules of the containing MIME
- entity (e.g., multi-part/alternate) to select the body part to which
- the Content-ID refers.
-
-
-
-
-Levinson Standards Track [Page 2]
-
-RFC 2111 CID and MID URLs March 1997
-
-
- A "cid" URL is converted to the corresponding Content-ID message
- header [MIME] by removing the "cid:" prefix, converting %hh hex-
- escaped characters to their ASCII equivalents and enclosing the
- remaining parts with an angle bracket pair, "<" and ">". For
- example, "mid:foo4%25foo1 at bar.net" corresponds to
-
- Message-ID: <foo4%foo1 at bar.net>
-
- A "mid" URL is converted to a Message-ID or Message-ID/Content-ID
- pair in a similar fashion.
-
- Both message-id and content-id are required to be globally unique.
- That is, no two different messages will ever have the same Message-ID
- addr-spec; no different body parts will ever have the same Content-ID
- addr-spec. A common technique used by many message systems is to use
- a time and date stamp along with the local host's domain name, e.g.,
- 950124.162336 at XIson.com.
-
-Some Examples
-
- The following message contains an HTML body part that refers to an
- image contained in another body part. Both body parts are contained
- in a Multipart/Related MIME entity. The HTML IMG tag contains a
- cidurl which points to the image.
-
- From: foo1 at bar.net
- To: foo2 at bar.net
- Subject: A simple example
- Mime-Version: 1.0
- Content-Type: multipart/related; boundary="boundary-example-1";
- type=Text/HTML
-
- --boundary-example 1
- Content-Type: Text/HTML; charset=US-ASCII
-
- ... text of the HTML document, which might contain a hyperlink
- to the other body part, for example through a statement such as:
- <IMG SRC="cid:foo4*foo1 at bar.net" ALT="IETF logo">
-
- --boundary-example-1
- Content-ID: foo4*foo1 at bar.net
- Content-Type: IMAGE/GIF
- Content-Transfer-Encoding: BASE64
-
-
-
-
-
-
-
-
-Levinson Standards Track [Page 3]
-
-RFC 2111 CID and MID URLs March 1997
-
-
- R0lGODlhGAGgAPEAAP/////ZRaCgoAAAACH+PUNvcHlyaWdodCAoQykgMTk5
- NSBJRVRGLiBVbmF1dGhvcml6ZWQgZHVwbGljYXRpb24gcHJvaGliaXRlZC4A
- etc...
-
- --boundary-example-1--
-
- The following message points to another message (hopefully still in
- the recipient's message store).
-
- From: bar at none.com
- To: phooey at all.com
- Subject: Here's how to do it
- Content-type: text/html; charset=usascii
-
- ... The items in my
- <A HREF= "mid:960830.1639 at XIson.com/partA.960830.1639 at XIson.com">
- previous message</A>, shows how the approach you propose can be
- used to accomplish ...
-
-3. Security Considerations
-
- The URLs defined here provide an addressing or referencing mechanism.
- The values of these URLs disclose no more about the originators
- environment than the corresponding Message-ID and Content-ID values.
- Where concern exists about such disclosures the originator of a
- message using mid and cid URLs must take precautions to insure that
- confidential information is not disclosed. Those precautions should
- already be in place to handle existing mail use of the Message-ID and
- Content-ID.
-
-4. References
-
-[822] Crocker, D., "Standard for the Format of ARPA Internet Text
- Messages," August 1982, University of Delaware, STD 11, RFC
- 822.
-
-[MIME] N. Borenstein, N. Freed, "MIME (Multipurpose Internet Mail
- Extensions) Part One: Mechanisms for Specifying and
- Describing the Format of Internet Message Bodies,"
- September 1993, RFC 1521.
-
-[URL] Berners-Lee, T., Masinter, L., and McCahill, M., "Uniform
- Resource Locators (URL)," December 1994.
-
-[MULREL] E. Levinson, "The MIME Multipart/Related Content-type,"
- December 1995, RFC 1874.
-
-
-
-
-
-Levinson Standards Track [Page 4]
-
-RFC 2111 CID and MID URLs March 1997
-
-
-5. Acknowledgments
-
- The original concept of "mid" and "cid" URLs were part of the Tim
- Berners-Lee's original vision of the World Wide Web. The ideas and
- design have benefited greatly by discussions with Harald Alvestrand,
- Dan Connolly, Roy Fielding, Larry Masinter, Jacob Palme, and others
- in the MHTML working group.
-
-6. Author's Address
-
- Edward Levinson
- 47 Clive Street
- Metuchen, NJ 08840-1060
- USA
- +1 908 549 3716
- <XIson at cnj.digex.net>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Levinson Standards Track [Page 5]
-
diff --git a/reference/rfc2183 Content-Disposition Header Field.txt b/reference/rfc2183 Content-Disposition Header Field.txt
deleted file mode 100644
index f16f127..0000000
--- a/reference/rfc2183 Content-Disposition Header Field.txt
+++ /dev/null
@@ -1,675 +0,0 @@
-
-
-
-
-
-
-Network Working Group R. Troost
-Request for Comments: 2183 New Century Systems
-Updates: 1806 S. Dorner
-Category: Standards Track QUALCOMM Incorporated
- K. Moore, Editor
- University of Tennessee
- August 1997
-
-
- Communicating Presentation Information in
- Internet Messages:
- The Content-Disposition Header Field
-
-Status of this Memo
-
- This document specifies an Internet standards track protocol for the
- Internet community, and requests discussion and suggestions for
- improvements. Please refer to the current edition of the "Internet
- Official Protocol Standards" (STD 1) for the standardization state
- and status of this protocol. Distribution of this memo is unlimited.
-
-Abstract
-
- This memo provides a mechanism whereby messages conforming to the
- MIME specifications [RFC 2045, RFC 2046, RFC 2047, RFC 2048, RFC
- 2049] can convey presentational information. It specifies the
- "Content-Disposition" header field, which is optional and valid for
- any MIME entity ("message" or "body part"). Two values for this
- header field are described in this memo; one for the ordinary linear
- presentation of the body part, and another to facilitate the use of
- mail to transfer files. It is expected that more values will be
- defined in the future, and procedures are defined for extending this
- set of values.
-
- This document is intended as an extension to MIME. As such, the
- reader is assumed to be familiar with the MIME specifications, and
- [RFC 822]. The information presented herein supplements but does not
- replace that found in those documents.
-
- This document is a revision to the Experimental protocol defined in
- RFC 1806. As compared to RFC 1806, this document contains minor
- editorial updates, adds new parameters needed to support the File
- Transfer Body Part, and references a separate specification for the
- handling of non-ASCII and/or very long parameter values.
-
-
-
-
-
-
-
-Troost, et. al. Standards Track [Page 1]
-
-RFC 2183 Content-Disposition August 1997
-
-
-1. Introduction
-
- MIME specifies a standard format for encapsulating multiple pieces of
- data into a single Internet message. That document does not address
- the issue of presentation styles; it provides a framework for the
- interchange of message content, but leaves presentation issues solely
- in the hands of mail user agent (MUA) implementors.
-
- Two common ways of presenting multipart electronic messages are as a
- main document with a list of separate attachments, and as a single
- document with the various parts expanded (displayed) inline. The
- display of an attachment is generally construed to require positive
- action on the part of the recipient, while inline message components
- are displayed automatically when the message is viewed. A mechanism
- is needed to allow the sender to transmit this sort of presentational
- information to the recipient; the Content-Disposition header provides
- this mechanism, allowing each component of a message to be tagged
- with an indication of its desired presentation semantics.
-
- Tagging messages in this manner will often be sufficient for basic
- message formatting. However, in many cases a more powerful and
- flexible approach will be necessary. The definition of such
- approaches is beyond the scope of this memo; however, such approaches
- can benefit from additional Content-Disposition values and
- parameters, to be defined at a later date.
-
- In addition to allowing the sender to specify the presentational
- disposition of a message component, it is desirable to allow her to
- indicate a default archival disposition; a filename. The optional
- "filename" parameter provides for this. Further, the creation-date,
- modification-date, and read-date parameters allow preservation of
- those file attributes when the file is transmitted over MIME email.
-
- NB: The keywords MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD,
- SHOULD NOT, RECOMMENDED, MAY, and OPTIONAL, when they appear in this
- document, are to be interpreted as described in [RFC 2119].
-
-2. The Content-Disposition Header Field
-
- Content-Disposition is an optional header field. In its absence, the
- MUA may use whatever presentation method it deems suitable.
-
- It is desirable to keep the set of possible disposition types small
- and well defined, to avoid needless complexity. Even so, evolving
- usage will likely require the definition of additional disposition
- types or parameters, so the set of disposition values is extensible;
- see below.
-
-
-
-
-Troost, et. al. Standards Track [Page 2]
-
-RFC 2183 Content-Disposition August 1997
-
-
- In the extended BNF notation of [RFC 822], the Content-Disposition
- header field is defined as follows:
-
- disposition := "Content-Disposition" ":"
- disposition-type
- *(";" disposition-parm)
-
- disposition-type := "inline"
- / "attachment"
- / extension-token
- ; values are not case-sensitive
-
- disposition-parm := filename-parm
- / creation-date-parm
- / modification-date-parm
- / read-date-parm
- / size-parm
- / parameter
-
- filename-parm := "filename" "=" value
-
- creation-date-parm := "creation-date" "=" quoted-date-time
-
- modification-date-parm := "modification-date" "=" quoted-date-time
-
- read-date-parm := "read-date" "=" quoted-date-time
-
- size-parm := "size" "=" 1*DIGIT
-
- quoted-date-time := quoted-string
- ; contents MUST be an RFC 822 `date-time'
- ; numeric timezones (+HHMM or -HHMM) MUST be used
-
-
-
- NOTE ON PARAMETER VALUE LENGHTS: A short (length <= 78 characters)
- parameter value containing only non-`tspecials' characters SHOULD be
- represented as a single `token'. A short parameter value containing
- only ASCII characters, but including `tspecials' characters, SHOULD
- be represented as `quoted-string'. Parameter values longer than 78
- characters, or which contain non-ASCII characters, MUST be encoded as
- specified in [RFC 2184].
-
- `Extension-token', `parameter', `tspecials' and `value' are defined
- according to [RFC 2045] (which references [RFC 822] in the definition
- of some of these tokens). `quoted-string' and `DIGIT' are defined in
- [RFC 822].
-
-
-
-
-Troost, et. al. Standards Track [Page 3]
-
-RFC 2183 Content-Disposition August 1997
-
-
-2.1 The Inline Disposition Type
-
- A bodypart should be marked `inline' if it is intended to be
- displayed automatically upon display of the message. Inline
- bodyparts should be presented in the order in which they occur,
- subject to the normal semantics of multipart messages.
-
-2.2 The Attachment Disposition Type
-
- Bodyparts can be designated `attachment' to indicate that they are
- separate from the main body of the mail message, and that their
- display should not be automatic, but contingent upon some further
- action of the user. The MUA might instead present the user of a
- bitmap terminal with an iconic representation of the attachments, or,
- on character terminals, with a list of attachments from which the
- user could select for viewing or storage.
-
-2.3 The Filename Parameter
-
- The sender may want to suggest a filename to be used if the entity is
- detached and stored in a separate file. If the receiving MUA writes
- the entity to a file, the suggested filename should be used as a
- basis for the actual filename, where possible.
-
- It is important that the receiving MUA not blindly use the suggested
- filename. The suggested filename SHOULD be checked (and possibly
- changed) to see that it conforms to local filesystem conventions,
- does not overwrite an existing file, and does not present a security
- problem (see Security Considerations below).
-
- The receiving MUA SHOULD NOT respect any directory path information
- that may seem to be present in the filename parameter. The filename
- should be treated as a terminal component only. Portable
- specification of directory paths might possibly be done in the future
- via a separate Content-Disposition parameter, but no provision is
- made for it in this draft.
-
- Current [RFC 2045] grammar restricts parameter values (and hence
- Content-Disposition filenames) to US-ASCII. We recognize the great
- desirability of allowing arbitrary character sets in filenames, but
- it is beyond the scope of this document to define the necessary
- mechanisms. We expect that the basic [RFC 1521] `value'
- specification will someday be amended to allow use of non-US-ASCII
- characters, at which time the same mechanism should be used in the
- Content-Disposition filename parameter.
-
-
-
-
-
-
-Troost, et. al. Standards Track [Page 4]
-
-RFC 2183 Content-Disposition August 1997
-
-
- Beyond the limitation to US-ASCII, the sending MUA may wish to bear
- in mind the limitations of common filesystems. Many have severe
- length and character set restrictions. Short alphanumeric filenames
- are least likely to require modification by the receiving system.
-
- The presence of the filename parameter does not force an
- implementation to write the entity to a separate file. It is
- perfectly acceptable for implementations to leave the entity as part
- of the normal mail stream unless the user requests otherwise. As a
- consequence, the parameter may be used on any MIME entity, even
- `inline' ones. These will not normally be written to files, but the
- parameter could be used to provide a filename if the receiving user
- should choose to write the part to a file.
-
-2.4 The Creation-Date parameter
-
- The creation-date parameter MAY be used to indicate the date at which
- the file was created. If this parameter is included, the paramter
- value MUST be a quoted-string which contains a representation of the
- creation date of the file in [RFC 822] `date-time' format.
-
- UNIX and POSIX implementors are cautioned that the `st_ctime' file
- attribute of the `stat' structure is not the creation time of the
- file; it is thus not appropriate as a source for the creation-date
- parameter value.
-
-2.5 The Modification-Date parameter
-
- The modification-date parameter MAY be used to indicate the date at
- which the file was last modified. If the modification-date parameter
- is included, the paramter value MUST be a quoted-string which
- contains a representation of the last modification date of the file
- in [RFC 822] `date-time' format.
-
-2.6 The Read-Date parameter
-
- The read-date parameter MAY be used to indicate the date at which the
- file was last read. If the read-date parameter is included, the
- parameter value MUST be a quoted-string which contains a
- representation of the last-read date of the file in [RFC 822] `date-
- time' format.
-
-2.7 The Size parameter
-
- The size parameter indicates an approximate size of the file in
- octets. It can be used, for example, to pre-allocate space before
- attempting to store the file, or to determine whether enough space
- exists.
-
-
-
-Troost, et. al. Standards Track [Page 5]
-
-RFC 2183 Content-Disposition August 1997
-
-
-2.8 Future Extensions and Unrecognized Disposition Types
-
- In the likely event that new parameters or disposition types are
- needed, they should be registered with the Internet Assigned Numbers
- Authority (IANA), in the manner specified in Section 9 of this memo.
-
- Once new disposition types and parameters are defined, there is of
- course the likelihood that implementations will see disposition types
- and parameters they do not understand. Furthermore, since x-tokens
- are allowed, implementations may also see entirely unregistered
- disposition types and parameters.
-
- Unrecognized parameters should be ignored. Unrecognized disposition
- types should be treated as `attachment'. The choice of `attachment'
- for unrecognized types is made because a sender who goes to the
- trouble of producing a Content-Disposition header with a new
- disposition type is more likely aiming for something more elaborate
- than inline presentation.
-
- Unless noted otherwise in the definition of a parameter, Content-
- Disposition parameters are valid for all dispositions. (In contrast
- to MIME content-type parameters, which are defined on a per-content-
- type basis.) Thus, for example, the `filename' parameter still means
- the name of the file to which the part should be written, even if the
- disposition itself is unrecognized.
-
-2.9 Content-Disposition and Multipart
-
- If a Content-Disposition header is used on a multipart body part, it
- applies to the multipart as a whole, not the individual subparts.
- The disposition types of the subparts do not need to be consulted
- until the multipart itself is presented. When the multipart is
- displayed, then the dispositions of the subparts should be respected.
-
- If the `inline' disposition is used, the multipart should be
- displayed as normal; however, an `attachment' subpart should require
- action from the user to display.
-
- If the `attachment' disposition is used, presentation of the
- multipart should not proceed without explicit user action. Once the
- user has chosen to display the multipart, the individual subpart
- dispositions should be consulted to determine how to present the
- subparts.
-
-
-
-
-
-
-
-
-Troost, et. al. Standards Track [Page 6]
-
-RFC 2183 Content-Disposition August 1997
-
-
-2.10 Content-Disposition and the Main Message
-
- It is permissible to use Content-Disposition on the main body of an
- [RFC 822] message.
-
-3. Examples
-
- Here is a an example of a body part containing a JPEG image that is
- intended to be viewed by the user immediately:
-
- Content-Type: image/jpeg
- Content-Disposition: inline
- Content-Description: just a small picture of me
-
- <jpeg data>
-
- The following body part contains a JPEG image that should be
- displayed to the user only if the user requests it. If the JPEG is
- written to a file, the file should be named "genome.jpg". The
- recipient's user might also choose to set the last-modified date of
- the stored file to date in the modification-date parameter:
-
- Content-Type: image/jpeg
- Content-Disposition: attachment; filename=genome.jpeg;
- modification-date="Wed, 12 Feb 1997 16:29:51 -0500";
- Content-Description: a complete map of the human genome
-
- <jpeg data>
-
- The following is an example of the use of the `attachment'
- disposition with a multipart body part. The user should see text-
- part-1 immediately, then take some action to view multipart-2. After
- taking action to view multipart-2, the user will see text-part-2
- right away, and be required to take action to view jpeg-1. Subparts
- are indented for clarity; they would not be so indented in a real
- message.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Troost, et. al. Standards Track [Page 7]
-
-RFC 2183 Content-Disposition August 1997
-
-
- Content-Type: multipart/mixed; boundary=outer
- Content-Description: multipart-1
-
- --outer
- Content-Type: text/plain
- Content-Disposition: inline
- Content-Description: text-part-1
-
- Some text goes here
-
- --outer
- Content-Type: multipart/mixed; boundary=inner
- Content-Disposition: attachment
- Content-Description: multipart-2
-
- --inner
- Content-Type: text/plain
- Content-Disposition: inline
- Content-Description: text-part-2
-
- Some more text here.
-
- --inner
- Content-Type: image/jpeg
- Content-Disposition: attachment
- Content-Description: jpeg-1
-
- <jpeg data>
- --inner--
- --outer--
-
-4. Summary
-
- Content-Disposition takes one of two values, `inline' and
- `attachment'. `Inline' indicates that the entity should be
- immediately displayed to the user, whereas `attachment' means that
- the user should take additional action to view the entity.
-
- The `filename' parameter can be used to suggest a filename for
- storing the bodypart, if the user wishes to store it in an external
- file.
-
-
-
-
-
-
-
-
-
-
-Troost, et. al. Standards Track [Page 8]
-
-RFC 2183 Content-Disposition August 1997
-
-
-5. Security Considerations
-
- There are security issues involved any time users exchange data.
- While these are not to be minimized, neither does this memo change
- the status quo in that regard, except in one instance.
-
- Since this memo provides a way for the sender to suggest a filename,
- a receiving MUA must take care that the sender's suggested filename
- does not represent a hazard. Using UNIX as an example, some hazards
- would be:
-
- + Creating startup files (e.g., ".login").
-
- + Creating or overwriting system files (e.g., "/etc/passwd").
-
- + Overwriting any existing file.
-
- + Placing executable files into any command search path
- (e.g., "~/bin/more").
-
- + Sending the file to a pipe (e.g., "| sh").
-
- In general, the receiving MUA should not name or place the file such
- that it will get interpreted or executed without the user explicitly
- initiating the action.
-
- It is very important to note that this is not an exhaustive list; it
- is intended as a small set of examples only. Implementors must be
- alert to the potential hazards on their target systems.
-
-6. References
-
- [RFC 2119]
- Bradner, S., "Key words for use in RFCs to Indicate Requirement
- Levels", RFC 2119, March 1997.
-
- [RFC 2184]
- Freed, N. and K. Moore, "MIME Parameter value and Encoded Words:
- Character Sets, Lanaguage, and Continuations", RFC 2184, August
- 1997.
-
- [RFC 2045]
- Freed, N. and N. Borenstein, "MIME (Multipurpose Internet Mail
- Extensions) Part One: Format of Internet Message Bodies", RFC
- 2045, December 1996.
-
-
-
-
-
-
-Troost, et. al. Standards Track [Page 9]
-
-RFC 2183 Content-Disposition August 1997
-
-
- [RFC 2046]
- Freed, N. and N. Borenstein, "MIME (Multipurpose Internet Mail
- Extensions) Part Two: Media Types", RFC 2046, December 1996.
-
- [RFC 2047]
- Moore, K., "MIME (Multipurpose Internet Mail Extensions) Part
- Three: Message Header Extensions for non-ASCII Text", RFC 2047,
- December 1996.
-
- [RFC 2048]
- Freed, N., Klensin, J. and J. Postel, "MIME (Multipurpose
- Internet Mail Extensions) Part Four: Registration Procedures",
- RFC 2048, December 1996.
-
- [RFC 2049]
- Freed, N. and N. Borenstein, "MIME (Multipurpose Internet Mail
- Extensions) Part Five: Conformance Criteria and Examples", RFC
- 2049, December 1996.
-
- [RFC 822]
- Crocker, D., "Standard for the Format of ARPA Internet Text
- Messages", STD 11, RFC 822, UDEL, August 1982.
-
-7. Acknowledgements
-
- We gratefully acknowledge the help these people provided during the
- preparation of this draft:
-
- Nathaniel Borenstein
- Ned Freed
- Keith Moore
- Dave Crocker
- Dan Pritchett
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Troost, et. al. Standards Track [Page 10]
-
-RFC 2183 Content-Disposition August 1997
-
-
-8. Authors' Addresses
-
- You should blame the editor of this version of the document for any
- changes since RFC 1806:
-
- Keith Moore
- Department of Computer Science
- University of Tennessee, Knoxville
- 107 Ayres Hall
- Knoxville TN 37996-1301
- USA
-
- Phone: +1 (423) 974-5067
- Fax: +1 (423) 974-8296
- Email: moore at cs.utk.edu
-
-
- The authors of RFC 1806 are:
-
- Rens Troost
- New Century Systems
- 324 East 41st Street #804
- New York, NY, 10017 USA
-
- Phone: +1 (212) 557-2050
- Fax: +1 (212) 557-2049
- EMail: rens at century.com
-
-
- Steve Dorner
- QUALCOMM Incorporated
- 6455 Lusk Boulevard
- San Diego, CA 92121
- USA
-
- EMail: sdorner at qualcomm.com
-
-
-9. Registration of New Content-Disposition Values and Parameters
-
- New Content-Disposition values (besides "inline" and "attachment")
- may be defined only by Internet standards-track documents, or in
- Experimental documents approved by the Internet Engineering Steering
- Group.
-
-
-
-
-
-
-
-Troost, et. al. Standards Track [Page 11]
-
-RFC 2183 Content-Disposition August 1997
-
-
- New content-disposition parameters may be registered by supplying the
- information in the following template and sending it via electronic
- mail to IANA at IANA.ORG:
-
- To: IANA at IANA.ORG
- Subject: Registration of new Content-Disposition parameter
-
- Content-Disposition parameter name:
-
- Allowable values for this parameter:
- (If the parameter can only assume a small number of values,
- list each of those values. Otherwise, describe the values
- that the parameter can assume.)
- Description:
- (What is the purpose of this parameter and how is it used?)
-
-10. Changes since RFC 1806
-
- The following changes have been made since the earlier version of
- this document, published in RFC 1806 as an Experimental protocol:
-
- + Updated references to MIME documents. In some cases this
- involved substituting a reference to one of the current MIME
- RFCs for a reference to RFC 1521; in other cases, a reference to
- RFC 1521 was simply replaced with the word "MIME".
-
- + Added a section on registration procedures, since none of the
- procedures in RFC 2048 seemed to be appropriate.
-
- + Added new parameter types: creation-date, modification-date,
- read-date, and size.
-
-
- + Incorporated a reference to draft-freed-pvcsc-* for encoding
- long or non-ASCII parameter values.
-
- + Added reference to RFC 2119 to define MUST, SHOULD, etc.
- keywords.
-
-
-
-
-
-
-
-
-
-
-
-
-
-Troost, et. al. Standards Track [Page 12]
-
diff --git a/reference/rfc2231 MIME Parameter Value and Encoded Word Extensions.txt b/reference/rfc2231 MIME Parameter Value and Encoded Word Extensions.txt
deleted file mode 100644
index 120f98f..0000000
--- a/reference/rfc2231 MIME Parameter Value and Encoded Word Extensions.txt
+++ /dev/null
@@ -1,563 +0,0 @@
-
-
-
-
-
-
-Network Working Group N. Freed
-Request for Comments: 2231 Innosoft
-Updates: 2045, 2047, 2183 K. Moore
-Obsoletes: 2184 University of Tennessee
-Category: Standards Track November 1997
-
-
- MIME Parameter Value and Encoded Word Extensions:
- Character Sets, Languages, and Continuations
-
-
-Status of this Memo
-
- This document specifies an Internet standards track protocol for the
- Internet community, and requests discussion and suggestions for
- improvements. Please refer to the current edition of the "Internet
- Official Protocol Standards" (STD 1) for the standardization state
- and status of this protocol. Distribution of this memo is unlimited.
-
-Copyright Notice
-
- Copyright (C) The Internet Society (1997). All Rights Reserved.
-
-1. Abstract
-
- This memo defines extensions to the RFC 2045 media type and RFC 2183
- disposition parameter value mechanisms to provide
-
- (1) a means to specify parameter values in character sets
- other than US-ASCII,
-
- (2) to specify the language to be used should the value be
- displayed, and
-
- (3) a continuation mechanism for long parameter values to
- avoid problems with header line wrapping.
-
- This memo also defines an extension to the encoded words defined in
- RFC 2047 to allow the specification of the language to be used for
- display as well as the character set.
-
-2. Introduction
-
- The Multipurpose Internet Mail Extensions, or MIME [RFC-2045, RFC-
- 2046, RFC-2047, RFC-2048, RFC-2049], define a message format that
- allows for:
-
-
-
-
-
-Freed & Moore Standards Track [Page 1]
-
-RFC 2231 MIME Value and Encoded Word Extensions November 1997
-
-
- (1) textual message bodies in character sets other than
- US-ASCII,
-
- (2) non-textual message bodies,
-
- (3) multi-part message bodies, and
-
- (4) textual header information in character sets other than
- US-ASCII.
-
- MIME is now widely deployed and is used by a variety of Internet
- protocols, including, of course, Internet email. However, MIME's
- success has resulted in the need for additional mechanisms that were
- not provided in the original protocol specification.
-
- In particular, existing MIME mechanisms provide for named media type
- (content-type field) parameters as well as named disposition
- (content-disposition field). A MIME media type may specify any
- number of parameters associated with all of its subtypes, and any
- specific subtype may specify additional parameters for its own use. A
- MIME disposition value may specify any number of associated
- parameters, the most important of which is probably the attachment
- disposition's filename parameter.
-
- These parameter names and values end up appearing in the content-type
- and content-disposition header fields in Internet email. This
- inherently imposes three crucial limitations:
-
- (1) Lines in Internet email header fields are folded
- according to RFC 822 folding rules. This makes long
- parameter values problematic.
-
- (2) MIME headers, like the RFC 822 headers they often
- appear in, are limited to 7bit US-ASCII, and the
- encoded-word mechanisms of RFC 2047 are not available
- to parameter values. This makes it impossible to have
- parameter values in character sets other than US-ASCII
- without specifying some sort of private per-parameter
- encoding.
-
- (3) It has recently become clear that character set
- information is not sufficient to properly display some
- sorts of information -- language information is also
- needed [RFC-2130]. For example, support for
- handicapped users may require reading text string
-
-
-
-
-
-
-Freed & Moore Standards Track [Page 2]
-
-RFC 2231 MIME Value and Encoded Word Extensions November 1997
-
-
- aloud. The language the text is written in is needed
- for this to be done correctly. Some parameter values
- may need to be displayed, hence there is a need to
- allow for the inclusion of language information.
-
- The last problem on this list is also an issue for the encoded words
- defined by RFC 2047, as encoded words are intended primarily for
- display purposes.
-
- This document defines extensions that address all of these
- limitations. All of these extensions are implemented in a fashion
- that is completely compatible at a syntactic level with existing MIME
- implementations. In addition, the extensions are designed to have as
- little impact as possible on existing uses of MIME.
-
- IMPORTANT NOTE: These mechanisms end up being somewhat gibbous when
- they actually are used. As such, these mechanisms should not be used
- lightly; they should be reserved for situations where a real need for
- them exists.
-
-2.1. Requirements notation
-
- This document occasionally uses terms that appear in capital letters.
- When the terms "MUST", "SHOULD", "MUST NOT", "SHOULD NOT", and "MAY"
- appear capitalized, they are being used to indicate particular
- requirements of this specification. A discussion of the meanings of
- these terms appears in [RFC- 2119].
-
-3. Parameter Value Continuations
-
- Long MIME media type or disposition parameter values do not interact
- well with header line wrapping conventions. In particular, proper
- header line wrapping depends on there being places where linear
- whitespace (LWSP) is allowed, which may or may not be present in a
- parameter value, and even if present may not be recognizable as such
- since specific knowledge of parameter value syntax may not be
- available to the agent doing the line wrapping. The result is that
- long parameter values may end up getting truncated or otherwise
- damaged by incorrect line wrapping implementations.
-
- A mechanism is therefore needed to break up parameter values into
- smaller units that are amenable to line wrapping. Any such mechanism
- MUST be compatible with existing MIME processors. This means that
-
- (1) the mechanism MUST NOT change the syntax of MIME media
- type and disposition lines, and
-
-
-
-
-
-Freed & Moore Standards Track [Page 3]
-
-RFC 2231 MIME Value and Encoded Word Extensions November 1997
-
-
- (2) the mechanism MUST NOT depend on parameter ordering
- since MIME states that parameters are not order
- sensitive. Note that while MIME does prohibit
- modification of MIME headers during transport, it is
- still possible that parameters will be reordered when
- user agent level processing is done.
-
- The obvious solution, then, is to use multiple parameters to contain
- a single parameter value and to use some kind of distinguished name
- to indicate when this is being done. And this obvious solution is
- exactly what is specified here: The asterisk character ("*") followed
- by a decimal count is employed to indicate that multiple parameters
- are being used to encapsulate a single parameter value. The count
- starts at 0 and increments by 1 for each subsequent section of the
- parameter value. Decimal values are used and neither leading zeroes
- nor gaps in the sequence are allowed.
-
- The original parameter value is recovered by concatenating the
- various sections of the parameter, in order. For example, the
- content-type field
-
- Content-Type: message/external-body; access-type=URL;
- URL*0="ftp://";
- URL*1="cs.utk.edu/pub/moore/bulk-mailer/bulk-mailer.tar"
-
- is semantically identical to
-
- Content-Type: message/external-body; access-type=URL;
- URL="ftp://cs.utk.edu/pub/moore/bulk-mailer/bulk-mailer.tar"
-
- Note that quotes around parameter values are part of the value
- syntax; they are NOT part of the value itself. Furthermore, it is
- explicitly permitted to have a mixture of quoted and unquoted
- continuation fields.
-
-4. Parameter Value Character Set and Language Information
-
- Some parameter values may need to be qualified with character set or
- language information. It is clear that a distinguished parameter
- name is needed to identify when this information is present along
- with a specific syntax for the information in the value itself. In
- addition, a lightweight encoding mechanism is needed to accommodate 8
- bit information in parameter values.
-
-
-
-
-
-
-
-
-Freed & Moore Standards Track [Page 4]
-
-RFC 2231 MIME Value and Encoded Word Extensions November 1997
-
-
- Asterisks ("*") are reused to provide the indicator that language and
- character set information is present and encoding is being used. A
- single quote ("'") is used to delimit the character set and language
- information at the beginning of the parameter value. Percent signs
- ("%") are used as the encoding flag, which agrees with RFC 2047.
-
- Specifically, an asterisk at the end of a parameter name acts as an
- indicator that character set and language information may appear at
- the beginning of the parameter value. A single quote is used to
- separate the character set, language, and actual value information in
- the parameter value string, and an percent sign is used to flag
- octets encoded in hexadecimal. For example:
-
- Content-Type: application/x-stuff;
- title*=us-ascii'en-us'This%20is%20%2A%2A%2Afun%2A%2A%2A
-
- Note that it is perfectly permissible to leave either the character
- set or language field blank. Note also that the single quote
- delimiters MUST be present even when one of the field values is
- omitted. This is done when either character set, language, or both
- are not relevant to the parameter value at hand. This MUST NOT be
- done in order to indicate a default character set or language --
- parameter field definitions MUST NOT assign a default character set
- or language.
-
-4.1. Combining Character Set, Language, and Parameter Continuations
-
- Character set and language information may be combined with the
- parameter continuation mechanism. For example:
-
- Content-Type: application/x-stuff
- title*0*=us-ascii'en'This%20is%20even%20more%20
- title*1*=%2A%2A%2Afun%2A%2A%2A%20
- title*2="isn't it!"
-
- Note that:
-
- (1) Language and character set information only appear at
- the beginning of a given parameter value.
-
- (2) Continuations do not provide a facility for using more
- than one character set or language in the same
- parameter value.
-
- (3) A value presented using multiple continuations may
- contain a mixture of encoded and unencoded segments.
-
-
-
-
-
-Freed & Moore Standards Track [Page 5]
-
-RFC 2231 MIME Value and Encoded Word Extensions November 1997
-
-
- (4) The first segment of a continuation MUST be encoded if
- language and character set information are given.
-
- (5) If the first segment of a continued parameter value is
- encoded the language and character set field delimiters
- MUST be present even when the fields are left blank.
-
-5. Language specification in Encoded Words
-
- RFC 2047 provides support for non-US-ASCII character sets in RFC 822
- message header comments, phrases, and any unstructured text field.
- This is done by defining an encoded word construct which can appear
- in any of these places. Given that these are fields intended for
- display, it is sometimes necessary to associate language information
- with encoded words as well as just the character set. This
- specification extends the definition of an encoded word to allow the
- inclusion of such information. This is simply done by suffixing the
- character set specification with an asterisk followed by the language
- tag. For example:
-
- From: =?US-ASCII*EN?Q?Keith_Moore?= <moore at cs.utk.edu>
-
-6. IMAP4 Handling of Parameter Values
-
- IMAP4 [RFC-2060] servers SHOULD decode parameter value continuations
- when generating the BODY and BODYSTRUCTURE fetch attributes.
-
-7. Modifications to MIME ABNF
-
- The ABNF for MIME parameter values given in RFC 2045 is:
-
- parameter := attribute "=" value
-
- attribute := token
- ; Matching of attributes
- ; is ALWAYS case-insensitive.
-
- This specification changes this ABNF to:
-
- parameter := regular-parameter / extended-parameter
-
- regular-parameter := regular-parameter-name "=" value
-
- regular-parameter-name := attribute [section]
-
- attribute := 1*attribute-char
-
-
-
-
-
-Freed & Moore Standards Track [Page 6]
-
-RFC 2231 MIME Value and Encoded Word Extensions November 1997
-
-
- attribute-char := <any (US-ASCII) CHAR except SPACE, CTLs,
- "*", "'", "%", or tspecials>
-
- section := initial-section / other-sections
-
- initial-section := "*0"
-
- other-sections := "*" ("1" / "2" / "3" / "4" / "5" /
- "6" / "7" / "8" / "9") *DIGIT)
-
- extended-parameter := (extended-initial-name "="
- extended-value) /
- (extended-other-names "="
- extended-other-values)
-
- extended-initial-name := attribute [initial-section] "*"
-
- extended-other-names := attribute other-sections "*"
-
- extended-initial-value := [charset] "'" [language] "'"
- extended-other-values
-
- extended-other-values := *(ext-octet / attribute-char)
-
- ext-octet := "%" 2(DIGIT / "A" / "B" / "C" / "D" / "E" / "F")
-
- charset := <registered character set name>
-
- language := <registered language tag [RFC-1766]>
-
- The ABNF given in RFC 2047 for encoded-words is:
-
- encoded-word := "=?" charset "?" encoding "?" encoded-text "?="
-
- This specification changes this ABNF to:
-
- encoded-word := "=?" charset ["*" language] "?" encoded-text "?="
-
-8. Character sets which allow specification of language
-
- In the future it is likely that some character sets will provide
- facilities for inline language labeling. Such facilities are
- inherently more flexible than those defined here as they allow for
- language switching in the middle of a string.
-
-
-
-
-
-
-
-Freed & Moore Standards Track [Page 7]
-
-RFC 2231 MIME Value and Encoded Word Extensions November 1997
-
-
- If and when such facilities are developed they SHOULD be used in
- preference to the language labeling facilities specified here. Note
- that all the mechanisms defined here allow for the omission of
- language labels so as to be able to accommodate this possible future
- usage.
-
-9. Security Considerations
-
- This RFC does not discuss security issues and is not believed to
- raise any security issues not already endemic in electronic mail and
- present in fully conforming implementations of MIME.
-
-10. References
-
- [RFC-822]
- Crocker, D., "Standard for the Format of ARPA Internet
- Text Messages", STD 11, RFC 822 August 1982.
-
- [RFC-1766]
- Alvestrand, H., "Tags for the Identification of
- Languages", RFC 1766, March 1995.
-
- [RFC-2045]
- Freed, N., and N. Borenstein, "Multipurpose Internet Mail
- Extensions (MIME) Part One: Format of Internet Message
- Bodies", RFC 2045, December 1996.
-
- [RFC-2046]
- Freed, N. and N. Borenstein, "Multipurpose Internet Mail
- Extensions (MIME) Part Two: Media Types", RFC 2046,
- December 1996.
-
- [RFC-2047]
- Moore, K., "Multipurpose Internet Mail Extensions (MIME)
- Part Three: Representation of Non-ASCII Text in Internet
- Message Headers", RFC 2047, December 1996.
-
- [RFC-2048]
- Freed, N., Klensin, J. and J. Postel, "Multipurpose
- Internet Mail Extensions (MIME) Part Four: MIME
- Registration Procedures", RFC 2048, December 1996.
-
- [RFC-2049]
- Freed, N. and N. Borenstein, "Multipurpose Internet Mail
- Extensions (MIME) Part Five: Conformance Criteria and
- Examples", RFC 2049, December 1996.
-
-
-
-
-
-Freed & Moore Standards Track [Page 8]
-
-RFC 2231 MIME Value and Encoded Word Extensions November 1997
-
-
- [RFC-2060]
- Crispin, M., "Internet Message Access Protocol - Version
- 4rev1", RFC 2060, December 1996.
-
- [RFC-2119]
- Bradner, S., "Key words for use in RFCs to Indicate
- Requirement Levels", RFC 2119, March 1997.
-
- [RFC-2130]
- Weider, C., Preston, C., Simonsen, K., Alvestrand, H.,
- Atkinson, R., Crispin, M., and P. Svanberg, "Report from the
- IAB Character Set Workshop", RFC 2130, April 1997.
-
- [RFC-2183]
- Troost, R., Dorner, S. and K. Moore, "Communicating
- Presentation Information in Internet Messages: The
- Content-Disposition Header", RFC 2183, August 1997.
-
-11. Authors' Addresses
-
- Ned Freed
- Innosoft International, Inc.
- 1050 Lakes Drive
- West Covina, CA 91790
- USA
-
- Phone: +1 626 919 3600
- Fax: +1 626 919 3614
- EMail: ned.freed at innosoft.com
-
-
- Keith Moore
- Computer Science Dept.
- University of Tennessee
- 107 Ayres Hall
- Knoxville, TN 37996-1301
- USA
-
- EMail: moore at cs.utk.edu
-
-
-
-
-
-
-
-
-
-
-
-
-Freed & Moore Standards Track [Page 9]
-
-RFC 2231 MIME Value and Encoded Word Extensions November 1997
-
-
-12. Full Copyright Statement
-
- Copyright (C) The Internet Society (1997). All Rights Reserved.
-
- This document and translations of it may be copied and furnished to
- others, and derivative works that comment on or otherwise explain it
- or assist in its implementation may be prepared, copied, published
- and distributed, in whole or in part, without restriction of any
- kind, provided that the above copyright notice and this paragraph are
- included on all such copies and derivative works. However, this
- document itself may not be modified in any way, such as by removing
- the copyright notice or references to the Internet Society or other
- Internet organizations, except as needed for the purpose of
- developing Internet standards in which case the procedures for
- copyrights defined in the Internet Standards process must be
- followed, or as required to translate it into languages other than
- English.
-
- The limited permissions granted above are perpetual and will not be
- revoked by the Internet Society or its successors or assigns.
-
- This document and the information contained herein is provided on an
- "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
- TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
- BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
- HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
- MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Freed & Moore Standards Track [Page 10]
-
diff --git a/reference/rfc2387 MIME Multipart-Related Content-type.txt b/reference/rfc2387 MIME Multipart-Related Content-type.txt
deleted file mode 100644
index 0ee845f..0000000
--- a/reference/rfc2387 MIME Multipart-Related Content-type.txt
+++ /dev/null
@@ -1,563 +0,0 @@
-
-
-
-
-
-Network Working Group E. Levinson
-Request for Comments: 2387 August 1998
-Obsoletes: 2112
-Category: Standards Track
-
-
- The MIME Multipart/Related Content-type
-
-Status of this Memo
-
- This document specifies an Internet standards track protocol for the
- Internet community, and requests discussion and suggestions for
- improvements. Please refer to the current edition of the "Internet
- Official Protocol Standards" (STD 1) for the standardization state
- and status of this protocol. Distribution of this memo is unlimited.
-
-Copyright Notice
-
- Copyright (C) The Internet Society (1998). All Rights Reserved.
-
-Abstract
-
- The Multipart/Related content-type provides a common mechanism for
- representing objects that are aggregates of related MIME body parts.
- This document defines the Multipart/Related content-type and provides
- examples of its use.
-
-1. Introduction
-
- Several applications of MIME, including MIME-PEM, and MIME-Macintosh
- and other proposals, require multiple body parts that make sense only
- in the aggregate. The present approach to these compound objects has
- been to define specific multipart subtypes for each new object. In
- keeping with the MIME philosophy of having one mechanism to achieve
- the same goal for different purposes, this document describes a
- single mechanism for such aggregate or compound objects.
-
- The Multipart/Related content-type addresses the MIME representation
- of compound objects. The object is categorized by a "type"
- parameter. Additional parameters are provided to indicate a specific
- starting body part or root and auxiliary information which may be
- required when unpacking or processing the object.
-
- Multipart/Related MIME entities may contain Content-Disposition
- headers that provide suggestions for the storage and display of a
- body part. Multipart/Related processing takes precedence over
- Content-Disposition; the interaction between them is discussed in
- section 4.
-
-
-
-Levinson Standards Track [Page 1]
-
-RFC 2387 Multipart/Related August 1998
-
-
- Responsibility for the display or processing of a Multipart/Related's
- constituent entities rests with the application that handles the
- compound object.
-
-2. Multipart/Related Registration Information
-
- The following form is copied from RFC 1590, Appendix A.
-
- To: IANA at isi.edu
- Subject: Registration of new Media Type content-type/subtype
-
- Media Type name: Multipart
-
- Media subtype name: Related
-
- Required parameters: Type, a media type/subtype.
-
- Optional parameters: Start
- Start-info
-
- Encoding considerations: Multipart content-types cannot have
- encodings.
-
- Security considerations: Depends solely on the referenced type.
-
- Published specification: RFC-REL (this document).
-
- Person & email address to contact for further information:
- Edward Levinson
- 47 Clive Street
- Metuchen, NJ 08840-1060
- +1 908 494 1606
- XIson at cnj.digex.net
-
-3. Intended usage
-
- The Multipart/Related media type is intended for compound objects
- consisting of several inter-related body parts. For a
- Multipart/Related object, proper display cannot be achieved by
- individually displaying the constituent body parts. The content-type
- of the Multipart/Related object is specified by the type parameter.
- The "start" parameter, if given, points, via a content-ID, to the
- body part that contains the object root. The default root is the
- first body part within the Multipart/Related body.
-
- The relationships among the body parts of a compound object
- distinguishes it from other object types. These relationships are
- often represented by links internal to the object's components that
-
-
-
-Levinson Standards Track [Page 2]
-
-RFC 2387 Multipart/Related August 1998
-
-
- reference the other components. Within a single operating
- environment the links are often file names, such links may be
- represented within a MIME message using content-IDs or the value of
- some other "Content-" headers.
-
-3.1. The Type Parameter
-
- The type parameter must be specified and its value is the MIME media
- type of the "root" body part. It permits a MIME user agent to
- determine the content-type without reference to the enclosed body
- part. If the value of the type parameter and the root body part's
- content-type differ then the User Agent's behavior is undefined.
-
-3.2. The Start Parameter
-
- The start parameter, if given, is the content-ID of the compound
- object's "root". If not present the "root" is the first body part in
- the Multipart/Related entity. The "root" is the element the
- applications processes first.
-
-3.3. The Start-Info Parameter
-
- Additional information can be provided to an application by the
- start-info parameter. It contains either a string or points, via a
- content-ID, to another MIME entity in the message. A typical use
- might be to provide additional command line parameters or a MIME
- entity giving auxiliary information for processing the compound
- object.
-
- Applications that use Multipart/Related must specify the
- interpretation of start-info. User Agents shall provide the
- parameter's value to the processing application. Processes can
- distinguish a start-info reference from a token or quoted-string by
- examining the first non-white-space character, "<" indicates a
- reference.
-
-3.4. Syntax
-
- related-param := [ ";" "start" "=" cid ]
- [ ";" "start-info" "="
- ( cid-list / value ) ]
- [ ";" "type" "=" type "/" subtype ]
- ; order independent
-
- cid-list := cid cid-list
-
- cid := msg-id ; c.f. [822]
-
-
-
-
-Levinson Standards Track [Page 3]
-
-RFC 2387 Multipart/Related August 1998
-
-
- value := token / quoted-string ; c.f. [MIME]
- ; value cannot begin with "<"
-
- Note that the parameter values will usually require quoting. Msg-id
- contains the special characters "<", ">", "@", and perhaps other
- special characters. If msg-id contains quoted-strings, those quote
- marks must be escaped. Similarly, the type parameter contains the
- special character "/".
-
-4. Handling Content-Disposition Headers
-
- Content-Disposition Headers [DISP] suggest presentation styles for
- MIME body parts. [DISP] describes two presentation styles, called
- the disposition type, INLINE and ATTACHMENT. These, used within a
- multipart entity, allow the sender to suggest presentation
- information. [DISP] also provides for an optional storage (file)
- name. Content-Disposition headers could appear in one or more body
- parts contained within a Multipart/Related entity.
-
- Using Content-Disposition headers in addition to Multipart/Related
- provides presentation information to User Agents that do not
- recognize Multipart/Related. They will treat the multipart as
- Multipart/Mixed and they may find the Content-Disposition information
- useful.
-
- With Multipart/Related however, the application processing the
- compound object determines the presentation style for all the
- contained parts. In that context the Content-Disposition header
- information is redundant or even misleading. Hence, User Agents that
- understand Multipart/Related shall ignore the disposition type within
- a Multipart/Related body part.
-
- It may be possible for a User Agent capable of handling both
- Multipart/Related and Content-Disposition headers to provide the
- invoked application the Content-Disposition header's optional
- filename parameter to the Multipart/Related. The use of that
- information will depend on the specific application and should be
- specified when describing the handling of the corresponding compound
- object. Such descriptions would be appropriate in an RFC registering
- that object's media type.
-
-5. Examples
-
-5.1 Application/X-FixedRecord
-
- The X-FixedRecord content-type consists of one or more octet-streams
- and a list of the lengths of each record. The root, which lists the
- record lengths of each record within the streams. The record length
-
-
-
-Levinson Standards Track [Page 4]
-
-RFC 2387 Multipart/Related August 1998
-
-
- list, type Application/X-FixedRecord, consists of a set of INTEGERs
- in ASCII format, one per line. Each INTEGER gives the number of
- octets from the octet-stream body part that constitute the next
- "record".
-
- The example below, uses a single data block.
-
- Content-Type: Multipart/Related; boundary=example-1
- start="<950120.aaCC at XIson.com>";
- type="Application/X-FixedRecord"
- start-info="-o ps"
-
- --example-1
- Content-Type: Application/X-FixedRecord
- Content-ID: <950120.aaCC at XIson.com>
-
- 25
- 10
- 34
- 10
- 25
- 21
- 26
- 10
- --example-1
- Content-Type: Application/octet-stream
- Content-Description: The fixed length records
- Content-Transfer-Encoding: base64
- Content-ID: <950120.aaCB at XIson.com>
-
- T2xkIE1hY0RvbmFsZCBoYWQgYSBmYXJtCkUgSS
- BFIEkgTwpBbmQgb24gaGlzIGZhcm0gaGUgaGFk
- IHNvbWUgZHVja3MKRSBJIEUgSSBPCldpdGggYS
- BxdWFjayBxdWFjayBoZXJlLAphIHF1YWNrIHF1
- YWNrIHRoZXJlLApldmVyeSB3aGVyZSBhIHF1YW
- NrIHF1YWNrCkUgSSBFIEkgTwo=
-
- --example-1--
-
-
-
-
-
-
-
-
-
-
-
-
-
-Levinson Standards Track [Page 5]
-
-RFC 2387 Multipart/Related August 1998
-
-
-5.2 Text/X-Okie
-
- The Text/X-Okie is an invented markup language permitting the
- inclusion of images with text. A feature of this example is the
- inclusion of two additional body parts, both picture. They are
- referred to internally by the encapsulated document via each
- picture's body part content-ID. Usage of "cid:", as in this example,
- may be useful for a variety of compound objects. It is not, however,
- a part of the Multipart/Related specification.
-
- Content-Type: Multipart/Related; boundary=example-2;
- start="<950118.AEBH at XIson.com>"
- type="Text/x-Okie"
-
- --example-2
- Content-Type: Text/x-Okie; charset=iso-8859-1;
- declaration="<950118.AEB0 at XIson.com>"
- Content-ID: <950118.AEBH at XIson.com>
- Content-Description: Document
-
- {doc}
- This picture was taken by an automatic camera mounted ...
- {image file=cid:950118.AECB at XIson.com}
- {para}
- Now this is an enlargement of the area ...
- {image file=cid:950118:AFDH at XIson.com}
- {/doc}
- --example-2
- Content-Type: image/jpeg
- Content-ID: <950118.AFDH at XIson.com>
- Content-Transfer-Encoding: BASE64
- Content-Description: Picture A
-
- [encoded jpeg image]
- --example-2
- Content-Type: image/jpeg
- Content-ID: <950118.AECB at XIson.com>
- Content-Transfer-Encoding: BASE64
- Content-Description: Picture B
-
- [encoded jpeg image]
- --example-2--
-
-5.3 Content-Disposition
-
- In the above example each image body part could also have a Content-
- Disposition header. For example,
-
-
-
-
-Levinson Standards Track [Page 6]
-
-RFC 2387 Multipart/Related August 1998
-
-
- --example-2
- Content-Type: image/jpeg
- Content-ID: <950118.AECB at XIson.com>
- Content-Transfer-Encoding: BASE64
- Content-Description: Picture B
- Content-Disposition: INLINE
-
- [encoded jpeg image]
- --example-2--
-
- User Agents that recognize Multipart/Related will ignore the
- Content-Disposition header's disposition type. Other User Agents
- will process the Multipart/Related as Multipart/Mixed and may make
- use of that header's information.
-
-6. User Agent Requirements
-
- User agents that do not recognize Multipart/Related shall, in
- accordance with [MIME], treat the entire entity as Multipart/Mixed.
- MIME User Agents that do recognize Multipart/Related entities but are
- unable to process the given type should give the user the option of
- suppressing the entire Multipart/Related body part shall be.
-
- Existing MIME-capable mail user agents (MUAs) handle the existing
- media types in a straightforward manner. For discrete media types
- (e.g. text, image, etc.) the body of the entity can be directly
- passed to a display process. Similarly the existing composite
- subtypes can be reduced to handing one or more discrete types.
- Handling Multipart/Related differs in that processing cannot be
- reduced to handling the individual entities.
-
- The following sections discuss what information the processing
- application requires.
-
- It is possible that an application specific "receiving agent" will
- manipulate the entities for display prior to invoking actual
- application process. Okie, above, is an example of this; it may need
- a receiving agent to parse the document and substitute local file
- names for the originator's file names. Other applications may just
- require a table showing the correspondence between the local file
- names and the originator's. The receiving agent takes responsibility
- for such processing.
-
-6.1 Data Requirements
-
- MIME-capable mail user agents (MUAs) are required to provide the
- application:
-
-
-
-
-Levinson Standards Track [Page 7]
-
-RFC 2387 Multipart/Related August 1998
-
-
- (a) the bodies of the MIME entities and the entity Content-* headers,
-
- (b) the parameters of the Multipart/Related Content-type header, and
-
- (c) the correspondence between each body's local file name, that
- body's header data, and, if present, the body part's content-ID.
-
-6.2 Storing Multipart/Related Entities
-
- The Multipart/Related media type will be used for objects that have
- internal linkages between the body parts. When the objects are
- stored the linkages may require processing by the application or its
- receiving agent.
-
-6.3 Recursion
-
- MIME is a recursive structure. Hence one must expect a
- Multipart/Related entity to contain other Multipart/Related entities.
- When a Multipart/Related entity is being processed for display or
- storage, any enclosed Multipart/Related entities shall be processed
- as though they were being stored.
-
-6.4 Configuration Considerations
-
- It is suggested that MUAs that use configuration mechanisms, see
- [CFG] for an example, refer to Multipart/Related as Multi-
- part/Related/<type>, were <type> is the value of the "type"
- parameter.
-
-7. Security Considerations
-
- Security considerations relevant to Multipart/Related are identical
- to those of the underlying content-type.
-
-8. Acknowledgments
-
- This proposal is the result of conversations the author has had with
- many people. In particular, Harald A. Alvestrand, James Clark,
- Charles Goldfarb, Gary Houston, Ned Freed, Ray Moody, and Don
- Stinchfield, provided both encouragement and invaluable help. The
- author, however, take full responsibility for all errors contained in
- this document.
-
-
-
-
-
-
-
-
-
-Levinson Standards Track [Page 8]
-
-RFC 2387 Multipart/Related August 1998
-
-
-9. References
-
- [822] Crocker, D., "Standard for the Format of ARPA Internet
- Text Messages", STD 11, RFC 822, August 1982.
-
- [CID] Levinson, E., and J. Clark, "Message/External-Body
- Content-ID Access Type", RFC 1873, December 1995,
- Levinson, E., "Message/External-Body Content-ID Access
- Type", Work in Progress.
-
- [CFG] Borenstein, N., "A User Agent Configuration Mechanism For
- Multimedia Mail Format Information", RFC 1524, September
- 1993.
-
- [DISP] Troost, R., and S. Dorner, "Communicating Presentation
- Information in Internet Messages: The Content-
- Disposition Header", RFC 1806, June 1995.
-
- [MIME] Borenstein, N., and Freed, N., "Multipurpose Internet
- Mail Extensions (MIME) Part One: Format of Internet
- Message Bodies", RFC 2045, November 1996.
-
-9. Author's Address
-
- Edward Levinson
- 47 Clive Street
- Metuchen, NJ 08840-1060
- USA
-
- Phone: +1 908 494 1606
- EMail: XIson at cnj.digex.com
-
-10. Changes from previous draft (RFC 2112)
-
- Corrected cid urls to conform to RFC 2111; the angle brackets were
- removed.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Levinson Standards Track [Page 9]
-
-RFC 2387 Multipart/Related August 1998
-
-
-11. Full Copyright Statement
-
- Copyright (C) The Internet Society (1998). All Rights Reserved.
-
- This document and translations of it may be copied and furnished to
- others, and derivative works that comment on or otherwise explain it
- or assist in its implementation may be prepared, copied, published
- and distributed, in whole or in part, without restriction of any
- kind, provided that the above copyright notice and this paragraph are
- included on all such copies and derivative works. However, this
- document itself may not be modified in any way, such as by removing
- the copyright notice or references to the Internet Society or other
- Internet organizations, except as needed for the purpose of
- developing Internet standards in which case the procedures for
- copyrights defined in the Internet Standards process must be
- followed, or as required to translate it into languages other than
- English.
-
- The limited permissions granted above are perpetual and will not be
- revoked by the Internet Society or its successors or assigns.
-
- This document and the information contained herein is provided on an
- "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
- TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
- BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
- HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
- MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Levinson Standards Track [Page 10]
-
-
diff --git a/reference/rfc2821 Simple Mail Transfer Protocol.txt b/reference/rfc2821 Simple Mail Transfer Protocol.txt
deleted file mode 100644
index e0f9e2d..0000000
--- a/reference/rfc2821 Simple Mail Transfer Protocol.txt
+++ /dev/null
@@ -1,3711 +0,0 @@
-Network Working Group J. Klensin, Editor
-Request for Comments: 2821 AT&T Laboratories
-Obsoletes: 821, 974, 1869 April 2001
-Updates: 1123
-Category: Standards Track
-
- Simple Mail Transfer Protocol
-
-Status of this Memo
-
- This document specifies an Internet standards track protocol for the
- Internet community, and requests discussion and suggestions for
- improvements. Please refer to the current edition of the "Internet
- Official Protocol Standards" (STD 1) for the standardization state
- and status of this protocol. Distribution of this memo is unlimited.
-
-Copyright Notice
-
- Copyright (C) The Internet Society (2001). All Rights Reserved.
-
-Abstract
-
- This document is a self-contained specification of the basic protocol
- for the Internet electronic mail transport. It consolidates, updates
- and clarifies, but doesn't add new or change existing functionality
- of the following:
-
- - the original SMTP (Simple Mail Transfer Protocol) specification of
- RFC 821 [30],
-
- - domain name system requirements and implications for mail
- transport from RFC 1035 [22] and RFC 974 [27],
-
- - the clarifications and applicability statements in RFC 1123 [2],
- and
-
- - material drawn from the SMTP Extension mechanisms [19].
-
- It obsoletes RFC 821, RFC 974, and updates RFC 1123 (replaces the
- mail transport materials of RFC 1123). However, RFC 821 specifies
- some features that were not in significant use in the Internet by the
- mid-1990s and (in appendices) some additional transport models.
- Those sections are omitted here in the interest of clarity and
- brevity; readers needing them should refer to RFC 821.
-
- It also includes some additional material from RFC 1123 that required
- amplification. This material has been identified in multiple ways,
- mostly by tracking flaming on various lists and newsgroups and
- problems of unusual readings or interpretations that have appeared as
- the SMTP extensions have been deployed. Where this specification
- moves beyond consolidation and actually differs from earlier
- documents, it supersedes them technically as well as textually.
-
- Although SMTP was designed as a mail transport and delivery protocol,
- this specification also contains information that is important to its
- use as a 'mail submission' protocol, as recommended for POP [3, 26]
- and IMAP [6]. Additional submission issues are discussed in RFC 2476
- [15].
-
- Section 2.3 provides definitions of terms specific to this document.
- Except when the historical terminology is necessary for clarity, this
- document uses the current 'client' and 'server' terminology to
- identify the sending and receiving SMTP processes, respectively.
-
- A companion document [32] discusses message headers, message bodies
- and formats and structures for them, and their relationship.
-
-Table of Contents
-
- 1. Introduction .................................................. 4
- 2. The SMTP Model ................................................ 5
- 2.1 Basic Structure .............................................. 5
- 2.2 The Extension Model .......................................... 7
- 2.2.1 Background ................................................. 7
- 2.2.2 Definition and Registration of Extensions .................. 8
- 2.3 Terminology .................................................. 9
- 2.3.1 Mail Objects ............................................... 10
- 2.3.2 Senders and Receivers ...................................... 10
- 2.3.3 Mail Agents and Message Stores ............................. 10
- 2.3.4 Host ....................................................... 11
- 2.3.5 Domain ..................................................... 11
- 2.3.6 Buffer and State Table ..................................... 11
- 2.3.7 Lines ...................................................... 12
- 2.3.8 Originator, Delivery, Relay, and Gateway Systems ........... 12
- 2.3.9 Message Content and Mail Data .............................. 13
- 2.3.10 Mailbox and Address ....................................... 13
- 2.3.11 Reply ..................................................... 13
- 2.4 General Syntax Principles and Transaction Model .............. 13
- 3. The SMTP Procedures: An Overview .............................. 15
- 3.1 Session Initiation ........................................... 15
- 3.2 Client Initiation ............................................ 16
- 3.3 Mail Transactions ............................................ 16
- 3.4 Forwarding for Address Correction or Updating ................ 19
-
- 3.5 Commands for Debugging Addresses ............................. 20
- 3.5.1 Overview ................................................... 20
- 3.5.2 VRFY Normal Response ....................................... 22
- 3.5.3 Meaning of VRFY or EXPN Success Response ................... 22
- 3.5.4 Semantics and Applications of EXPN ......................... 23
- 3.6 Domains ...................................................... 23
- 3.7 Relaying ..................................................... 24
- 3.8 Mail Gatewaying .............................................. 25
- 3.8.1 Header Fields in Gatewaying ................................ 26
- 3.8.2 Received Lines in Gatewaying ............................... 26
- 3.8.3 Addresses in Gatewaying .................................... 26
- 3.8.4 Other Header Fields in Gatewaying .......................... 27
- 3.8.5 Envelopes in Gatewaying .................................... 27
- 3.9 Terminating Sessions and Connections ......................... 27
- 3.10 Mailing Lists and Aliases ................................... 28
- 3.10.1 Alias ..................................................... 28
- 3.10.2 List ...................................................... 28
- 4. The SMTP Specifications ....................................... 29
- 4.1 SMTP Commands ................................................ 29
- 4.1.1 Command Semantics and Syntax ............................... 29
- 4.1.1.1 Extended HELLO (EHLO) or HELLO (HELO) ................... 29
- 4.1.1.2 MAIL (MAIL) .............................................. 31
- 4.1.1.3 RECIPIENT (RCPT) ......................................... 31
- 4.1.1.4 DATA (DATA) .............................................. 33
- 4.1.1.5 RESET (RSET) ............................................. 34
- 4.1.1.6 VERIFY (VRFY) ............................................ 35
- 4.1.1.7 EXPAND (EXPN) ............................................ 35
- 4.1.1.8 HELP (HELP) .............................................. 35
- 4.1.1.9 NOOP (NOOP) .............................................. 35
- 4.1.1.10 QUIT (QUIT) ............................................. 36
- 4.1.2 Command Argument Syntax .................................... 36
- 4.1.3 Address Literals ........................................... 38
- 4.1.4 Order of Commands .......................................... 39
- 4.1.5 Private-use Commands ....................................... 40
- 4.2 SMTP Replies ................................................ 40
- 4.2.1 Reply Code Severities and Theory ........................... 42
- 4.2.2 Reply Codes by Function Groups ............................. 44
- 4.2.3 Reply Codes in Numeric Order .............................. 45
- 4.2.4 Reply Code 502 ............................................. 46
- 4.2.5 Reply Codes After DATA and the Subsequent <CRLF>.<CRLF> .... 46
- 4.3 Sequencing of Commands and Replies ........................... 47
- 4.3.1 Sequencing Overview ........................................ 47
- 4.3.2 Command-Reply Sequences .................................... 48
- 4.4 Trace Information ............................................ 49
- 4.5 Additional Implementation Issues ............................. 53
- 4.5.1 Minimum Implementation ..................................... 53
- 4.5.2 Transparency ............................................... 53
- 4.5.3 Sizes and Timeouts ......................................... 54
-
- 4.5.3.1 Size limits and minimums ................................. 54
- 4.5.3.2 Timeouts ................................................. 56
- 4.5.4 Retry Strategies ........................................... 57
- 4.5.4.1 Sending Strategy ......................................... 58
- 4.5.4.2 Receiving Strategy ....................................... 59
- 4.5.5 Messages with a null reverse-path .......................... 59
- 5. Address Resolution and Mail Handling .......................... 60
- 6. Problem Detection and Handling ................................ 62
- 6.1 Reliable Delivery and Replies by Email ....................... 62
- 6.2 Loop Detection ............................................... 63
- 6.3 Compensating for Irregularities .............................. 63
- 7. Security Considerations ....................................... 64
- 7.1 Mail Security and Spoofing ................................... 64
- 7.2 "Blind" Copies ............................................... 65
- 7.3 VRFY, EXPN, and Security ..................................... 65
- 7.4 Information Disclosure in Announcements ...................... 66
- 7.5 Information Disclosure in Trace Fields ....................... 66
- 7.6 Information Disclosure in Message Forwarding ................. 67
- 7.7 Scope of Operation of SMTP Servers ........................... 67
- 8. IANA Considerations ........................................... 67
- 9. References .................................................... 68
- 10. Editor's Address ............................................. 70
- 11. Acknowledgments .............................................. 70
- Appendices ....................................................... 71
- A. TCP Transport Service ......................................... 71
- B. Generating SMTP Commands from RFC 822 Headers ................. 71
- C. Source Routes ................................................. 72
- D. Scenarios ..................................................... 73
- E. Other Gateway Issues .......................................... 76
- F. Deprecated Features of RFC 821 ................................ 76
- Full Copyright Statement ......................................... 79
-
-1. Introduction
-
- The objective of the Simple Mail Transfer Protocol (SMTP) is to
- transfer mail reliably and efficiently.
-
- SMTP is independent of the particular transmission subsystem and
- requires only a reliable ordered data stream channel. While this
- document specifically discusses transport over TCP, other transports
- are possible. Appendices to RFC 821 describe some of them.
-
- An important feature of SMTP is its capability to transport mail
- across networks, usually referred to as "SMTP mail relaying" (see
- section 3.8). A network consists of the mutually-TCP-accessible
- hosts on the public Internet, the mutually-TCP-accessible hosts on a
- firewall-isolated TCP/IP Intranet, or hosts in some other LAN or WAN
- environment utilizing a non-TCP transport-level protocol. Using
-
- SMTP, a process can transfer mail to another process on the same
- network or to some other network via a relay or gateway process
- accessible to both networks.
-
- In this way, a mail message may pass through a number of intermediate
- relay or gateway hosts on its path from sender to ultimate recipient.
- The Mail eXchanger mechanisms of the domain name system [22, 27] (and
- section 5 of this document) are used to identify the appropriate
- next-hop destination for a message being transported.
-
-2. The SMTP Model
-
-2.1 Basic Structure
-
- The SMTP design can be pictured as:
-
- +----------+ +----------+
- +------+ | | | |
- | User |<-->| | SMTP | |
- +------+ | Client- |Commands/Replies| Server- |
- +------+ | SMTP |<-------------->| SMTP | +------+
- | File |<-->| | and Mail | |<-->| File |
- |System| | | | | |System|
- +------+ +----------+ +----------+ +------+
- SMTP client SMTP server
-
- When an SMTP client has a message to transmit, it establishes a two-
- way transmission channel to an SMTP server. The responsibility of an
- SMTP client is to transfer mail messages to one or more SMTP servers,
- or report its failure to do so.
-
- The means by which a mail message is presented to an SMTP client, and
- how that client determines the domain name(s) to which mail messages
- are to be transferred is a local matter, and is not addressed by this
- document. In some cases, the domain name(s) transferred to, or
- determined by, an SMTP client will identify the final destination(s)
- of the mail message. In other cases, common with SMTP clients
- associated with implementations of the POP [3, 26] or IMAP [6]
- protocols, or when the SMTP client is inside an isolated transport
- service environment, the domain name determined will identify an
- intermediate destination through which all mail messages are to be
- relayed. SMTP clients that transfer all traffic, regardless of the
- target domain names associated with the individual messages, or that
- do not maintain queues for retrying message transmissions that
- initially cannot be completed, may otherwise conform to this
- specification but are not considered fully-capable. Fully-capable
- SMTP implementations, including the relays used by these less capable
-
- ones, and their destinations, are expected to support all of the
- queuing, retrying, and alternate address functions discussed in this
- specification.
-
- The means by which an SMTP client, once it has determined a target
- domain name, determines the identity of an SMTP server to which a
- copy of a message is to be transferred, and then performs that
- transfer, is covered by this document. To effect a mail transfer to
- an SMTP server, an SMTP client establishes a two-way transmission
- channel to that SMTP server. An SMTP client determines the address
- of an appropriate host running an SMTP server by resolving a
- destination domain name to either an intermediate Mail eXchanger host
- or a final target host.
-
- An SMTP server may be either the ultimate destination or an
- intermediate "relay" (that is, it may assume the role of an SMTP
- client after receiving the message) or "gateway" (that is, it may
- transport the message further using some protocol other than SMTP).
- SMTP commands are generated by the SMTP client and sent to the SMTP
- server. SMTP replies are sent from the SMTP server to the SMTP
- client in response to the commands.
-
- In other words, message transfer can occur in a single connection
- between the original SMTP-sender and the final SMTP-recipient, or can
- occur in a series of hops through intermediary systems. In either
- case, a formal handoff of responsibility for the message occurs: the
- protocol requires that a server accept responsibility for either
- delivering a message or properly reporting the failure to do so.
-
- Once the transmission channel is established and initial handshaking
- completed, the SMTP client normally initiates a mail transaction.
- Such a transaction consists of a series of commands to specify the
- originator and destination of the mail and transmission of the
- message content (including any headers or other structure) itself.
- When the same message is sent to multiple recipients, this protocol
- encourages the transmission of only one copy of the data for all
- recipients at the same destination (or intermediate relay) host.
-
- The server responds to each command with a reply; replies may
- indicate that the command was accepted, that additional commands are
- expected, or that a temporary or permanent error condition exists.
- Commands specifying the sender or recipients may include server-
- permitted SMTP service extension requests as discussed in section
- 2.2. The dialog is purposely lock-step, one-at-a-time, although this
- can be modified by mutually-agreed extension requests such as command
- pipelining [13].
-
- Once a given mail message has been transmitted, the client may either
- request that the connection be shut down or may initiate other mail
- transactions. In addition, an SMTP client may use a connection to an
- SMTP server for ancillary services such as verification of email
- addresses or retrieval of mailing list subscriber addresses.
-
- As suggested above, this protocol provides mechanisms for the
- transmission of mail. This transmission normally occurs directly
- from the sending user's host to the receiving user's host when the
- two hosts are connected to the same transport service. When they are
- not connected to the same transport service, transmission occurs via
- one or more relay SMTP servers. An intermediate host that acts as
- either an SMTP relay or as a gateway into some other transmission
- environment is usually selected through the use of the domain name
- service (DNS) Mail eXchanger mechanism.
-
- Usually, intermediate hosts are determined via the DNS MX record, not
- by explicit "source" routing (see section 5 and appendices C and
- F.2).
-
-2.2 The Extension Model
-
-2.2.1 Background
-
- In an effort that started in 1990, approximately a decade after RFC
- 821 was completed, the protocol was modified with a "service
- extensions" model that permits the client and server to agree to
- utilize shared functionality beyond the original SMTP requirements.
- The SMTP extension mechanism defines a means whereby an extended SMTP
- client and server may recognize each other, and the server can inform
- the client as to the service extensions that it supports.
-
- Contemporary SMTP implementations MUST support the basic extension
- mechanisms. For instance, servers MUST support the EHLO command even
- if they do not implement any specific extensions and clients SHOULD
- preferentially utilize EHLO rather than HELO. (However, for
- compatibility with older conforming implementations, SMTP clients and
- servers MUST support the original HELO mechanisms as a fallback.)
- Unless the different characteristics of HELO must be identified for
- interoperability purposes, this document discusses only EHLO.
-
- SMTP is widely deployed and high-quality implementations have proven
- to be very robust. However, the Internet community now considers
- some services to be important that were not anticipated when the
- protocol was first designed. If support for those services is to be
- added, it must be done in a way that permits older implementations to
- continue working acceptably. The extension framework consists of:
-
- - The SMTP command EHLO, superseding the earlier HELO,
-
- - a registry of SMTP service extensions,
-
- - additional parameters to the SMTP MAIL and RCPT commands, and
-
- - optional replacements for commands defined in this protocol, such
- as for DATA in non-ASCII transmissions [33].
-
- SMTP's strength comes primarily from its simplicity. Experience with
- many protocols has shown that protocols with few options tend towards
- ubiquity, whereas protocols with many options tend towards obscurity.
-
- Each and every extension, regardless of its benefits, must be
- carefully scrutinized with respect to its implementation, deployment,
- and interoperability costs. In many cases, the cost of extending the
- SMTP service will likely outweigh the benefit.
-
-2.2.2 Definition and Registration of Extensions
-
- The IANA maintains a registry of SMTP service extensions. A
- corresponding EHLO keyword value is associated with each extension.
- Each service extension registered with the IANA must be defined in a
- formal standards-track or IESG-approved experimental protocol
- document. The definition must include:
-
- - the textual name of the SMTP service extension;
-
- - the EHLO keyword value associated with the extension;
-
- - the syntax and possible values of parameters associated with the
- EHLO keyword value;
-
- - any additional SMTP verbs associated with the extension
- (additional verbs will usually be, but are not required to be, the
- same as the EHLO keyword value);
-
- - any new parameters the extension associates with the MAIL or RCPT
- verbs;
-
- - a description of how support for the extension affects the
- behavior of a server and client SMTP; and,
-
- - the increment by which the extension is increasing the maximum
- length of the commands MAIL and/or RCPT, over that specified in
- this standard.
-
- In addition, any EHLO keyword value starting with an upper or lower
- case "X" refers to a local SMTP service extension used exclusively
- through bilateral agreement. Keywords beginning with "X" MUST NOT be
- used in a registered service extension. Conversely, keyword values
- presented in the EHLO response that do not begin with "X" MUST
- correspond to a standard, standards-track, or IESG-approved
- experimental SMTP service extension registered with IANA. A
- conforming server MUST NOT offer non-"X"-prefixed keyword values that
- are not described in a registered extension.
-
- Additional verbs and parameter names are bound by the same rules as
- EHLO keywords; specifically, verbs beginning with "X" are local
- extensions that may not be registered or standardized. Conversely,
- verbs not beginning with "X" must always be registered.
-
-2.3 Terminology
-
- The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
- "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
- document are to be interpreted as described below.
-
- 1. MUST This word, or the terms "REQUIRED" or "SHALL", mean that
- the definition is an absolute requirement of the specification.
-
- 2. MUST NOT This phrase, or the phrase "SHALL NOT", mean that the
- definition is an absolute prohibition of the specification.
-
- 3. SHOULD This word, or the adjective "RECOMMENDED", mean that
- there may exist valid reasons in particular circumstances to
- ignore a particular item, but the full implications must be
- understood and carefully weighed before choosing a different
- course.
-
- 4. SHOULD NOT This phrase, or the phrase "NOT RECOMMENDED" mean
- that there may exist valid reasons in particular circumstances
- when the particular behavior is acceptable or even useful, but the
- full implications should be understood and the case carefully
- weighed before implementing any behavior described with this
- label.
-
- 5. MAY This word, or the adjective "OPTIONAL", mean that an item is
- truly optional. One vendor may choose to include the item because
- a particular marketplace requires it or because the vendor feels
- that it enhances the product while another vendor may omit the
- same item. An implementation which does not include a particular
- option MUST be prepared to interoperate with another
- implementation which does include the option, though perhaps with
- reduced functionality. In the same vein an implementation which
-
- does include a particular option MUST be prepared to interoperate
- with another implementation which does not include the option
- (except, of course, for the feature the option provides.)
-
-2.3.1 Mail Objects
-
- SMTP transports a mail object. A mail object contains an envelope
- and content.
-
- The SMTP envelope is sent as a series of SMTP protocol units
- (described in section 3). It consists of an originator address (to
- which error reports should be directed); one or more recipient
- addresses; and optional protocol extension material. Historically,
- variations on the recipient address specification command (RCPT TO)
- could be used to specify alternate delivery modes, such as immediate
- display; those variations have now been deprecated (see appendix F,
- section F.6).
-
- The SMTP content is sent in the SMTP DATA protocol unit and has two
- parts: the headers and the body. If the content conforms to other
- contemporary standards, the headers form a collection of field/value
- pairs structured as in the message format specification [32]; the
- body, if structured, is defined according to MIME [12]. The content
- is textual in nature, expressed using the US-ASCII repertoire [1].
- Although SMTP extensions (such as "8BITMIME" [20]) may relax this
- restriction for the content body, the content headers are always
- encoded using the US-ASCII repertoire. A MIME extension [23] defines
- an algorithm for representing header values outside the US-ASCII
- repertoire, while still encoding them using the US-ASCII repertoire.
-
-2.3.2 Senders and Receivers
-
- In RFC 821, the two hosts participating in an SMTP transaction were
- described as the "SMTP-sender" and "SMTP-receiver". This document
- has been changed to reflect current industry terminology and hence
- refers to them as the "SMTP client" (or sometimes just "the client")
- and "SMTP server" (or just "the server"), respectively. Since a
- given host may act both as server and client in a relay situation,
- "receiver" and "sender" terminology is still used where needed for
- clarity.
-
-2.3.3 Mail Agents and Message Stores
-
- Additional mail system terminology became common after RFC 821 was
- published and, where convenient, is used in this specification. In
- particular, SMTP servers and clients provide a mail transport service
- and therefore act as "Mail Transfer Agents" (MTAs). "Mail User
- Agents" (MUAs or UAs) are normally thought of as the sources and
-
- targets of mail. At the source, an MUA might collect mail to be
- transmitted from a user and hand it off to an MTA; the final
- ("delivery") MTA would be thought of as handing the mail off to an
- MUA (or at least transferring responsibility to it, e.g., by
- depositing the message in a "message store"). However, while these
- terms are used with at least the appearance of great precision in
- other environments, the implied boundaries between MUAs and MTAs
- often do not accurately match common, and conforming, practices with
- Internet mail. Hence, the reader should be cautious about inferring
- the strong relationships and responsibilities that might be implied
- if these terms were used elsewhere.
-
-2.3.4 Host
-
- For the purposes of this specification, a host is a computer system
- attached to the Internet (or, in some cases, to a private TCP/IP
- network) and supporting the SMTP protocol. Hosts are known by names
- (see "domain"); identifying them by numerical address is discouraged.
-
-2.3.5 Domain
-
- A domain (or domain name) consists of one or more dot-separated
- components. These components ("labels" in DNS terminology [22]) are
- restricted for SMTP purposes to consist of a sequence of letters,
- digits, and hyphens drawn from the ASCII character set [1]. Domain
- names are used as names of hosts and of other entities in the domain
- name hierarchy. For example, a domain may refer to an alias (label
- of a CNAME RR) or the label of Mail eXchanger records to be used to
- deliver mail instead of representing a host name. See [22] and
- section 5 of this specification.
-
- The domain name, as described in this document and in [22], is the
- entire, fully-qualified name (often referred to as an "FQDN"). A
- domain name that is not in FQDN form is no more than a local alias.
- Local aliases MUST NOT appear in any SMTP transaction.
-
-2.3.6 Buffer and State Table
-
- SMTP sessions are stateful, with both parties carefully maintaining a
- common view of the current state. In this document we model this
- state by a virtual "buffer" and a "state table" on the server which
- may be used by the client to, for example, "clear the buffer" or
- "reset the state table," causing the information in the buffer to be
- discarded and the state to be returned to some previous state.
-
-2.3.7 Lines
-
- SMTP commands and, unless altered by a service extension, message
- data, are transmitted in "lines". Lines consist of zero or more data
- characters terminated by the sequence ASCII character "CR" (hex value
- 0D) followed immediately by ASCII character "LF" (hex value 0A).
- This termination sequence is denoted as <CRLF> in this document.
- Conforming implementations MUST NOT recognize or generate any other
- character or character sequence as a line terminator. Limits MAY be
- imposed on line lengths by servers (see section 4.5.3).
-
- In addition, the appearance of "bare" "CR" or "LF" characters in text
- (i.e., either without the other) has a long history of causing
- problems in mail implementations and applications that use the mail
- system as a tool. SMTP client implementations MUST NOT transmit
- these characters except when they are intended as line terminators
- and then MUST, as indicated above, transmit them only as a <CRLF>
- sequence.
-
-2.3.8 Originator, Delivery, Relay, and Gateway Systems
-
- This specification makes a distinction among four types of SMTP
- systems, based on the role those systems play in transmitting
- electronic mail. An "originating" system (sometimes called an SMTP
- originator) introduces mail into the Internet or, more generally,
- into a transport service environment. A "delivery" SMTP system is
- one that receives mail from a transport service environment and
- passes it to a mail user agent or deposits it in a message store
- which a mail user agent is expected to subsequently access. A
- "relay" SMTP system (usually referred to just as a "relay") receives
- mail from an SMTP client and transmits it, without modification to
- the message data other than adding trace information, to another SMTP
- server for further relaying or for delivery.
-
- A "gateway" SMTP system (usually referred to just as a "gateway")
- receives mail from a client system in one transport environment and
- transmits it to a server system in another transport environment.
- Differences in protocols or message semantics between the transport
- environments on either side of a gateway may require that the gateway
- system perform transformations to the message that are not permitted
- to SMTP relay systems. For the purposes of this specification,
- firewalls that rewrite addresses should be considered as gateways,
- even if SMTP is used on both sides of them (see [11]).
-
-2.3.9 Message Content and Mail Data
-
- The terms "message content" and "mail data" are used interchangeably
- in this document to describe the material transmitted after the DATA
- command is accepted and before the end of data indication is
- transmitted. Message content includes message headers and the
- possibly-structured message body. The MIME specification [12]
- provides the standard mechanisms for structured message bodies.
-
-2.3.10 Mailbox and Address
-
- As used in this specification, an "address" is a character string
- that identifies a user to whom mail will be sent or a location into
- which mail will be deposited. The term "mailbox" refers to that
- depository. The two terms are typically used interchangeably unless
- the distinction between the location in which mail is placed (the
- mailbox) and a reference to it (the address) is important. An
- address normally consists of user and domain specifications. The
- standard mailbox naming convention is defined to be "local-
- part at domain": contemporary usage permits a much broader set of
- applications than simple "user names". Consequently, and due to a
- long history of problems when intermediate hosts have attempted to
- optimize transport by modifying them, the local-part MUST be
- interpreted and assigned semantics only by the host specified in the
- domain part of the address.
-
-2.3.11 Reply
-
- An SMTP reply is an acknowledgment (positive or negative) sent from
- receiver to sender via the transmission channel in response to a
- command. The general form of a reply is a numeric completion code
- (indicating failure or success) usually followed by a text string.
- The codes are for use by programs and the text is usually intended
- for human users. Recent work [34] has specified further structuring
- of the reply strings, including the use of supplemental and more
- specific completion codes.
-
-2.4 General Syntax Principles and Transaction Model
-
- SMTP commands and replies have a rigid syntax. All commands begin
- with a command verb. All Replies begin with a three digit numeric
- code. In some commands and replies, arguments MUST follow the verb
- or reply code. Some commands do not accept arguments (after the
- verb), and some reply codes are followed, sometimes optionally, by
- free form text. In both cases, where text appears, it is separated
- from the verb or reply code by a space character. Complete
- definitions of commands and replies appear in section 4.
-
- Verbs and argument values (e.g., "TO:" or "to:" in the RCPT command
- and extension name keywords) are not case sensitive, with the sole
- exception in this specification of a mailbox local-part (SMTP
- Extensions may explicitly specify case-sensitive elements). That is,
- a command verb, an argument value other than a mailbox local-part,
- and free form text MAY be encoded in upper case, lower case, or any
- mixture of upper and lower case with no impact on its meaning. This
- is NOT true of a mailbox local-part. The local-part of a mailbox
- MUST BE treated as case sensitive. Therefore, SMTP implementations
- MUST take care to preserve the case of mailbox local-parts. Mailbox
- domains are not case sensitive. In particular, for some hosts the
- user "smith" is different from the user "Smith". However, exploiting
- the case sensitivity of mailbox local-parts impedes interoperability
- and is discouraged.
-
- A few SMTP servers, in violation of this specification (and RFC 821)
- require that command verbs be encoded by clients in upper case.
- Implementations MAY wish to employ this encoding to accommodate those
- servers.
-
- The argument field consists of a variable length character string
- ending with the end of the line, i.e., with the character sequence
- <CRLF>. The receiver will take no action until this sequence is
- received.
-
- The syntax for each command is shown with the discussion of that
- command. Common elements and parameters are shown in section 4.1.2.
-
- Commands and replies are composed of characters from the ASCII
- character set [1]. When the transport service provides an 8-bit byte
- (octet) transmission channel, each 7-bit character is transmitted
- right justified in an octet with the high order bit cleared to zero.
- More specifically, the unextended SMTP service provides seven bit
- transport only. An originating SMTP client which has not
- successfully negotiated an appropriate extension with a particular
- server MUST NOT transmit messages with information in the high-order
- bit of octets. If such messages are transmitted in violation of this
- rule, receiving SMTP servers MAY clear the high-order bit or reject
- the message as invalid. In general, a relay SMTP SHOULD assume that
- the message content it has received is valid and, assuming that the
- envelope permits doing so, relay it without inspecting that content.
- Of course, if the content is mislabeled and the data path cannot
- accept the actual content, this may result in ultimate delivery of a
- severely garbled message to the recipient. Delivery SMTP systems MAY
- reject ("bounce") such messages rather than deliver them. No sending
- SMTP system is permitted to send envelope commands in any character
-
- set other than US-ASCII; receiving systems SHOULD reject such
- commands, normally using "500 syntax error - invalid character"
- replies.
-
- Eight-bit message content transmission MAY be requested of the server
- by a client using extended SMTP facilities, notably the "8BITMIME"
- extension [20]. 8BITMIME SHOULD be supported by SMTP servers.
- However, it MUST not be construed as authorization to transmit
- unrestricted eight bit material. 8BITMIME MUST NOT be requested by
- senders for material with the high bit on that is not in MIME format
- with an appropriate content-transfer encoding; servers MAY reject
- such messages.
-
- The metalinguistic notation used in this document corresponds to the
- "Augmented BNF" used in other Internet mail system documents. The
- reader who is not familiar with that syntax should consult the ABNF
- specification [8]. Metalanguage terms used in running text are
- surrounded by pointed brackets (e.g., <CRLF>) for clarity.
-
-3. The SMTP Procedures: An Overview
-
- This section contains descriptions of the procedures used in SMTP:
- session initiation, the mail transaction, forwarding mail, verifying
- mailbox names and expanding mailing lists, and the opening and
- closing exchanges. Comments on relaying, a note on mail domains, and
- a discussion of changing roles are included at the end of this
- section. Several complete scenarios are presented in appendix D.
-
-3.1 Session Initiation
-
- An SMTP session is initiated when a client opens a connection to a
- server and the server responds with an opening message.
-
- SMTP server implementations MAY include identification of their
- software and version information in the connection greeting reply
- after the 220 code, a practice that permits more efficient isolation
- and repair of any problems. Implementations MAY make provision for
- SMTP servers to disable the software and version announcement where
- it causes security concerns. While some systems also identify their
- contact point for mail problems, this is not a substitute for
- maintaining the required "postmaster" address (see section 4.5.1).
-
- The SMTP protocol allows a server to formally reject a transaction
- while still allowing the initial connection as follows: a 554
- response MAY be given in the initial connection opening message
- instead of the 220. A server taking this approach MUST still wait
- for the client to send a QUIT (see section 4.1.1.10) before closing
- the connection and SHOULD respond to any intervening commands with
-
- "503 bad sequence of commands". Since an attempt to make an SMTP
- connection to such a system is probably in error, a server returning
- a 554 response on connection opening SHOULD provide enough
- information in the reply text to facilitate debugging of the sending
- system.
-
-3.2 Client Initiation
-
- Once the server has sent the welcoming message and the client has
- received it, the client normally sends the EHLO command to the
- server, indicating the client's identity. In addition to opening the
- session, use of EHLO indicates that the client is able to process
- service extensions and requests that the server provide a list of the
- extensions it supports. Older SMTP systems which are unable to
- support service extensions and contemporary clients which do not
- require service extensions in the mail session being initiated, MAY
- use HELO instead of EHLO. Servers MUST NOT return the extended
- EHLO-style response to a HELO command. For a particular connection
- attempt, if the server returns a "command not recognized" response to
- EHLO, the client SHOULD be able to fall back and send HELO.
-
- In the EHLO command the host sending the command identifies itself;
- the command may be interpreted as saying "Hello, I am <domain>" (and,
- in the case of EHLO, "and I support service extension requests").
-
-3.3 Mail Transactions
-
- There are three steps to SMTP mail transactions. The transaction
- starts with a MAIL command which gives the sender identification.
- (In general, the MAIL command may be sent only when no mail
- transaction is in progress; see section 4.1.4.) A series of one or
- more RCPT commands follows giving the receiver information. Then a
- DATA command initiates transfer of the mail data and is terminated by
- the "end of mail" data indicator, which also confirms the
- transaction.
-
- The first step in the procedure is the MAIL command.
-
- MAIL FROM:<reverse-path> [SP <mail-parameters> ] <CRLF>
-
- This command tells the SMTP-receiver that a new mail transaction is
- starting and to reset all its state tables and buffers, including any
- recipients or mail data. The <reverse-path> portion of the first or
- only argument contains the source mailbox (between "<" and ">"
- brackets), which can be used to report errors (see section 4.2 for a
- discussion of error reporting). If accepted, the SMTP server returns
- a 250 OK reply. If the mailbox specification is not acceptable for
- some reason, the server MUST return a reply indicating whether the
-
- failure is permanent (i.e., will occur again if the client tries to
- send the same address again) or temporary (i.e., the address might be
- accepted if the client tries again later). Despite the apparent
- scope of this requirement, there are circumstances in which the
- acceptability of the reverse-path may not be determined until one or
- more forward-paths (in RCPT commands) can be examined. In those
- cases, the server MAY reasonably accept the reverse-path (with a 250
- reply) and then report problems after the forward-paths are received
- and examined. Normally, failures produce 550 or 553 replies.
-
- Historically, the <reverse-path> can contain more than just a
- mailbox, however, contemporary systems SHOULD NOT use source routing
- (see appendix C).
-
- The optional <mail-parameters> are associated with negotiated SMTP
- service extensions (see section 2.2).
-
- The second step in the procedure is the RCPT command.
-
- RCPT TO:<forward-path> [ SP <rcpt-parameters> ] <CRLF>
-
- The first or only argument to this command includes a forward-path
- (normally a mailbox and domain, always surrounded by "<" and ">"
- brackets) identifying one recipient. If accepted, the SMTP server
- returns a 250 OK reply and stores the forward-path. If the recipient
- is known not to be a deliverable address, the SMTP server returns a
- 550 reply, typically with a string such as "no such user - " and the
- mailbox name (other circumstances and reply codes are possible).
- This step of the procedure can be repeated any number of times.
-
- The <forward-path> can contain more than just a mailbox.
- Historically, the <forward-path> can be a source routing list of
- hosts and the destination mailbox, however, contemporary SMTP clients
- SHOULD NOT utilize source routes (see appendix C). Servers MUST be
- prepared to encounter a list of source routes in the forward path,
- but SHOULD ignore the routes or MAY decline to support the relaying
- they imply. Similarly, servers MAY decline to accept mail that is
- destined for other hosts or systems. These restrictions make a
- server useless as a relay for clients that do not support full SMTP
- functionality. Consequently, restricted-capability clients MUST NOT
- assume that any SMTP server on the Internet can be used as their mail
- processing (relaying) site. If a RCPT command appears without a
- previous MAIL command, the server MUST return a 503 "Bad sequence of
- commands" response. The optional <rcpt-parameters> are associated
- with negotiated SMTP service extensions (see section 2.2).
-
- The third step in the procedure is the DATA command (or some
- alternative specified in a service extension).
-
- DATA <CRLF>
-
- If accepted, the SMTP server returns a 354 Intermediate reply and
- considers all succeeding lines up to but not including the end of
- mail data indicator to be the message text. When the end of text is
- successfully received and stored the SMTP-receiver sends a 250 OK
- reply.
-
- Since the mail data is sent on the transmission channel, the end of
- mail data must be indicated so that the command and reply dialog can
- be resumed. SMTP indicates the end of the mail data by sending a
- line containing only a "." (period or full stop). A transparency
- procedure is used to prevent this from interfering with the user's
- text (see section 4.5.2).
-
- The end of mail data indicator also confirms the mail transaction and
- tells the SMTP server to now process the stored recipients and mail
- data. If accepted, the SMTP server returns a 250 OK reply. The DATA
- command can fail at only two points in the protocol exchange:
-
- - If there was no MAIL, or no RCPT, command, or all such commands
- were rejected, the server MAY return a "command out of sequence"
- (503) or "no valid recipients" (554) reply in response to the DATA
- command. If one of those replies (or any other 5yz reply) is
- received, the client MUST NOT send the message data; more
- generally, message data MUST NOT be sent unless a 354 reply is
- received.
-
- - If the verb is initially accepted and the 354 reply issued, the
- DATA command should fail only if the mail transaction was
- incomplete (for example, no recipients), or if resources were
- unavailable (including, of course, the server unexpectedly
- becoming unavailable), or if the server determines that the
- message should be rejected for policy or other reasons.
-
- However, in practice, some servers do not perform recipient
- verification until after the message text is received. These servers
- SHOULD treat a failure for one or more recipients as a "subsequent
- failure" and return a mail message as discussed in section 6. Using
- a "550 mailbox not found" (or equivalent) reply code after the data
- are accepted makes it difficult or impossible for the client to
- determine which recipients failed.
-
- When RFC 822 format [7, 32] is being used, the mail data include the
- memo header items such as Date, Subject, To, Cc, From. Server SMTP
- systems SHOULD NOT reject messages based on perceived defects in the
- RFC 822 or MIME [12] message header or message body. In particular,
-
- they MUST NOT reject messages in which the numbers of Resent-fields
- do not match or Resent-to appears without Resent-from and/or Resent-
- date.
-
- Mail transaction commands MUST be used in the order discussed above.
-
-3.4 Forwarding for Address Correction or Updating
-
- Forwarding support is most often required to consolidate and simplify
- addresses within, or relative to, some enterprise and less frequently
- to establish addresses to link a person's prior address with current
- one. Silent forwarding of messages (without server notification to
- the sender), for security or non-disclosure purposes, is common in
- the contemporary Internet.
-
- In both the enterprise and the "new address" cases, information
- hiding (and sometimes security) considerations argue against exposure
- of the "final" address through the SMTP protocol as a side-effect of
- the forwarding activity. This may be especially important when the
- final address may not even be reachable by the sender. Consequently,
- the "forwarding" mechanisms described in section 3.2 of RFC 821, and
- especially the 251 (corrected destination) and 551 reply codes from
- RCPT must be evaluated carefully by implementers and, when they are
- available, by those configuring systems.
-
- In particular:
-
- * Servers MAY forward messages when they are aware of an address
- change. When they do so, they MAY either provide address-updating
- information with a 251 code, or may forward "silently" and return
- a 250 code. But, if a 251 code is used, they MUST NOT assume that
- the client will actually update address information or even return
- that information to the user.
-
- Alternately,
-
- * Servers MAY reject or bounce messages when they are not
- deliverable when addressed. When they do so, they MAY either
- provide address-updating information with a 551 code, or may
- reject the message as undeliverable with a 550 code and no
- address-specific information. But, if a 551 code is used, they
- MUST NOT assume that the client will actually update address
- information or even return that information to the user.
-
- SMTP server implementations that support the 251 and/or 551 reply
- codes are strongly encouraged to provide configuration mechanisms so
- that sites which conclude that they would undesirably disclose
- information can disable or restrict their use.
-
-3.5 Commands for Debugging Addresses
-
-3.5.1 Overview
-
- SMTP provides commands to verify a user name or obtain the content of
- a mailing list. This is done with the VRFY and EXPN commands, which
- have character string arguments. Implementations SHOULD support VRFY
- and EXPN (however, see section 3.5.2 and 7.3).
-
- For the VRFY command, the string is a user name or a user name and
- domain (see below). If a normal (i.e., 250) response is returned,
- the response MAY include the full name of the user and MUST include
- the mailbox of the user. It MUST be in either of the following
- forms:
-
- User Name <local-part at domain>
- local-part at domain
-
- When a name that is the argument to VRFY could identify more than one
- mailbox, the server MAY either note the ambiguity or identify the
- alternatives. In other words, any of the following are legitimate
- response to VRFY:
-
- 553 User ambiguous
-
- or
-
- 553- Ambiguous; Possibilities are
- 553-Joe Smith <jsmith at foo.com>
- 553-Harry Smith <hsmith at foo.com>
- 553 Melvin Smith <dweep at foo.com>
-
- or
-
- 553-Ambiguous; Possibilities
- 553- <jsmith at foo.com>
- 553- <hsmith at foo.com>
- 553 <dweep at foo.com>
-
- Under normal circumstances, a client receiving a 553 reply would be
- expected to expose the result to the user. Use of exactly the forms
- given, and the "user ambiguous" or "ambiguous" keywords, possibly
- supplemented by extended reply codes such as those described in [34],
- will facilitate automated translation into other languages as needed.
- Of course, a client that was highly automated or that was operating
- in another language than English, might choose to try to translate
- the response, to return some other indication to the user than the
-
- literal text of the reply, or to take some automated action such as
- consulting a directory service for additional information before
- reporting to the user.
-
- For the EXPN command, the string identifies a mailing list, and the
- successful (i.e., 250) multiline response MAY include the full name
- of the users and MUST give the mailboxes on the mailing list.
-
- In some hosts the distinction between a mailing list and an alias for
- a single mailbox is a bit fuzzy, since a common data structure may
- hold both types of entries, and it is possible to have mailing lists
- containing only one mailbox. If a request is made to apply VRFY to a
- mailing list, a positive response MAY be given if a message so
- addressed would be delivered to everyone on the list, otherwise an
- error SHOULD be reported (e.g., "550 That is a mailing list, not a
- user" or "252 Unable to verify members of mailing list"). If a
- request is made to expand a user name, the server MAY return a
- positive response consisting of a list containing one name, or an
- error MAY be reported (e.g., "550 That is a user name, not a mailing
- list").
-
- In the case of a successful multiline reply (normal for EXPN) exactly
- one mailbox is to be specified on each line of the reply. The case
- of an ambiguous request is discussed above.
-
- "User name" is a fuzzy term and has been used deliberately. An
- implementation of the VRFY or EXPN commands MUST include at least
- recognition of local mailboxes as "user names". However, since
- current Internet practice often results in a single host handling
- mail for multiple domains, hosts, especially hosts that provide this
- functionality, SHOULD accept the "local-part at domain" form as a "user
- name"; hosts MAY also choose to recognize other strings as "user
- names".
-
- The case of expanding a mailbox list requires a multiline reply, such
- as:
-
- C: EXPN Example-People
- S: 250-Jon Postel <Postel at isi.edu>
- S: 250-Fred Fonebone <Fonebone at physics.foo-u.edu>
- S: 250 Sam Q. Smith <SQSmith at specific.generic.com>
-
- or
-
- C: EXPN Executive-Washroom-List
- S: 550 Access Denied to You.
-
- The character string arguments of the VRFY and EXPN commands cannot
- be further restricted due to the variety of implementations of the
- user name and mailbox list concepts. On some systems it may be
- appropriate for the argument of the EXPN command to be a file name
- for a file containing a mailing list, but again there are a variety
- of file naming conventions in the Internet. Similarly, historical
- variations in what is returned by these commands are such that the
- response SHOULD be interpreted very carefully, if at all, and SHOULD
- generally only be used for diagnostic purposes.
-
-3.5.2 VRFY Normal Response
-
- When normal (2yz or 551) responses are returned from a VRFY or EXPN
- request, the reply normally includes the mailbox name, i.e.,
- "<local-part at domain>", where "domain" is a fully qualified domain
- name, MUST appear in the syntax. In circumstances exceptional enough
- to justify violating the intent of this specification, free-form text
- MAY be returned. In order to facilitate parsing by both computers
- and people, addresses SHOULD appear in pointed brackets. When
- addresses, rather than free-form debugging information, are returned,
- EXPN and VRFY MUST return only valid domain addresses that are usable
- in SMTP RCPT commands. Consequently, if an address implies delivery
- to a program or other system, the mailbox name used to reach that
- target MUST be given. Paths (explicit source routes) MUST NOT be
- returned by VRFY or EXPN.
-
- Server implementations SHOULD support both VRFY and EXPN. For
- security reasons, implementations MAY provide local installations a
- way to disable either or both of these commands through configuration
- options or the equivalent. When these commands are supported, they
- are not required to work across relays when relaying is supported.
- Since they were both optional in RFC 821, they MUST be listed as
- service extensions in an EHLO response, if they are supported.
-
-3.5.3 Meaning of VRFY or EXPN Success Response
-
- A server MUST NOT return a 250 code in response to a VRFY or EXPN
- command unless it has actually verified the address. In particular,
- a server MUST NOT return 250 if all it has done is to verify that the
- syntax given is valid. In that case, 502 (Command not implemented)
- or 500 (Syntax error, command unrecognized) SHOULD be returned. As
- stated elsewhere, implementation (in the sense of actually validating
- addresses and returning information) of VRFY and EXPN are strongly
- recommended. Hence, implementations that return 500 or 502 for VRFY
- are not in full compliance with this specification.
-
- There may be circumstances where an address appears to be valid but
- cannot reasonably be verified in real time, particularly when a
- server is acting as a mail exchanger for another server or domain.
- "Apparent validity" in this case would normally involve at least
- syntax checking and might involve verification that any domains
- specified were ones to which the host expected to be able to relay
- mail. In these situations, reply code 252 SHOULD be returned. These
- cases parallel the discussion of RCPT verification discussed in
- section 2.1. Similarly, the discussion in section 3.4 applies to the
- use of reply codes 251 and 551 with VRFY (and EXPN) to indicate
- addresses that are recognized but that would be forwarded or bounced
- were mail received for them. Implementations generally SHOULD be
- more aggressive about address verification in the case of VRFY than
- in the case of RCPT, even if it takes a little longer to do so.
-
-3.5.4 Semantics and Applications of EXPN
-
- EXPN is often very useful in debugging and understanding problems
- with mailing lists and multiple-target-address aliases. Some systems
- have attempted to use source expansion of mailing lists as a means of
- eliminating duplicates. The propagation of aliasing systems with
- mail on the Internet, for hosts (typically with MX and CNAME DNS
- records), for mailboxes (various types of local host aliases), and in
- various proxying arrangements, has made it nearly impossible for
- these strategies to work consistently, and mail systems SHOULD NOT
- attempt them.
-
-3.6 Domains
-
- Only resolvable, fully-qualified, domain names (FQDNs) are permitted
- when domain names are used in SMTP. In other words, names that can
- be resolved to MX RRs or A RRs (as discussed in section 5) are
- permitted, as are CNAME RRs whose targets can be resolved, in turn,
- to MX or A RRs. Local nicknames or unqualified names MUST NOT be
- used. There are two exceptions to the rule requiring FQDNs:
-
- - The domain name given in the EHLO command MUST BE either a primary
- host name (a domain name that resolves to an A RR) or, if the host
- has no name, an address literal as described in section 4.1.1.1.
-
- - The reserved mailbox name "postmaster" may be used in a RCPT
- command without domain qualification (see section 4.1.1.3) and
- MUST be accepted if so used.
-
-3.7 Relaying
-
- In general, the availability of Mail eXchanger records in the domain
- name system [22, 27] makes the use of explicit source routes in the
- Internet mail system unnecessary. Many historical problems with
- their interpretation have made their use undesirable. SMTP clients
- SHOULD NOT generate explicit source routes except under unusual
- circumstances. SMTP servers MAY decline to act as mail relays or to
- accept addresses that specify source routes. When route information
- is encountered, SMTP servers are also permitted to ignore the route
- information and simply send to the final destination specified as the
- last element in the route and SHOULD do so. There has been an
- invalid practice of using names that do not appear in the DNS as
- destination names, with the senders counting on the intermediate
- hosts specified in source routing to resolve any problems. If source
- routes are stripped, this practice will cause failures. This is one
- of several reasons why SMTP clients MUST NOT generate invalid source
- routes or depend on serial resolution of names.
-
- When source routes are not used, the process described in RFC 821 for
- constructing a reverse-path from the forward-path is not applicable
- and the reverse-path at the time of delivery will simply be the
- address that appeared in the MAIL command.
-
- A relay SMTP server is usually the target of a DNS MX record that
- designates it, rather than the final delivery system. The relay
- server may accept or reject the task of relaying the mail in the same
- way it accepts or rejects mail for a local user. If it accepts the
- task, it then becomes an SMTP client, establishes a transmission
- channel to the next SMTP server specified in the DNS (according to
- the rules in section 5), and sends it the mail. If it declines to
- relay mail to a particular address for policy reasons, a 550 response
- SHOULD be returned.
-
- Many mail-sending clients exist, especially in conjunction with
- facilities that receive mail via POP3 or IMAP, that have limited
- capability to support some of the requirements of this specification,
- such as the ability to queue messages for subsequent delivery
- attempts. For these clients, it is common practice to make private
- arrangements to send all messages to a single server for processing
- and subsequent distribution. SMTP, as specified here, is not ideally
- suited for this role, and work is underway on standardized mail
- submission protocols that might eventually supercede the current
- practices. In any event, because these arrangements are private and
- fall outside the scope of this specification, they are not described
- here.
-
- It is important to note that MX records can point to SMTP servers
- which act as gateways into other environments, not just SMTP relays
- and final delivery systems; see sections 3.8 and 5.
-
- If an SMTP server has accepted the task of relaying the mail and
- later finds that the destination is incorrect or that the mail cannot
- be delivered for some other reason, then it MUST construct an
- "undeliverable mail" notification message and send it to the
- originator of the undeliverable mail (as indicated by the reverse-
- path). Formats specified for non-delivery reports by other standards
- (see, for example, [24, 25]) SHOULD be used if possible.
-
- This notification message must be from the SMTP server at the relay
- host or the host that first determines that delivery cannot be
- accomplished. Of course, SMTP servers MUST NOT send notification
- messages about problems transporting notification messages. One way
- to prevent loops in error reporting is to specify a null reverse-path
- in the MAIL command of a notification message. When such a message
- is transmitted the reverse-path MUST be set to null (see section
- 4.5.5 for additional discussion). A MAIL command with a null
- reverse-path appears as follows:
-
- MAIL FROM:<>
-
- As discussed in section 2.4.1, a relay SMTP has no need to inspect or
- act upon the headers or body of the message data and MUST NOT do so
- except to add its own "Received:" header (section 4.4) and,
- optionally, to attempt to detect looping in the mail system (see
- section 6.2).
-
-3.8 Mail Gatewaying
-
- While the relay function discussed above operates within the Internet
- SMTP transport service environment, MX records or various forms of
- explicit routing may require that an intermediate SMTP server perform
- a translation function between one transport service and another. As
- discussed in section 2.3.8, when such a system is at the boundary
- between two transport service environments, we refer to it as a
- "gateway" or "gateway SMTP".
-
- Gatewaying mail between different mail environments, such as
- different mail formats and protocols, is complex and does not easily
- yield to standardization. However, some general requirements may be
- given for a gateway between the Internet and another mail
- environment.
-
-3.8.1 Header Fields in Gatewaying
-
- Header fields MAY be rewritten when necessary as messages are
- gatewayed across mail environment boundaries. This may involve
- inspecting the message body or interpreting the local-part of the
- destination address in spite of the prohibitions in section 2.4.1.
-
- Other mail systems gatewayed to the Internet often use a subset of
- RFC 822 headers or provide similar functionality with a different
- syntax, but some of these mail systems do not have an equivalent to
- the SMTP envelope. Therefore, when a message leaves the Internet
- environment, it may be necessary to fold the SMTP envelope
- information into the message header. A possible solution would be to
- create new header fields to carry the envelope information (e.g.,
- "X-SMTP-MAIL:" and "X-SMTP-RCPT:"); however, this would require
- changes in mail programs in foreign environments and might risk
- disclosure of private information (see section 7.2).
-
-3.8.2 Received Lines in Gatewaying
-
- When forwarding a message into or out of the Internet environment, a
- gateway MUST prepend a Received: line, but it MUST NOT alter in any
- way a Received: line that is already in the header.
-
- "Received:" fields of messages originating from other environments
- may not conform exactly to this specification. However, the most
- important use of Received: lines is for debugging mail faults, and
- this debugging can be severely hampered by well-meaning gateways that
- try to "fix" a Received: line. As another consequence of trace
- fields arising in non-SMTP environments, receiving systems MUST NOT
- reject mail based on the format of a trace field and SHOULD be
- extremely robust in the light of unexpected information or formats in
- those fields.
-
- The gateway SHOULD indicate the environment and protocol in the "via"
- clauses of Received field(s) that it supplies.
-
-3.8.3 Addresses in Gatewaying
-
- From the Internet side, the gateway SHOULD accept all valid address
- formats in SMTP commands and in RFC 822 headers, and all valid RFC
- 822 messages. Addresses and headers generated by gateways MUST
- conform to applicable Internet standards (including this one and RFC
- 822). Gateways are, of course, subject to the same rules for
- handling source routes as those described for other SMTP systems in
- section 3.3.
-
-3.8.4 Other Header Fields in Gatewaying
-
- The gateway MUST ensure that all header fields of a message that it
- forwards into the Internet mail environment meet the requirements for
- Internet mail. In particular, all addresses in "From:", "To:",
- "Cc:", etc., fields MUST be transformed (if necessary) to satisfy RFC
- 822 syntax, MUST reference only fully-qualified domain names, and
- MUST be effective and useful for sending replies. The translation
- algorithm used to convert mail from the Internet protocols to another
- environment's protocol SHOULD ensure that error messages from the
- foreign mail environment are delivered to the return path from the
- SMTP envelope, not to the sender listed in the "From:" field (or
- other fields) of the RFC 822 message.
-
-3.8.5 Envelopes in Gatewaying
-
- Similarly, when forwarding a message from another environment into
- the Internet, the gateway SHOULD set the envelope return path in
- accordance with an error message return address, if supplied by the
- foreign environment. If the foreign environment has no equivalent
- concept, the gateway must select and use a best approximation, with
- the message originator's address as the default of last resort.
-
-3.9 Terminating Sessions and Connections
-
- An SMTP connection is terminated when the client sends a QUIT
- command. The server responds with a positive reply code, after which
- it closes the connection.
-
- An SMTP server MUST NOT intentionally close the connection except:
-
- - After receiving a QUIT command and responding with a 221 reply.
-
- - After detecting the need to shut down the SMTP service and
- returning a 421 response code. This response code can be issued
- after the server receives any command or, if necessary,
- asynchronously from command receipt (on the assumption that the
- client will receive it after the next command is issued).
-
- In particular, a server that closes connections in response to
- commands that are not understood is in violation of this
- specification. Servers are expected to be tolerant of unknown
- commands, issuing a 500 reply and awaiting further instructions from
- the client.
-
- An SMTP server which is forcibly shut down via external means SHOULD
- attempt to send a line containing a 421 response code to the SMTP
- client before exiting. The SMTP client will normally read the 421
- response code after sending its next command.
-
- SMTP clients that experience a connection close, reset, or other
- communications failure due to circumstances not under their control
- (in violation of the intent of this specification but sometimes
- unavoidable) SHOULD, to maintain the robustness of the mail system,
- treat the mail transaction as if a 451 response had been received and
- act accordingly.
-
-3.10 Mailing Lists and Aliases
-
- An SMTP-capable host SHOULD support both the alias and the list
- models of address expansion for multiple delivery. When a message is
- delivered or forwarded to each address of an expanded list form, the
- return address in the envelope ("MAIL FROM:") MUST be changed to be
- the address of a person or other entity who administers the list.
- However, in this case, the message header [32] MUST be left
- unchanged; in particular, the "From" field of the message header is
- unaffected.
-
- An important mail facility is a mechanism for multi-destination
- delivery of a single message, by transforming (or "expanding" or
- "exploding") a pseudo-mailbox address into a list of destination
- mailbox addresses. When a message is sent to such a pseudo-mailbox
- (sometimes called an "exploder"), copies are forwarded or
- redistributed to each mailbox in the expanded list. Servers SHOULD
- simply utilize the addresses on the list; application of heuristics
- or other matching rules to eliminate some addresses, such as that of
- the originator, is strongly discouraged. We classify such a pseudo-
- mailbox as an "alias" or a "list", depending upon the expansion
- rules.
-
-3.10.1 Alias
-
- To expand an alias, the recipient mailer simply replaces the pseudo-
- mailbox address in the envelope with each of the expanded addresses
- in turn; the rest of the envelope and the message body are left
- unchanged. The message is then delivered or forwarded to each
- expanded address.
-
-3.10.2 List
-
- A mailing list may be said to operate by "redistribution" rather than
- by "forwarding". To expand a list, the recipient mailer replaces the
- pseudo-mailbox address in the envelope with all of the expanded
-
- addresses. The return address in the envelope is changed so that all
- error messages generated by the final deliveries will be returned to
- a list administrator, not to the message originator, who generally
- has no control over the contents of the list and will typically find
- error messages annoying.
-
-4. The SMTP Specifications
-
-4.1 SMTP Commands
-
-4.1.1 Command Semantics and Syntax
-
- The SMTP commands define the mail transfer or the mail system
- function requested by the user. SMTP commands are character strings
- terminated by <CRLF>. The commands themselves are alphabetic
- characters terminated by <SP> if parameters follow and <CRLF>
- otherwise. (In the interest of improved interoperability, SMTP
- receivers are encouraged to tolerate trailing white space before the
- terminating <CRLF>.) The syntax of the local part of a mailbox must
- conform to receiver site conventions and the syntax specified in
- section 4.1.2. The SMTP commands are discussed below. The SMTP
- replies are discussed in section 4.2.
-
- A mail transaction involves several data objects which are
- communicated as arguments to different commands. The reverse-path is
- the argument of the MAIL command, the forward-path is the argument of
- the RCPT command, and the mail data is the argument of the DATA
- command. These arguments or data objects must be transmitted and
- held pending the confirmation communicated by the end of mail data
- indication which finalizes the transaction. The model for this is
- that distinct buffers are provided to hold the types of data objects,
- that is, there is a reverse-path buffer, a forward-path buffer, and a
- mail data buffer. Specific commands cause information to be appended
- to a specific buffer, or cause one or more buffers to be cleared.
-
- Several commands (RSET, DATA, QUIT) are specified as not permitting
- parameters. In the absence of specific extensions offered by the
- server and accepted by the client, clients MUST NOT send such
- parameters and servers SHOULD reject commands containing them as
- having invalid syntax.
-
-4.1.1.1 Extended HELLO (EHLO) or HELLO (HELO)
-
- These commands are used to identify the SMTP client to the SMTP
- server. The argument field contains the fully-qualified domain name
- of the SMTP client if one is available. In situations in which the
- SMTP client system does not have a meaningful domain name (e.g., when
- its address is dynamically allocated and no reverse mapping record is
-
- available), the client SHOULD send an address literal (see section
- 4.1.3), optionally followed by information that will help to identify
- the client system. y The SMTP server identifies itself to the SMTP
- client in the connection greeting reply and in the response to this
- command.
-
- A client SMTP SHOULD start an SMTP session by issuing the EHLO
- command. If the SMTP server supports the SMTP service extensions it
- will give a successful response, a failure response, or an error
- response. If the SMTP server, in violation of this specification,
- does not support any SMTP service extensions it will generate an
- error response. Older client SMTP systems MAY, as discussed above,
- use HELO (as specified in RFC 821) instead of EHLO, and servers MUST
- support the HELO command and reply properly to it. In any event, a
- client MUST issue HELO or EHLO before starting a mail transaction.
-
- These commands, and a "250 OK" reply to one of them, confirm that
- both the SMTP client and the SMTP server are in the initial state,
- that is, there is no transaction in progress and all state tables and
- buffers are cleared.
-
- Syntax:
-
- ehlo = "EHLO" SP Domain CRLF
- helo = "HELO" SP Domain CRLF
-
- Normally, the response to EHLO will be a multiline reply. Each line
- of the response contains a keyword and, optionally, one or more
- parameters. Following the normal syntax for multiline replies, these
- keyworks follow the code (250) and a hyphen for all but the last
- line, and the code and a space for the last line. The syntax for a
- positive response, using the ABNF notation and terminal symbols of
- [8], is:
-
- ehlo-ok-rsp = ( "250" domain [ SP ehlo-greet ] CRLF )
- / ( "250-" domain [ SP ehlo-greet ] CRLF
- *( "250-" ehlo-line CRLF )
- "250" SP ehlo-line CRLF )
-
- ehlo-greet = 1*(%d0-9 / %d11-12 / %d14-127)
- ; string of any characters other than CR or LF
-
- ehlo-line = ehlo-keyword *( SP ehlo-param )
-
- ehlo-keyword = (ALPHA / DIGIT) *(ALPHA / DIGIT / "-")
- ; additional syntax of ehlo-params depends on
- ; ehlo-keyword
-
- ehlo-param = 1*(%d33-127)
- ; any CHAR excluding <SP> and all
- ; control characters (US-ASCII 0-31 inclusive)
-
- Although EHLO keywords may be specified in upper, lower, or mixed
- case, they MUST always be recognized and processed in a case-
- insensitive manner. This is simply an extension of practices
- specified in RFC 821 and section 2.4.1.
-
-4.1.1.2 MAIL (MAIL)
-
- This command is used to initiate a mail transaction in which the mail
- data is delivered to an SMTP server which may, in turn, deliver it to
- one or more mailboxes or pass it on to another system (possibly using
- SMTP). The argument field contains a reverse-path and may contain
- optional parameters. In general, the MAIL command may be sent only
- when no mail transaction is in progress, see section 4.1.4.
-
- The reverse-path consists of the sender mailbox. Historically, that
- mailbox might optionally have been preceded by a list of hosts, but
- that behavior is now deprecated (see appendix C). In some types of
- reporting messages for which a reply is likely to cause a mail loop
- (for example, mail delivery and nondelivery notifications), the
- reverse-path may be null (see section 3.7).
-
- This command clears the reverse-path buffer, the forward-path buffer,
- and the mail data buffer; and inserts the reverse-path information
- from this command into the reverse-path buffer.
-
- If service extensions were negotiated, the MAIL command may also
- carry parameters associated with a particular service extension.
-
- Syntax:
-
- "MAIL FROM:" ("<>" / Reverse-Path)
- [SP Mail-parameters] CRLF
-
-4.1.1.3 RECIPIENT (RCPT)
-
- This command is used to identify an individual recipient of the mail
- data; multiple recipients are specified by multiple use of this
- command. The argument field contains a forward-path and may contain
- optional parameters.
-
- The forward-path normally consists of the required destination
- mailbox. Sending systems SHOULD not generate the optional list of
- hosts known as a source route. Receiving systems MUST recognize
-
- source route syntax but SHOULD strip off the source route
- specification and utilize the domain name associated with the mailbox
- as if the source route had not been provided.
-
- Similarly, relay hosts SHOULD strip or ignore source routes, and
- names MUST NOT be copied into the reverse-path. When mail reaches
- its ultimate destination (the forward-path contains only a
- destination mailbox), the SMTP server inserts it into the destination
- mailbox in accordance with its host mail conventions.
-
- For example, mail received at relay host xyz.com with envelope
- commands
-
- MAIL FROM:<userx at y.foo.org>
- RCPT TO:<@hosta.int, at jkl.org:userc at d.bar.org>
-
- will normally be sent directly on to host d.bar.org with envelope
- commands
-
- MAIL FROM:<userx at y.foo.org>
- RCPT TO:<userc at d.bar.org>
-
- As provided in appendix C, xyz.com MAY also choose to relay the
- message to hosta.int, using the envelope commands
-
- MAIL FROM:<userx at y.foo.org>
- RCPT TO:<@hosta.int, at jkl.org:userc at d.bar.org>
-
- or to jkl.org, using the envelope commands
-
- MAIL FROM:<userx at y.foo.org>
- RCPT TO:<@jkl.org:userc at d.bar.org>
-
- Of course, since hosts are not required to relay mail at all, xyz.com
- may also reject the message entirely when the RCPT command is
- received, using a 550 code (since this is a "policy reason").
-
- If service extensions were negotiated, the RCPT command may also
- carry parameters associated with a particular service extension
- offered by the server. The client MUST NOT transmit parameters other
- than those associated with a service extension offered by the server
- in its EHLO response.
-
-Syntax:
- "RCPT TO:" ("<Postmaster@" domain ">" / "<Postmaster>" / Forward-Path)
- [SP Rcpt-parameters] CRLF
-
-4.1.1.4 DATA (DATA)
-
- The receiver normally sends a 354 response to DATA, and then treats
- the lines (strings ending in <CRLF> sequences, as described in
- section 2.3.7) following the command as mail data from the sender.
- This command causes the mail data to be appended to the mail data
- buffer. The mail data may contain any of the 128 ASCII character
- codes, although experience has indicated that use of control
- characters other than SP, HT, CR, and LF may cause problems and
- SHOULD be avoided when possible.
-
- The mail data is terminated by a line containing only a period, that
- is, the character sequence "<CRLF>.<CRLF>" (see section 4.5.2). This
- is the end of mail data indication. Note that the first <CRLF> of
- this terminating sequence is also the <CRLF> that ends the final line
- of the data (message text) or, if there was no data, ends the DATA
- command itself. An extra <CRLF> MUST NOT be added, as that would
- cause an empty line to be added to the message. The only exception
- to this rule would arise if the message body were passed to the
- originating SMTP-sender with a final "line" that did not end in
- <CRLF>; in that case, the originating SMTP system MUST either reject
- the message as invalid or add <CRLF> in order to have the receiving
- SMTP server recognize the "end of data" condition.
-
- The custom of accepting lines ending only in <LF>, as a concession to
- non-conforming behavior on the part of some UNIX systems, has proven
- to cause more interoperability problems than it solves, and SMTP
- server systems MUST NOT do this, even in the name of improved
- robustness. In particular, the sequence "<LF>.<LF>" (bare line
- feeds, without carriage returns) MUST NOT be treated as equivalent to
- <CRLF>.<CRLF> as the end of mail data indication.
-
- Receipt of the end of mail data indication requires the server to
- process the stored mail transaction information. This processing
- consumes the information in the reverse-path buffer, the forward-path
- buffer, and the mail data buffer, and on the completion of this
- command these buffers are cleared. If the processing is successful,
- the receiver MUST send an OK reply. If the processing fails the
- receiver MUST send a failure reply. The SMTP model does not allow
- for partial failures at this point: either the message is accepted by
- the server for delivery and a positive response is returned or it is
- not accepted and a failure reply is returned. In sending a positive
- completion reply to the end of data indication, the receiver takes
- full responsibility for the message (see section 6.1). Errors that
- are diagnosed subsequently MUST be reported in a mail message, as
- discussed in section 4.4.
-
- When the SMTP server accepts a message either for relaying or for
- final delivery, it inserts a trace record (also referred to
- interchangeably as a "time stamp line" or "Received" line) at the top
- of the mail data. This trace record indicates the identity of the
- host that sent the message, the identity of the host that received
- the message (and is inserting this time stamp), and the date and time
- the message was received. Relayed messages will have multiple time
- stamp lines. Details for formation of these lines, including their
- syntax, is specified in section 4.4.
-
- Additional discussion about the operation of the DATA command appears
- in section 3.3.
-
- Syntax:
- "DATA" CRLF
-
-4.1.1.5 RESET (RSET)
-
- This command specifies that the current mail transaction will be
- aborted. Any stored sender, recipients, and mail data MUST be
- discarded, and all buffers and state tables cleared. The receiver
- MUST send a "250 OK" reply to a RSET command with no arguments. A
- reset command may be issued by the client at any time. It is
- effectively equivalent to a NOOP (i.e., if has no effect) if issued
- immediately after EHLO, before EHLO is issued in the session, after
- an end-of-data indicator has been sent and acknowledged, or
- immediately before a QUIT. An SMTP server MUST NOT close the
- connection as the result of receiving a RSET; that action is reserved
- for QUIT (see section 4.1.1.10).
-
- Since EHLO implies some additional processing and response by the
- server, RSET will normally be more efficient than reissuing that
- command, even though the formal semantics are the same.
-
- There are circumstances, contrary to the intent of this
- specification, in which an SMTP server may receive an indication that
- the underlying TCP connection has been closed or reset. To preserve
- the robustness of the mail system, SMTP servers SHOULD be prepared
- for this condition and SHOULD treat it as if a QUIT had been received
- before the connection disappeared.
-
- Syntax:
- "RSET" CRLF
-
-4.1.1.6 VERIFY (VRFY)
-
- This command asks the receiver to confirm that the argument
- identifies a user or mailbox. If it is a user name, information is
- returned as specified in section 3.5.
-
- This command has no effect on the reverse-path buffer, the forward-
- path buffer, or the mail data buffer.
-
- Syntax:
- "VRFY" SP String CRLF
-
-4.1.1.7 EXPAND (EXPN)
-
- This command asks the receiver to confirm that the argument
- identifies a mailing list, and if so, to return the membership of
- that list. If the command is successful, a reply is returned
- containing information as described in section 3.5. This reply will
- have multiple lines except in the trivial case of a one-member list.
-
- This command has no effect on the reverse-path buffer, the forward-
- path buffer, or the mail data buffer and may be issued at any time.
-
- Syntax:
- "EXPN" SP String CRLF
-
-4.1.1.8 HELP (HELP)
-
- This command causes the server to send helpful information to the
- client. The command MAY take an argument (e.g., any command name)
- and return more specific information as a response.
-
- This command has no effect on the reverse-path buffer, the forward-
- path buffer, or the mail data buffer and may be issued at any time.
-
- SMTP servers SHOULD support HELP without arguments and MAY support it
- with arguments.
-
- Syntax:
- "HELP" [ SP String ] CRLF
-
-4.1.1.9 NOOP (NOOP)
-
- This command does not affect any parameters or previously entered
- commands. It specifies no action other than that the receiver send
- an OK reply.
-
- This command has no effect on the reverse-path buffer, the forward-
- path buffer, or the mail data buffer and may be issued at any time.
- If a parameter string is specified, servers SHOULD ignore it.
-
- Syntax:
- "NOOP" [ SP String ] CRLF
-
-4.1.1.10 QUIT (QUIT)
-
- This command specifies that the receiver MUST send an OK reply, and
- then close the transmission channel.
-
- The receiver MUST NOT intentionally close the transmission channel
- until it receives and replies to a QUIT command (even if there was an
- error). The sender MUST NOT intentionally close the transmission
- channel until it sends a QUIT command and SHOULD wait until it
- receives the reply (even if there was an error response to a previous
- command). If the connection is closed prematurely due to violations
- of the above or system or network failure, the server MUST cancel any
- pending transaction, but not undo any previously completed
- transaction, and generally MUST act as if the command or transaction
- in progress had received a temporary error (i.e., a 4yz response).
-
- The QUIT command may be issued at any time.
-
- Syntax:
- "QUIT" CRLF
-
-4.1.2 Command Argument Syntax
-
- The syntax of the argument fields of the above commands (using the
- syntax specified in [8] where applicable) is given below. Some of
- the productions given below are used only in conjunction with source
- routes as described in appendix C. Terminals not defined in this
- document, such as ALPHA, DIGIT, SP, CR, LF, CRLF, are as defined in
- the "core" syntax [8 (section 6)] or in the message format syntax
- [32].
-
- Reverse-path = Path
- Forward-path = Path
- Path = "<" [ A-d-l ":" ] Mailbox ">"
- A-d-l = At-domain *( "," A-d-l )
- ; Note that this form, the so-called "source route",
- ; MUST BE accepted, SHOULD NOT be generated, and SHOULD be
- ; ignored.
- At-domain = "@" domain
- Mail-parameters = esmtp-param *(SP esmtp-param)
- Rcpt-parameters = esmtp-param *(SP esmtp-param)
-
- esmtp-param = esmtp-keyword ["=" esmtp-value]
- esmtp-keyword = (ALPHA / DIGIT) *(ALPHA / DIGIT / "-")
- esmtp-value = 1*(%d33-60 / %d62-127)
- ; any CHAR excluding "=", SP, and control characters
- Keyword = Ldh-str
- Argument = Atom
- Domain = (sub-domain 1*("." sub-domain)) / address-literal
- sub-domain = Let-dig [Ldh-str]
-
- address-literal = "[" IPv4-address-literal /
- IPv6-address-literal /
- General-address-literal "]"
- ; See section 4.1.3
-
- Mailbox = Local-part "@" Domain
-
- Local-part = Dot-string / Quoted-string
- ; MAY be case-sensitive
-
- Dot-string = Atom *("." Atom)
-
- Atom = 1*atext
-
- Quoted-string = DQUOTE *qcontent DQUOTE
-
- String = Atom / Quoted-string
-
- While the above definition for Local-part is relatively permissive,
- for maximum interoperability, a host that expects to receive mail
- SHOULD avoid defining mailboxes where the Local-part requires (or
- uses) the Quoted-string form or where the Local-part is case-
- sensitive. For any purposes that require generating or comparing
- Local-parts (e.g., to specific mailbox names), all quoted forms MUST
- be treated as equivalent and the sending system SHOULD transmit the
- form that uses the minimum quoting possible.
-
- Systems MUST NOT define mailboxes in such a way as to require the use
- in SMTP of non-ASCII characters (octets with the high order bit set
- to one) or ASCII "control characters" (decimal value 0-31 and 127).
- These characters MUST NOT be used in MAIL or RCPT commands or other
- commands that require mailbox names.
-
- Note that the backslash, "\", is a quote character, which is used to
- indicate that the next character is to be used literally (instead of
- its normal interpretation). For example, "Joe\,Smith" indicates a
- single nine character user field with the comma being the fourth
- character of the field.
-
- To promote interoperability and consistent with long-standing
- guidance about conservative use of the DNS in naming and applications
- (e.g., see section 2.3.1 of the base DNS document, RFC1035 [22]),
- characters outside the set of alphas, digits, and hyphen MUST NOT
- appear in domain name labels for SMTP clients or servers. In
- particular, the underscore character is not permitted. SMTP servers
- that receive a command in which invalid character codes have been
- employed, and for which there are no other reasons for rejection,
- MUST reject that command with a 501 response.
-
-4.1.3 Address Literals
-
- Sometimes a host is not known to the domain name system and
- communication (and, in particular, communication to report and repair
- the error) is blocked. To bypass this barrier a special literal form
- of the address is allowed as an alternative to a domain name. For
- IPv4 addresses, this form uses four small decimal integers separated
- by dots and enclosed by brackets such as [123.255.37.2], which
- indicates an (IPv4) Internet Address in sequence-of-octets form. For
- IPv6 and other forms of addressing that might eventually be
- standardized, the form consists of a standardized "tag" that
- identifies the address syntax, a colon, and the address itself, in a
- format specified as part of the IPv6 standards [17].
-
- Specifically:
-
- IPv4-address-literal = Snum 3("." Snum)
- IPv6-address-literal = "IPv6:" IPv6-addr
- General-address-literal = Standardized-tag ":" 1*dcontent
- Standardized-tag = Ldh-str
- ; MUST be specified in a standards-track RFC
- ; and registered with IANA
-
- Snum = 1*3DIGIT ; representing a decimal integer
- ; value in the range 0 through 255
- Let-dig = ALPHA / DIGIT
- Ldh-str = *( ALPHA / DIGIT / "-" ) Let-dig
-
- IPv6-addr = IPv6-full / IPv6-comp / IPv6v4-full / IPv6v4-comp
- IPv6-hex = 1*4HEXDIG
- IPv6-full = IPv6-hex 7(":" IPv6-hex)
- IPv6-comp = [IPv6-hex *5(":" IPv6-hex)] "::" [IPv6-hex *5(":"
- IPv6-hex)]
- ; The "::" represents at least 2 16-bit groups of zeros
- ; No more than 6 groups in addition to the "::" may be
- ; present
- IPv6v4-full = IPv6-hex 5(":" IPv6-hex) ":" IPv4-address-literal
- IPv6v4-comp = [IPv6-hex *3(":" IPv6-hex)] "::"
-
- [IPv6-hex *3(":" IPv6-hex) ":"] IPv4-address-literal
- ; The "::" represents at least 2 16-bit groups of zeros
- ; No more than 4 groups in addition to the "::" and
- ; IPv4-address-literal may be present
-
-4.1.4 Order of Commands
-
- There are restrictions on the order in which these commands may be
- used.
-
- A session that will contain mail transactions MUST first be
- initialized by the use of the EHLO command. An SMTP server SHOULD
- accept commands for non-mail transactions (e.g., VRFY or EXPN)
- without this initialization.
-
- An EHLO command MAY be issued by a client later in the session. If
- it is issued after the session begins, the SMTP server MUST clear all
- buffers and reset the state exactly as if a RSET command had been
- issued. In other words, the sequence of RSET followed immediately by
- EHLO is redundant, but not harmful other than in the performance cost
- of executing unnecessary commands.
-
- If the EHLO command is not acceptable to the SMTP server, 501, 500,
- or 502 failure replies MUST be returned as appropriate. The SMTP
- server MUST stay in the same state after transmitting these replies
- that it was in before the EHLO was received.
-
- The SMTP client MUST, if possible, ensure that the domain parameter
- to the EHLO command is a valid principal host name (not a CNAME or MX
- name) for its host. If this is not possible (e.g., when the client's
- address is dynamically assigned and the client does not have an
- obvious name), an address literal SHOULD be substituted for the
- domain name and supplemental information provided that will assist in
- identifying the client.
-
- An SMTP server MAY verify that the domain name parameter in the EHLO
- command actually corresponds to the IP address of the client.
- However, the server MUST NOT refuse to accept a message for this
- reason if the verification fails: the information about verification
- failure is for logging and tracing only.
-
- The NOOP, HELP, EXPN, VRFY, and RSET commands can be used at any time
- during a session, or without previously initializing a session. SMTP
- servers SHOULD process these normally (that is, not return a 503
- code) even if no EHLO command has yet been received; clients SHOULD
- open a session with EHLO before sending these commands.
-
- If these rules are followed, the example in RFC 821 that shows "550
- access denied to you" in response to an EXPN command is incorrect
- unless an EHLO command precedes the EXPN or the denial of access is
- based on the client's IP address or other authentication or
- authorization-determining mechanisms.
-
- The MAIL command (or the obsolete SEND, SOML, or SAML commands)
- begins a mail transaction. Once started, a mail transaction consists
- of a transaction beginning command, one or more RCPT commands, and a
- DATA command, in that order. A mail transaction may be aborted by
- the RSET (or a new EHLO) command. There may be zero or more
- transactions in a session. MAIL (or SEND, SOML, or SAML) MUST NOT be
- sent if a mail transaction is already open, i.e., it should be sent
- only if no mail transaction had been started in the session, or it
- the previous one successfully concluded with a successful DATA
- command, or if the previous one was aborted with a RSET.
-
- If the transaction beginning command argument is not acceptable, a
- 501 failure reply MUST be returned and the SMTP server MUST stay in
- the same state. If the commands in a transaction are out of order to
- the degree that they cannot be processed by the server, a 503 failure
- reply MUST be returned and the SMTP server MUST stay in the same
- state.
-
- The last command in a session MUST be the QUIT command. The QUIT
- command cannot be used at any other time in a session, but SHOULD be
- used by the client SMTP to request connection closure, even when no
- session opening command was sent and accepted.
-
-4.1.5 Private-use Commands
-
- As specified in section 2.2.2, commands starting in "X" may be used
- by bilateral agreement between the client (sending) and server
- (receiving) SMTP agents. An SMTP server that does not recognize such
- a command is expected to reply with "500 Command not recognized". An
- extended SMTP server MAY list the feature names associated with these
- private commands in the response to the EHLO command.
-
- Commands sent or accepted by SMTP systems that do not start with "X"
- MUST conform to the requirements of section 2.2.2.
-
-4.2 SMTP Replies
-
- Replies to SMTP commands serve to ensure the synchronization of
- requests and actions in the process of mail transfer and to guarantee
- that the SMTP client always knows the state of the SMTP server.
- Every command MUST generate exactly one reply.
-
- The details of the command-reply sequence are described in section
- 4.3.
-
- An SMTP reply consists of a three digit number (transmitted as three
- numeric characters) followed by some text unless specified otherwise
- in this document. The number is for use by automata to determine
- what state to enter next; the text is for the human user. The three
- digits contain enough encoded information that the SMTP client need
- not examine the text and may either discard it or pass it on to the
- user, as appropriate. Exceptions are as noted elsewhere in this
- document. In particular, the 220, 221, 251, 421, and 551 reply codes
- are associated with message text that must be parsed and interpreted
- by machines. In the general case, the text may be receiver dependent
- and context dependent, so there are likely to be varying texts for
- each reply code. A discussion of the theory of reply codes is given
- in section 4.2.1. Formally, a reply is defined to be the sequence: a
- three-digit code, <SP>, one line of text, and <CRLF>, or a multiline
- reply (as defined in section 4.2.1). Since, in violation of this
- specification, the text is sometimes not sent, clients which do not
- receive it SHOULD be prepared to process the code alone (with or
- without a trailing space character). Only the EHLO, EXPN, and HELP
- commands are expected to result in multiline replies in normal
- circumstances, however, multiline replies are allowed for any
- command.
-
- In ABNF, server responses are:
-
- Greeting = "220 " Domain [ SP text ] CRLF
- Reply-line = Reply-code [ SP text ] CRLF
-
- where "Greeting" appears only in the 220 response that announces that
- the server is opening its part of the connection.
-
- An SMTP server SHOULD send only the reply codes listed in this
- document. An SMTP server SHOULD use the text shown in the examples
- whenever appropriate.
-
- An SMTP client MUST determine its actions only by the reply code, not
- by the text (except for the "change of address" 251 and 551 and, if
- necessary, 220, 221, and 421 replies); in the general case, any text,
- including no text at all (although senders SHOULD NOT send bare
- codes), MUST be acceptable. The space (blank) following the reply
- code is considered part of the text. Whenever possible, a receiver-
- SMTP SHOULD test the first digit (severity indication) of the reply
- code.
-
- The list of codes that appears below MUST NOT be construed as
- permanent. While the addition of new codes should be a rare and
- significant activity, with supplemental information in the textual
- part of the response being preferred, new codes may be added as the
- result of new Standards or Standards-track specifications.
- Consequently, a sender-SMTP MUST be prepared to handle codes not
- specified in this document and MUST do so by interpreting the first
- digit only.
-
-4.2.1 Reply Code Severities and Theory
-
- The three digits of the reply each have a special significance. The
- first digit denotes whether the response is good, bad or incomplete.
- An unsophisticated SMTP client, or one that receives an unexpected
- code, will be able to determine its next action (proceed as planned,
- redo, retrench, etc.) by examining this first digit. An SMTP client
- that wants to know approximately what kind of error occurred (e.g.,
- mail system error, command syntax error) may examine the second
- digit. The third digit and any supplemental information that may be
- present is reserved for the finest gradation of information.
-
- There are five values for the first digit of the reply code:
-
- 1yz Positive Preliminary reply
- The command has been accepted, but the requested action is being
- held in abeyance, pending confirmation of the information in this
- reply. The SMTP client should send another command specifying
- whether to continue or abort the action. Note: unextended SMTP
- does not have any commands that allow this type of reply, and so
- does not have continue or abort commands.
-
- 2yz Positive Completion reply
- The requested action has been successfully completed. A new
- request may be initiated.
-
- 3yz Positive Intermediate reply
- The command has been accepted, but the requested action is being
- held in abeyance, pending receipt of further information. The
- SMTP client should send another command specifying this
- information. This reply is used in command sequence groups (i.e.,
- in DATA).
-
- 4yz Transient Negative Completion reply
- The command was not accepted, and the requested action did not
- occur. However, the error condition is temporary and the action
- may be requested again. The sender should return to the beginning
- of the command sequence (if any). It is difficult to assign a
- meaning to "transient" when two different sites (receiver- and
-
- sender-SMTP agents) must agree on the interpretation. Each reply
- in this category might have a different time value, but the SMTP
- client is encouraged to try again. A rule of thumb to determine
- whether a reply fits into the 4yz or the 5yz category (see below)
- is that replies are 4yz if they can be successful if repeated
- without any change in command form or in properties of the sender
- or receiver (that is, the command is repeated identically and the
- receiver does not put up a new implementation.)
-
- 5yz Permanent Negative Completion reply
- The command was not accepted and the requested action did not
- occur. The SMTP client is discouraged from repeating the exact
- request (in the same sequence). Even some "permanent" error
- conditions can be corrected, so the human user may want to direct
- the SMTP client to reinitiate the command sequence by direct
- action at some point in the future (e.g., after the spelling has
- been changed, or the user has altered the account status).
-
- The second digit encodes responses in specific categories:
-
- x0z Syntax: These replies refer to syntax errors, syntactically
- correct commands that do not fit any functional category, and
- unimplemented or superfluous commands.
-
- x1z Information: These are replies to requests for information,
- such as status or help.
-
- x2z Connections: These are replies referring to the transmission
- channel.
-
- x3z Unspecified.
-
- x4z Unspecified.
-
- x5z Mail system: These replies indicate the status of the receiver
- mail system vis-a-vis the requested transfer or other mail system
- action.
-
- The third digit gives a finer gradation of meaning in each category
- specified by the second digit. The list of replies illustrates this.
- Each reply text is recommended rather than mandatory, and may even
- change according to the command with which it is associated. On the
- other hand, the reply codes must strictly follow the specifications
- in this section. Receiver implementations should not invent new
- codes for slightly different situations from the ones described here,
- but rather adapt codes already defined.
-
- For example, a command such as NOOP, whose successful execution does
- not offer the SMTP client any new information, will return a 250
- reply. The reply is 502 when the command requests an unimplemented
- non-site-specific action. A refinement of that is the 504 reply for
- a command that is implemented, but that requests an unimplemented
- parameter.
-
- The reply text may be longer than a single line; in these cases the
- complete text must be marked so the SMTP client knows when it can
- stop reading the reply. This requires a special format to indicate a
- multiple line reply.
-
- The format for multiline replies requires that every line, except the
- last, begin with the reply code, followed immediately by a hyphen,
- "-" (also known as minus), followed by text. The last line will
- begin with the reply code, followed immediately by <SP>, optionally
- some text, and <CRLF>. As noted above, servers SHOULD send the <SP>
- if subsequent text is not sent, but clients MUST be prepared for it
- to be omitted.
-
- For example:
-
- 123-First line
- 123-Second line
- 123-234 text beginning with numbers
- 123 The last line
-
- In many cases the SMTP client then simply needs to search for a line
- beginning with the reply code followed by <SP> or <CRLF> and ignore
- all preceding lines. In a few cases, there is important data for the
- client in the reply "text". The client will be able to identify
- these cases from the current context.
-
-4.2.2 Reply Codes by Function Groups
-
- 500 Syntax error, command unrecognized
- (This may include errors such as command line too long)
- 501 Syntax error in parameters or arguments
- 502 Command not implemented (see section 4.2.4)
- 503 Bad sequence of commands
- 504 Command parameter not implemented
-
- 211 System status, or system help reply
- 214 Help message
- (Information on how to use the receiver or the meaning of a
- particular non-standard command; this reply is useful only
- to the human user)
-
- 220 <domain> Service ready
- 221 <domain> Service closing transmission channel
- 421 <domain> Service not available, closing transmission channel
- (This may be a reply to any command if the service knows it
- must shut down)
-
- 250 Requested mail action okay, completed
- 251 User not local; will forward to <forward-path>
- (See section 3.4)
- 252 Cannot VRFY user, but will accept message and attempt
- delivery
- (See section 3.5.3)
- 450 Requested mail action not taken: mailbox unavailable
- (e.g., mailbox busy)
- 550 Requested action not taken: mailbox unavailable
- (e.g., mailbox not found, no access, or command rejected
- for policy reasons)
- 451 Requested action aborted: error in processing
- 551 User not local; please try <forward-path>
- (See section 3.4)
- 452 Requested action not taken: insufficient system storage
- 552 Requested mail action aborted: exceeded storage allocation
- 553 Requested action not taken: mailbox name not allowed
- (e.g., mailbox syntax incorrect)
- 354 Start mail input; end with <CRLF>.<CRLF>
- 554 Transaction failed (Or, in the case of a connection-opening
- response, "No SMTP service here")
-
-4.2.3 Reply Codes in Numeric Order
-
- 211 System status, or system help reply
- 214 Help message
- (Information on how to use the receiver or the meaning of a
- particular non-standard command; this reply is useful only
- to the human user)
- 220 <domain> Service ready
- 221 <domain> Service closing transmission channel
- 250 Requested mail action okay, completed
- 251 User not local; will forward to <forward-path>
- (See section 3.4)
- 252 Cannot VRFY user, but will accept message and attempt
- delivery
- (See section 3.5.3)
-
- 354 Start mail input; end with <CRLF>.<CRLF>
-
- 421 <domain> Service not available, closing transmission channel
- (This may be a reply to any command if the service knows it
- must shut down)
- 450 Requested mail action not taken: mailbox unavailable
- (e.g., mailbox busy)
- 451 Requested action aborted: local error in processing
- 452 Requested action not taken: insufficient system storage
- 500 Syntax error, command unrecognized
- (This may include errors such as command line too long)
- 501 Syntax error in parameters or arguments
- 502 Command not implemented (see section 4.2.4)
- 503 Bad sequence of commands
- 504 Command parameter not implemented
- 550 Requested action not taken: mailbox unavailable
- (e.g., mailbox not found, no access, or command rejected
- for policy reasons)
- 551 User not local; please try <forward-path>
- (See section 3.4)
- 552 Requested mail action aborted: exceeded storage allocation
- 553 Requested action not taken: mailbox name not allowed
- (e.g., mailbox syntax incorrect)
- 554 Transaction failed (Or, in the case of a connection-opening
- response, "No SMTP service here")
-
-4.2.4 Reply Code 502
-
- Questions have been raised as to when reply code 502 (Command not
- implemented) SHOULD be returned in preference to other codes. 502
- SHOULD be used when the command is actually recognized by the SMTP
- server, but not implemented. If the command is not recognized, code
- 500 SHOULD be returned. Extended SMTP systems MUST NOT list
- capabilities in response to EHLO for which they will return 502 (or
- 500) replies.
-
-4.2.5 Reply Codes After DATA and the Subsequent <CRLF>.<CRLF>
-
- When an SMTP server returns a positive completion status (2yz code)
- after the DATA command is completed with <CRLF>.<CRLF>, it accepts
- responsibility for:
-
- - delivering the message (if the recipient mailbox exists), or
-
- - if attempts to deliver the message fail due to transient
- conditions, retrying delivery some reasonable number of times at
- intervals as specified in section 4.5.4.
-
- - if attempts to deliver the message fail due to permanent
- conditions, or if repeated attempts to deliver the message fail
- due to transient conditions, returning appropriate notification to
- the sender of the original message (using the address in the SMTP
- MAIL command).
-
- When an SMTP server returns a permanent error status (5yz) code after
- the DATA command is completed with <CRLF>.<CRLF>, it MUST NOT make
- any subsequent attempt to deliver that message. The SMTP client
- retains responsibility for delivery of that message and may either
- return it to the user or requeue it for a subsequent attempt (see
- section 4.5.4.1).
-
- The user who originated the message SHOULD be able to interpret the
- return of a transient failure status (by mail message or otherwise)
- as a non-delivery indication, just as a permanent failure would be
- interpreted. I.e., if the client SMTP successfully handles these
- conditions, the user will not receive such a reply.
-
- When an SMTP server returns a permanent error status (5yz) code after
- the DATA command is completely with <CRLF>.<CRLF>, it MUST NOT make
- any subsequent attempt to deliver the message. As with temporary
- error status codes, the SMTP client retains responsibility for the
- message, but SHOULD not again attempt delivery to the same server
- without user review and intervention of the message.
-
-4.3 Sequencing of Commands and Replies
-
-4.3.1 Sequencing Overview
-
- The communication between the sender and receiver is an alternating
- dialogue, controlled by the sender. As such, the sender issues a
- command and the receiver responds with a reply. Unless other
- arrangements are negotiated through service extensions, the sender
- MUST wait for this response before sending further commands.
-
- One important reply is the connection greeting. Normally, a receiver
- will send a 220 "Service ready" reply when the connection is
- completed. The sender SHOULD wait for this greeting message before
- sending any commands.
-
- Note: all the greeting-type replies have the official name (the
- fully-qualified primary domain name) of the server host as the first
- word following the reply code. Sometimes the host will have no
- meaningful name. See 4.1.3 for a discussion of alternatives in these
- situations.
-
- For example,
-
- 220 ISIF.USC.EDU Service ready
- or
- 220 mail.foo.com SuperSMTP v 6.1.2 Service ready
- or
- 220 [10.0.0.1] Clueless host service ready
-
- The table below lists alternative success and failure replies for
- each command. These SHOULD be strictly adhered to: a receiver may
- substitute text in the replies, but the meaning and action implied by
- the code numbers and by the specific command reply sequence cannot be
- altered.
-
-4.3.2 Command-Reply Sequences
-
- Each command is listed with its usual possible replies. The prefixes
- used before the possible replies are "I" for intermediate, "S" for
- success, and "E" for error. Since some servers may generate other
- replies under special circumstances, and to allow for future
- extension, SMTP clients SHOULD, when possible, interpret only the
- first digit of the reply and MUST be prepared to deal with
- unrecognized reply codes by interpreting the first digit only.
- Unless extended using the mechanisms described in section 2.2, SMTP
- servers MUST NOT transmit reply codes to an SMTP client that are
- other than three digits or that do not start in a digit between 2 and
- 5 inclusive.
-
- These sequencing rules and, in principle, the codes themselves, can
- be extended or modified by SMTP extensions offered by the server and
- accepted (requested) by the client.
-
- In addition to the codes listed below, any SMTP command can return
- any of the following codes if the corresponding unusual circumstances
- are encountered:
-
- 500 For the "command line too long" case or if the command name was
- not recognized. Note that producing a "command not recognized"
- error in response to the required subset of these commands is a
- violation of this specification.
-
- 501 Syntax error in command or arguments. In order to provide for
- future extensions, commands that are specified in this document as
- not accepting arguments (DATA, RSET, QUIT) SHOULD return a 501
- message if arguments are supplied in the absence of EHLO-
- advertised extensions.
-
- 421 Service shutting down and closing transmission channel
-
- Specific sequences are:
-
- CONNECTION ESTABLISHMENT
- S: 220
- E: 554
- EHLO or HELO
- S: 250
- E: 504, 550
- MAIL
- S: 250
- E: 552, 451, 452, 550, 553, 503
- RCPT
- S: 250, 251 (but see section 3.4 for discussion of 251 and 551)
- E: 550, 551, 552, 553, 450, 451, 452, 503, 550
- DATA
- I: 354 -> data -> S: 250
- E: 552, 554, 451, 452
- E: 451, 554, 503
- RSET
- S: 250
- VRFY
- S: 250, 251, 252
- E: 550, 551, 553, 502, 504
- EXPN
- S: 250, 252
- E: 550, 500, 502, 504
- HELP
- S: 211, 214
- E: 502, 504
- NOOP
- S: 250
- QUIT
- S: 221
-
-4.4 Trace Information
-
- When an SMTP server receives a message for delivery or further
- processing, it MUST insert trace ("time stamp" or "Received")
- information at the beginning of the message content, as discussed in
- section 4.1.1.4.
-
- This line MUST be structured as follows:
-
- - The FROM field, which MUST be supplied in an SMTP environment,
- SHOULD contain both (1) the name of the source host as presented
- in the EHLO command and (2) an address literal containing the IP
- address of the source, determined from the TCP connection.
-
- - The ID field MAY contain an "@" as suggested in RFC 822, but this
- is not required.
-
- - The FOR field MAY contain a list of <path> entries when multiple
- RCPT commands have been given. This may raise some security
- issues and is usually not desirable; see section 7.2.
-
- An Internet mail program MUST NOT change a Received: line that was
- previously added to the message header. SMTP servers MUST prepend
- Received lines to messages; they MUST NOT change the order of
- existing lines or insert Received lines in any other location.
-
- As the Internet grows, comparability of Received fields is important
- for detecting problems, especially slow relays. SMTP servers that
- create Received fields SHOULD use explicit offsets in the dates
- (e.g., -0800), rather than time zone names of any type. Local time
- (with an offset) is preferred to UT when feasible. This formulation
- allows slightly more information about local circumstances to be
- specified. If UT is needed, the receiver need merely do some simple
- arithmetic to convert the values. Use of UT loses information about
- the time zone-location of the server. If it is desired to supply a
- time zone name, it SHOULD be included in a comment.
-
- When the delivery SMTP server makes the "final delivery" of a
- message, it inserts a return-path line at the beginning of the mail
- data. This use of return-path is required; mail systems MUST support
- it. The return-path line preserves the information in the <reverse-
- path> from the MAIL command. Here, final delivery means the message
- has left the SMTP environment. Normally, this would mean it had been
- delivered to the destination user or an associated mail drop, but in
- some cases it may be further processed and transmitted by another
- mail system.
-
- It is possible for the mailbox in the return path to be different
- from the actual sender's mailbox, for example, if error responses are
- to be delivered to a special error handling mailbox rather than to
- the message sender. When mailing lists are involved, this
- arrangement is common and useful as a means of directing errors to
- the list maintainer rather than the message originator.
-
- The text above implies that the final mail data will begin with a
- return path line, followed by one or more time stamp lines. These
- lines will be followed by the mail data headers and body [32].
-
- It is sometimes difficult for an SMTP server to determine whether or
- not it is making final delivery since forwarding or other operations
- may occur after the message is accepted for delivery. Consequently,
-
- any further (forwarding, gateway, or relay) systems MAY remove the
- return path and rebuild the MAIL command as needed to ensure that
- exactly one such line appears in a delivered message.
-
- A message-originating SMTP system SHOULD NOT send a message that
- already contains a Return-path header. SMTP servers performing a
- relay function MUST NOT inspect the message data, and especially not
- to the extent needed to determine if Return-path headers are present.
- SMTP servers making final delivery MAY remove Return-path headers
- before adding their own.
-
- The primary purpose of the Return-path is to designate the address to
- which messages indicating non-delivery or other mail system failures
- are to be sent. For this to be unambiguous, exactly one return path
- SHOULD be present when the message is delivered. Systems using RFC
- 822 syntax with non-SMTP transports SHOULD designate an unambiguous
- address, associated with the transport envelope, to which error
- reports (e.g., non-delivery messages) should be sent.
-
- Historical note: Text in RFC 822 that appears to contradict the use
- of the Return-path header (or the envelope reverse path address from
- the MAIL command) as the destination for error messages is not
- applicable on the Internet. The reverse path address (as copied into
- the Return-path) MUST be used as the target of any mail containing
- delivery error messages.
-
- In particular:
-
- - a gateway from SMTP->elsewhere SHOULD insert a return-path header,
- unless it is known that the "elsewhere" transport also uses
- Internet domain addresses and maintains the envelope sender
- address separately.
-
- - a gateway from elsewhere->SMTP SHOULD delete any return-path
- header present in the message, and either copy that information to
- the SMTP envelope or combine it with information present in the
- envelope of the other transport system to construct the reverse
- path argument to the MAIL command in the SMTP envelope.
-
- The server must give special treatment to cases in which the
- processing following the end of mail data indication is only
- partially successful. This could happen if, after accepting several
- recipients and the mail data, the SMTP server finds that the mail
- data could be successfully delivered to some, but not all, of the
- recipients. In such cases, the response to the DATA command MUST be
- an OK reply. However, the SMTP server MUST compose and send an
- "undeliverable mail" notification message to the originator of the
- message.
-
- A single notification listing all of the failed recipients or
- separate notification messages MUST be sent for each failed
- recipient. For economy of processing by the sender, the former is
- preferred when possible. All undeliverable mail notification
- messages are sent using the MAIL command (even if they result from
- processing the obsolete SEND, SOML, or SAML commands) and use a null
- return path as discussed in section 3.7.
-
- The time stamp line and the return path line are formally defined as
- follows:
-
-Return-path-line = "Return-Path:" FWS Reverse-path <CRLF>
-
-Time-stamp-line = "Received:" FWS Stamp <CRLF>
-
-Stamp = From-domain By-domain Opt-info ";" FWS date-time
-
- ; where "date-time" is as defined in [32]
- ; but the "obs-" forms, especially two-digit
- ; years, are prohibited in SMTP and MUST NOT be used.
-
-From-domain = "FROM" FWS Extended-Domain CFWS
-
-By-domain = "BY" FWS Extended-Domain CFWS
-
-Extended-Domain = Domain /
- ( Domain FWS "(" TCP-info ")" ) /
- ( Address-literal FWS "(" TCP-info ")" )
-
-TCP-info = Address-literal / ( Domain FWS Address-literal )
- ; Information derived by server from TCP connection
- ; not client EHLO.
-
-Opt-info = [Via] [With] [ID] [For]
-
-Via = "VIA" FWS Link CFWS
-
-With = "WITH" FWS Protocol CFWS
-
-ID = "ID" FWS String / msg-id CFWS
-
-For = "FOR" FWS 1*( Path / Mailbox ) CFWS
-
-Link = "TCP" / Addtl-Link
-Addtl-Link = Atom
- ; Additional standard names for links are registered with the
- ; Internet Assigned Numbers Authority (IANA). "Via" is
- ; primarily of value with non-Internet transports. SMTP
-
- ; servers SHOULD NOT use unregistered names.
-Protocol = "ESMTP" / "SMTP" / Attdl-Protocol
-Attdl-Protocol = Atom
- ; Additional standard names for protocols are registered with the
- ; Internet Assigned Numbers Authority (IANA). SMTP servers
- ; SHOULD NOT use unregistered names.
-
-4.5 Additional Implementation Issues
-
-4.5.1 Minimum Implementation
-
- In order to make SMTP workable, the following minimum implementation
- is required for all receivers. The following commands MUST be
- supported to conform to this specification:
-
- EHLO
- HELO
- MAIL
- RCPT
- DATA
- RSET
- NOOP
- QUIT
- VRFY
-
- Any system that includes an SMTP server supporting mail relaying or
- delivery MUST support the reserved mailbox "postmaster" as a case-
- insensitive local name. This postmaster address is not strictly
- necessary if the server always returns 554 on connection opening (as
- described in section 3.1). The requirement to accept mail for
- postmaster implies that RCPT commands which specify a mailbox for
- postmaster at any of the domains for which the SMTP server provides
- mail service, as well as the special case of "RCPT TO:<Postmaster>"
- (with no domain specification), MUST be supported.
-
- SMTP systems are expected to make every reasonable effort to accept
- mail directed to Postmaster from any other system on the Internet.
- In extreme cases --such as to contain a denial of service attack or
- other breach of security-- an SMTP server may block mail directed to
- Postmaster. However, such arrangements SHOULD be narrowly tailored
- so as to avoid blocking messages which are not part of such attacks.
-
-4.5.2 Transparency
-
- Without some provision for data transparency, the character sequence
- "<CRLF>.<CRLF>" ends the mail text and cannot be sent by the user.
- In general, users are not aware of such "forbidden" sequences. To
-
- allow all user composed text to be transmitted transparently, the
- following procedures are used:
-
- - Before sending a line of mail text, the SMTP client checks the
- first character of the line. If it is a period, one additional
- period is inserted at the beginning of the line.
-
- - When a line of mail text is received by the SMTP server, it checks
- the line. If the line is composed of a single period, it is
- treated as the end of mail indicator. If the first character is a
- period and there are other characters on the line, the first
- character is deleted.
-
- The mail data may contain any of the 128 ASCII characters. All
- characters are to be delivered to the recipient's mailbox, including
- spaces, vertical and horizontal tabs, and other control characters.
- If the transmission channel provides an 8-bit byte (octet) data
- stream, the 7-bit ASCII codes are transmitted right justified in the
- octets, with the high order bits cleared to zero. See 3.7 for
- special treatment of these conditions in SMTP systems serving a relay
- function.
-
- In some systems it may be necessary to transform the data as it is
- received and stored. This may be necessary for hosts that use a
- different character set than ASCII as their local character set, that
- store data in records rather than strings, or which use special
- character sequences as delimiters inside mailboxes. If such
- transformations are necessary, they MUST be reversible, especially if
- they are applied to mail being relayed.
-
-4.5.3 Sizes and Timeouts
-
-4.5.3.1 Size limits and minimums
-
- There are several objects that have required minimum/maximum sizes.
- Every implementation MUST be able to receive objects of at least
- these sizes. Objects larger than these sizes SHOULD be avoided when
- possible. However, some Internet mail constructs such as encoded
- X.400 addresses [16] will often require larger objects: clients MAY
- attempt to transmit these, but MUST be prepared for a server to
- reject them if they cannot be handled by it. To the maximum extent
- possible, implementation techniques which impose no limits on the
- length of these objects should be used.
-
- local-part
- The maximum total length of a user name or other local-part is 64
- characters.
-
- domain
- The maximum total length of a domain name or number is 255
- characters.
-
- path
- The maximum total length of a reverse-path or forward-path is 256
- characters (including the punctuation and element separators).
-
- command line
- The maximum total length of a command line including the command
- word and the <CRLF> is 512 characters. SMTP extensions may be
- used to increase this limit.
-
- reply line
- The maximum total length of a reply line including the reply code
- and the <CRLF> is 512 characters. More information may be
- conveyed through multiple-line replies.
-
- text line
- The maximum total length of a text line including the <CRLF> is
- 1000 characters (not counting the leading dot duplicated for
- transparency). This number may be increased by the use of SMTP
- Service Extensions.
-
- message content
- The maximum total length of a message content (including any
- message headers as well as the message body) MUST BE at least 64K
- octets. Since the introduction of Internet standards for
- multimedia mail [12], message lengths on the Internet have grown
- dramatically, and message size restrictions should be avoided if
- at all possible. SMTP server systems that must impose
- restrictions SHOULD implement the "SIZE" service extension [18],
- and SMTP client systems that will send large messages SHOULD
- utilize it when possible.
-
- recipients buffer
- The minimum total number of recipients that must be buffered is
- 100 recipients. Rejection of messages (for excessive recipients)
- with fewer than 100 RCPT commands is a violation of this
- specification. The general principle that relaying SMTP servers
- MUST NOT, and delivery SMTP servers SHOULD NOT, perform validation
- tests on message headers suggests that rejecting a message based
- on the total number of recipients shown in header fields is to be
- discouraged. A server which imposes a limit on the number of
- recipients MUST behave in an orderly fashion, such as to reject
- additional addresses over its limit rather than silently
- discarding addresses previously accepted. A client that needs to
-
- deliver a message containing over 100 RCPT commands SHOULD be
- prepared to transmit in 100-recipient "chunks" if the server
- declines to accept more than 100 recipients in a single message.
-
- Errors due to exceeding these limits may be reported by using the
- reply codes. Some examples of reply codes are:
-
- 500 Line too long.
- or
- 501 Path too long
- or
- 452 Too many recipients (see below)
- or
- 552 Too much mail data.
-
- RFC 821 [30] incorrectly listed the error where an SMTP server
- exhausts its implementation limit on the number of RCPT commands
- ("too many recipients") as having reply code 552. The correct reply
- code for this condition is 452. Clients SHOULD treat a 552 code in
- this case as a temporary, rather than permanent, failure so the logic
- below works.
-
- When a conforming SMTP server encounters this condition, it has at
- least 100 successful RCPT commands in its recipients buffer. If the
- server is able to accept the message, then at least these 100
- addresses will be removed from the SMTP client's queue. When the
- client attempts retransmission of those addresses which received 452
- responses, at least 100 of these will be able to fit in the SMTP
- server's recipients buffer. Each retransmission attempt which is
- able to deliver anything will be able to dispose of at least 100 of
- these recipients.
-
- If an SMTP server has an implementation limit on the number of RCPT
- commands and this limit is exhausted, it MUST use a response code of
- 452 (but the client SHOULD also be prepared for a 552, as noted
- above). If the server has a configured site-policy limitation on the
- number of RCPT commands, it MAY instead use a 5XX response code.
- This would be most appropriate if the policy limitation was intended
- to apply if the total recipient count for a particular message body
- were enforced even if that message body was sent in multiple mail
- transactions.
-
-4.5.3.2 Timeouts
-
- An SMTP client MUST provide a timeout mechanism. It MUST use per-
- command timeouts rather than somehow trying to time the entire mail
- transaction. Timeouts SHOULD be easily reconfigurable, preferably
- without recompiling the SMTP code. To implement this, a timer is set
-
- for each SMTP command and for each buffer of the data transfer. The
- latter means that the overall timeout is inherently proportional to
- the size of the message.
-
- Based on extensive experience with busy mail-relay hosts, the minimum
- per-command timeout values SHOULD be as follows:
-
- Initial 220 Message: 5 minutes
- An SMTP client process needs to distinguish between a failed TCP
- connection and a delay in receiving the initial 220 greeting
- message. Many SMTP servers accept a TCP connection but delay
- delivery of the 220 message until their system load permits more
- mail to be processed.
-
- MAIL Command: 5 minutes
-
- RCPT Command: 5 minutes
- A longer timeout is required if processing of mailing lists and
- aliases is not deferred until after the message was accepted.
-
- DATA Initiation: 2 minutes
- This is while awaiting the "354 Start Input" reply to a DATA
- command.
-
- Data Block: 3 minutes
- This is while awaiting the completion of each TCP SEND call
- transmitting a chunk of data.
-
- DATA Termination: 10 minutes.
- This is while awaiting the "250 OK" reply. When the receiver gets
- the final period terminating the message data, it typically
- performs processing to deliver the message to a user mailbox. A
- spurious timeout at this point would be very wasteful and would
- typically result in delivery of multiple copies of the message,
- since it has been successfully sent and the server has accepted
- responsibility for delivery. See section 6.1 for additional
- discussion.
-
- An SMTP server SHOULD have a timeout of at least 5 minutes while it
- is awaiting the next command from the sender.
-
-4.5.4 Retry Strategies
-
- The common structure of a host SMTP implementation includes user
- mailboxes, one or more areas for queuing messages in transit, and one
- or more daemon processes for sending and receiving mail. The exact
- structure will vary depending on the needs of the users on the host
-
- and the number and size of mailing lists supported by the host. We
- describe several optimizations that have proved helpful, particularly
- for mailers supporting high traffic levels.
-
- Any queuing strategy MUST include timeouts on all activities on a
- per-command basis. A queuing strategy MUST NOT send error messages
- in response to error messages under any circumstances.
-
-4.5.4.1 Sending Strategy
-
- The general model for an SMTP client is one or more processes that
- periodically attempt to transmit outgoing mail. In a typical system,
- the program that composes a message has some method for requesting
- immediate attention for a new piece of outgoing mail, while mail that
- cannot be transmitted immediately MUST be queued and periodically
- retried by the sender. A mail queue entry will include not only the
- message itself but also the envelope information.
-
- The sender MUST delay retrying a particular destination after one
- attempt has failed. In general, the retry interval SHOULD be at
- least 30 minutes; however, more sophisticated and variable strategies
- will be beneficial when the SMTP client can determine the reason for
- non-delivery.
-
- Retries continue until the message is transmitted or the sender gives
- up; the give-up time generally needs to be at least 4-5 days. The
- parameters to the retry algorithm MUST be configurable.
-
- A client SHOULD keep a list of hosts it cannot reach and
- corresponding connection timeouts, rather than just retrying queued
- mail items.
-
- Experience suggests that failures are typically transient (the target
- system or its connection has crashed), favoring a policy of two
- connection attempts in the first hour the message is in the queue,
- and then backing off to one every two or three hours.
-
- The SMTP client can shorten the queuing delay in cooperation with the
- SMTP server. For example, if mail is received from a particular
- address, it is likely that mail queued for that host can now be sent.
- Application of this principle may, in many cases, eliminate the
- requirement for an explicit "send queues now" function such as ETRN
- [9].
-
- The strategy may be further modified as a result of multiple
- addresses per host (see below) to optimize delivery time vs. resource
- usage.
-
- An SMTP client may have a large queue of messages for each
- unavailable destination host. If all of these messages were retried
- in every retry cycle, there would be excessive Internet overhead and
- the sending system would be blocked for a long period. Note that an
- SMTP client can generally determine that a delivery attempt has
- failed only after a timeout of several minutes and even a one-minute
- timeout per connection will result in a very large delay if retries
- are repeated for dozens, or even hundreds, of queued messages to the
- same host.
-
- At the same time, SMTP clients SHOULD use great care in caching
- negative responses from servers. In an extreme case, if EHLO is
- issued multiple times during the same SMTP connection, different
- answers may be returned by the server. More significantly, 5yz
- responses to the MAIL command MUST NOT be cached.
-
- When a mail message is to be delivered to multiple recipients, and
- the SMTP server to which a copy of the message is to be sent is the
- same for multiple recipients, then only one copy of the message
- SHOULD be transmitted. That is, the SMTP client SHOULD use the
- command sequence: MAIL, RCPT, RCPT,... RCPT, DATA instead of the
- sequence: MAIL, RCPT, DATA, ..., MAIL, RCPT, DATA. However, if there
- are very many addresses, a limit on the number of RCPT commands per
- MAIL command MAY be imposed. Implementation of this efficiency
- feature is strongly encouraged.
-
- Similarly, to achieve timely delivery, the SMTP client MAY support
- multiple concurrent outgoing mail transactions. However, some limit
- may be appropriate to protect the host from devoting all its
- resources to mail.
-
-4.5.4.2 Receiving Strategy
-
- The SMTP server SHOULD attempt to keep a pending listen on the SMTP
- port at all times. This requires the support of multiple incoming
- TCP connections for SMTP. Some limit MAY be imposed but servers that
- cannot handle more than one SMTP transaction at a time are not in
- conformance with the intent of this specification.
-
- As discussed above, when the SMTP server receives mail from a
- particular host address, it could activate its own SMTP queuing
- mechanisms to retry any mail pending for that host address.
-
-4.5.5 Messages with a null reverse-path
-
- There are several types of notification messages which are required
- by existing and proposed standards to be sent with a null reverse
- path, namely non-delivery notifications as discussed in section 3.7,
-
- other kinds of Delivery Status Notifications (DSNs) [24], and also
- Message Disposition Notifications (MDNs) [10]. All of these kinds of
- messages are notifications about a previous message, and they are
- sent to the reverse-path of the previous mail message. (If the
- delivery of such a notification message fails, that usually indicates
- a problem with the mail system of the host to which the notification
- message is addressed. For this reason, at some hosts the MTA is set
- up to forward such failed notification messages to someone who is
- able to fix problems with the mail system, e.g., via the postmaster
- alias.)
-
- All other types of messages (i.e., any message which is not required
- by a standards-track RFC to have a null reverse-path) SHOULD be sent
- with with a valid, non-null reverse-path.
-
- Implementors of automated email processors should be careful to make
- sure that the various kinds of messages with null reverse-path are
- handled correctly, in particular such systems SHOULD NOT reply to
- messages with null reverse-path.
-
-5. Address Resolution and Mail Handling
-
- Once an SMTP client lexically identifies a domain to which mail will
- be delivered for processing (as described in sections 3.6 and 3.7), a
- DNS lookup MUST be performed to resolve the domain name [22]. The
- names are expected to be fully-qualified domain names (FQDNs):
- mechanisms for inferring FQDNs from partial names or local aliases
- are outside of this specification and, due to a history of problems,
- are generally discouraged. The lookup first attempts to locate an MX
- record associated with the name. If a CNAME record is found instead,
- the resulting name is processed as if it were the initial name. If
- no MX records are found, but an A RR is found, the A RR is treated as
- if it was associated with an implicit MX RR, with a preference of 0,
- pointing to that host. If one or more MX RRs are found for a given
- name, SMTP systems MUST NOT utilize any A RRs associated with that
- name unless they are located using the MX RRs; the "implicit MX" rule
- above applies only if there are no MX records present. If MX records
- are present, but none of them are usable, this situation MUST be
- reported as an error.
-
- When the lookup succeeds, the mapping can result in a list of
- alternative delivery addresses rather than a single address, because
- of multiple MX records, multihoming, or both. To provide reliable
- mail transmission, the SMTP client MUST be able to try (and retry)
- each of the relevant addresses in this list in order, until a
- delivery attempt succeeds. However, there MAY also be a configurable
- limit on the number of alternate addresses that can be tried. In any
- case, the SMTP client SHOULD try at least two addresses.
-
- Two types of information is used to rank the host addresses: multiple
- MX records, and multihomed hosts.
-
- Multiple MX records contain a preference indication that MUST be used
- in sorting (see below). Lower numbers are more preferred than higher
- ones. If there are multiple destinations with the same preference
- and there is no clear reason to favor one (e.g., by recognition of an
- easily-reached address), then the sender-SMTP MUST randomize them to
- spread the load across multiple mail exchangers for a specific
- organization.
-
- The destination host (perhaps taken from the preferred MX record) may
- be multihomed, in which case the domain name resolver will return a
- list of alternative IP addresses. It is the responsibility of the
- domain name resolver interface to have ordered this list by
- decreasing preference if necessary, and SMTP MUST try them in the
- order presented.
-
- Although the capability to try multiple alternative addresses is
- required, specific installations may want to limit or disable the use
- of alternative addresses. The question of whether a sender should
- attempt retries using the different addresses of a multihomed host
- has been controversial. The main argument for using the multiple
- addresses is that it maximizes the probability of timely delivery,
- and indeed sometimes the probability of any delivery; the counter-
- argument is that it may result in unnecessary resource use. Note
- that resource use is also strongly determined by the sending strategy
- discussed in section 4.5.4.1.
-
- If an SMTP server receives a message with a destination for which it
- is a designated Mail eXchanger, it MAY relay the message (potentially
- after having rewritten the MAIL FROM and/or RCPT TO addresses), make
- final delivery of the message, or hand it off using some mechanism
- outside the SMTP-provided transport environment. Of course, neither
- of the latter require that the list of MX records be examined
- further.
-
- If it determines that it should relay the message without rewriting
- the address, it MUST sort the MX records to determine candidates for
- delivery. The records are first ordered by preference, with the
- lowest-numbered records being most preferred. The relay host MUST
- then inspect the list for any of the names or addresses by which it
- might be known in mail transactions. If a matching record is found,
- all records at that preference level and higher-numbered ones MUST be
- discarded from consideration. If there are no records left at that
- point, it is an error condition, and the message MUST be returned as
- undeliverable. If records do remain, they SHOULD be tried, best
- preference first, as described above.
-
-6. Problem Detection and Handling
-
-6.1 Reliable Delivery and Replies by Email
-
- When the receiver-SMTP accepts a piece of mail (by sending a "250 OK"
- message in response to DATA), it is accepting responsibility for
- delivering or relaying the message. It must take this responsibility
- seriously. It MUST NOT lose the message for frivolous reasons, such
- as because the host later crashes or because of a predictable
- resource shortage.
-
- If there is a delivery failure after acceptance of a message, the
- receiver-SMTP MUST formulate and mail a notification message. This
- notification MUST be sent using a null ("<>") reverse path in the
- envelope. The recipient of this notification MUST be the address
- from the envelope return path (or the Return-Path: line). However,
- if this address is null ("<>"), the receiver-SMTP MUST NOT send a
- notification. Obviously, nothing in this section can or should
- prohibit local decisions (i.e., as part of the same system
- environment as the receiver-SMTP) to log or otherwise transmit
- information about null address events locally if that is desired. If
- the address is an explicit source route, it MUST be stripped down to
- its final hop.
-
- For example, suppose that an error notification must be sent for a
- message that arrived with:
-
- MAIL FROM:<@a, at b:user at d>
-
- The notification message MUST be sent using:
-
- RCPT TO:<user at d>
-
- Some delivery failures after the message is accepted by SMTP will be
- unavoidable. For example, it may be impossible for the receiving
- SMTP server to validate all the delivery addresses in RCPT command(s)
- due to a "soft" domain system error, because the target is a mailing
- list (see earlier discussion of RCPT), or because the server is
- acting as a relay and has no immediate access to the delivering
- system.
-
- To avoid receiving duplicate messages as the result of timeouts, a
- receiver-SMTP MUST seek to minimize the time required to respond to
- the final <CRLF>.<CRLF> end of data indicator. See RFC 1047 [28] for
- a discussion of this problem.
-
-6.2 Loop Detection
-
- Simple counting of the number of "Received:" headers in a message has
- proven to be an effective, although rarely optimal, method of
- detecting loops in mail systems. SMTP servers using this technique
- SHOULD use a large rejection threshold, normally at least 100
- Received entries. Whatever mechanisms are used, servers MUST contain
- provisions for detecting and stopping trivial loops.
-
-6.3 Compensating for Irregularities
-
- Unfortunately, variations, creative interpretations, and outright
- violations of Internet mail protocols do occur; some would suggest
- that they occur quite frequently. The debate as to whether a well-
- behaved SMTP receiver or relay should reject a malformed message,
- attempt to pass it on unchanged, or attempt to repair it to increase
- the odds of successful delivery (or subsequent reply) began almost
- with the dawn of structured network mail and shows no signs of
- abating. Advocates of rejection claim that attempted repairs are
- rarely completely adequate and that rejection of bad messages is the
- only way to get the offending software repaired. Advocates of
- "repair" or "deliver no matter what" argue that users prefer that
- mail go through it if at all possible and that there are significant
- market pressures in that direction. In practice, these market
- pressures may be more important to particular vendors than strict
- conformance to the standards, regardless of the preference of the
- actual developers.
-
- The problems associated with ill-formed messages were exacerbated by
- the introduction of the split-UA mail reading protocols [3, 26, 5,
- 21]. These protocols have encouraged the use of SMTP as a posting
- protocol, and SMTP servers as relay systems for these client hosts
- (which are often only intermittently connected to the Internet).
- Historically, many of those client machines lacked some of the
- mechanisms and information assumed by SMTP (and indeed, by the mail
- format protocol [7]). Some could not keep adequate track of time;
- others had no concept of time zones; still others could not identify
- their own names or addresses; and, of course, none could satisfy the
- assumptions that underlay RFC 822's conception of authenticated
- addresses.
-
- In response to these weak SMTP clients, many SMTP systems now
- complete messages that are delivered to them in incomplete or
- incorrect form. This strategy is generally considered appropriate
- when the server can identify or authenticate the client, and there
- are prior agreements between them. By contrast, there is at best
- great concern about fixes applied by a relay or delivery SMTP server
- that has little or no knowledge of the user or client machine.
-
- The following changes to a message being processed MAY be applied
- when necessary by an originating SMTP server, or one used as the
- target of SMTP as an initial posting protocol:
-
- - Addition of a message-id field when none appears
-
- - Addition of a date, time or time zone when none appears
-
- - Correction of addresses to proper FQDN format
-
- The less information the server has about the client, the less likely
- these changes are to be correct and the more caution and conservatism
- should be applied when considering whether or not to perform fixes
- and how. These changes MUST NOT be applied by an SMTP server that
- provides an intermediate relay function.
-
- In all cases, properly-operating clients supplying correct
- information are preferred to corrections by the SMTP server. In all
- cases, documentation of actions performed by the servers (in trace
- fields and/or header comments) is strongly encouraged.
-
-7. Security Considerations
-
-7.1 Mail Security and Spoofing
-
- SMTP mail is inherently insecure in that it is feasible for even
- fairly casual users to negotiate directly with receiving and relaying
- SMTP servers and create messages that will trick a naive recipient
- into believing that they came from somewhere else. Constructing such
- a message so that the "spoofed" behavior cannot be detected by an
- expert is somewhat more difficult, but not sufficiently so as to be a
- deterrent to someone who is determined and knowledgeable.
- Consequently, as knowledge of Internet mail increases, so does the
- knowledge that SMTP mail inherently cannot be authenticated, or
- integrity checks provided, at the transport level. Real mail
- security lies only in end-to-end methods involving the message
- bodies, such as those which use digital signatures (see [14] and,
- e.g., PGP [4] or S/MIME [31]).
-
- Various protocol extensions and configuration options that provide
- authentication at the transport level (e.g., from an SMTP client to
- an SMTP server) improve somewhat on the traditional situation
- described above. However, unless they are accompanied by careful
- handoffs of responsibility in a carefully-designed trust environment,
- they remain inherently weaker than end-to-end mechanisms which use
- digitally signed messages rather than depending on the integrity of
- the transport system.
-
- Efforts to make it more difficult for users to set envelope return
- path and header "From" fields to point to valid addresses other than
- their own are largely misguided: they frustrate legitimate
- applications in which mail is sent by one user on behalf of another
- or in which error (or normal) replies should be directed to a special
- address. (Systems that provide convenient ways for users to alter
- these fields on a per-message basis should accept to establish a
- primary and permanent mailbox address for the user so that Sender
- fields within the message data can be generated sensibly.)
-
- This specification does not further address the authentication issues
- associated with SMTP other than to advocate that useful functionality
- not be disabled in the hope of providing some small margin of
- protection against an ignorant user who is trying to fake mail.
-
-7.2 "Blind" Copies
-
- Addresses that do not appear in the message headers may appear in the
- RCPT commands to an SMTP server for a number of reasons. The two
- most common involve the use of a mailing address as a "list exploder"
- (a single address that resolves into multiple addresses) and the
- appearance of "blind copies". Especially when more than one RCPT
- command is present, and in order to avoid defeating some of the
- purpose of these mechanisms, SMTP clients and servers SHOULD NOT copy
- the full set of RCPT command arguments into the headers, either as
- part of trace headers or as informational or private-extension
- headers. Since this rule is often violated in practice, and cannot
- be enforced, sending SMTP systems that are aware of "bcc" use MAY
- find it helpful to send each blind copy as a separate message
- transaction containing only a single RCPT command.
-
- There is no inherent relationship between either "reverse" (from
- MAIL, SAML, etc., commands) or "forward" (RCPT) addresses in the SMTP
- transaction ("envelope") and the addresses in the headers. Receiving
- systems SHOULD NOT attempt to deduce such relationships and use them
- to alter the headers of the message for delivery. The popular
- "Apparently-to" header is a violation of this principle as well as a
- common source of unintended information disclosure and SHOULD NOT be
- used.
-
-7.3 VRFY, EXPN, and Security
-
- As discussed in section 3.5, individual sites may want to disable
- either or both of VRFY or EXPN for security reasons. As a corollary
- to the above, implementations that permit this MUST NOT appear to
- have verified addresses that are not, in fact, verified. If a site
-
- disables these commands for security reasons, the SMTP server MUST
- return a 252 response, rather than a code that could be confused with
- successful or unsuccessful verification.
-
- Returning a 250 reply code with the address listed in the VRFY
- command after having checked it only for syntax violates this rule.
- Of course, an implementation that "supports" VRFY by always returning
- 550 whether or not the address is valid is equally not in
- conformance.
-
- Within the last few years, the contents of mailing lists have become
- popular as an address information source for so-called "spammers."
- The use of EXPN to "harvest" addresses has increased as list
- administrators have installed protections against inappropriate uses
- of the lists themselves. Implementations SHOULD still provide
- support for EXPN, but sites SHOULD carefully evaluate the tradeoffs.
- As authentication mechanisms are introduced into SMTP, some sites may
- choose to make EXPN available only to authenticated requestors.
-
-7.4 Information Disclosure in Announcements
-
- There has been an ongoing debate about the tradeoffs between the
- debugging advantages of announcing server type and version (and,
- sometimes, even server domain name) in the greeting response or in
- response to the HELP command and the disadvantages of exposing
- information that might be useful in a potential hostile attack. The
- utility of the debugging information is beyond doubt. Those who
- argue for making it available point out that it is far better to
- actually secure an SMTP server rather than hope that trying to
- conceal known vulnerabilities by hiding the server's precise identity
- will provide more protection. Sites are encouraged to evaluate the
- tradeoff with that issue in mind; implementations are strongly
- encouraged to minimally provide for making type and version
- information available in some way to other network hosts.
-
-7.5 Information Disclosure in Trace Fields
-
- In some circumstances, such as when mail originates from within a LAN
- whose hosts are not directly on the public Internet, trace
- ("Received") fields produced in conformance with this specification
- may disclose host names and similar information that would not
- normally be available. This ordinarily does not pose a problem, but
- sites with special concerns about name disclosure should be aware of
- it. Also, the optional FOR clause should be supplied with caution or
- not at all when multiple recipients are involved lest it
- inadvertently disclose the identities of "blind copy" recipients to
- others.
-
-7.6 Information Disclosure in Message Forwarding
-
- As discussed in section 3.4, use of the 251 or 551 reply codes to
- identify the replacement address associated with a mailbox may
- inadvertently disclose sensitive information. Sites that are
- concerned about those issues should ensure that they select and
- configure servers appropriately.
-
-7.7 Scope of Operation of SMTP Servers
-
- It is a well-established principle that an SMTP server may refuse to
- accept mail for any operational or technical reason that makes sense
- to the site providing the server. However, cooperation among sites
- and installations makes the Internet possible. If sites take
- excessive advantage of the right to reject traffic, the ubiquity of
- email availability (one of the strengths of the Internet) will be
- threatened; considerable care should be taken and balance maintained
- if a site decides to be selective about the traffic it will accept
- and process.
-
- In recent years, use of the relay function through arbitrary sites
- has been used as part of hostile efforts to hide the actual origins
- of mail. Some sites have decided to limit the use of the relay
- function to known or identifiable sources, and implementations SHOULD
- provide the capability to perform this type of filtering. When mail
- is rejected for these or other policy reasons, a 550 code SHOULD be
- used in response to EHLO, MAIL, or RCPT as appropriate.
-
-8. IANA Considerations
-
- IANA will maintain three registries in support of this specification.
- The first consists of SMTP service extensions with the associated
- keywords, and, as needed, parameters and verbs. As specified in
- section 2.2.2, no entry may be made in this registry that starts in
- an "X". Entries may be made only for service extensions (and
- associated keywords, parameters, or verbs) that are defined in
- standards-track or experimental RFCs specifically approved by the
- IESG for this purpose.
-
- The second registry consists of "tags" that identify forms of domain
- literals other than those for IPv4 addresses (specified in RFC 821
- and in this document) and IPv6 addresses (specified in this
- document). Additional literal types require standardization before
- being used; none are anticipated at this time.
-
- The third, established by RFC 821 and renewed by this specification,
- is a registry of link and protocol identifiers to be used with the
- "via" and "with" subclauses of the time stamp ("Received: header")
-
- described in section 4.4. Link and protocol identifiers in addition
- to those specified in this document may be registered only by
- standardization or by way of an RFC-documented, IESG-approved,
- Experimental protocol extension.
-
-9. References
-
- [1] American National Standards Institute (formerly United States of
- America Standards Institute), X3.4, 1968, "USA Code for
- Information Interchange". ANSI X3.4-1968 has been replaced by
- newer versions with slight modifications, but the 1968 version
- remains definitive for the Internet.
-
- [2] Braden, R., "Requirements for Internet hosts - application and
- support", STD 3, RFC 1123, October 1989.
-
- [3] Butler, M., Chase, D., Goldberger, J., Postel, J. and J.
- Reynolds, "Post Office Protocol - version 2", RFC 937, February
- 1985.
-
- [4] Callas, J., Donnerhacke, L., Finney, H. and R. Thayer, "OpenPGP
- Message Format", RFC 2440, November 1998.
-
- [5] Crispin, M., "Interactive Mail Access Protocol - Version 2", RFC
- 1176, August 1990.
-
- [6] Crispin, M., "Internet Message Access Protocol - Version 4", RFC
- 2060, December 1996.
-
- [7] Crocker, D., "Standard for the Format of ARPA Internet Text
- Messages", RFC 822, August 1982.
-
- [8] Crocker, D. and P. Overell, Eds., "Augmented BNF for Syntax
- Specifications: ABNF", RFC 2234, November 1997.
-
- [9] De Winter, J., "SMTP Service Extension for Remote Message Queue
- Starting", RFC 1985, August 1996.
-
- [10] Fajman, R., "An Extensible Message Format for Message
- Disposition Notifications", RFC 2298, March 1998.
-
- [11] Freed, N, "Behavior of and Requirements for Internet Firewalls",
- RFC 2979, October 2000.
-
- [12] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
- Extensions (MIME) Part One: Format of Internet Message Bodies",
- RFC 2045, December 1996.
-
- [13] Freed, N., "SMTP Service Extension for Command Pipelining", RFC
- 2920, September 2000.
-
- [14] Galvin, J., Murphy, S., Crocker, S. and N. Freed, "Security
- Multiparts for MIME: Multipart/Signed and Multipart/Encrypted",
- RFC 1847, October 1995.
-
- [15] Gellens, R. and J. Klensin, "Message Submission", RFC 2476,
- December 1998.
-
- [16] Kille, S., "Mapping between X.400 and RFC822/MIME", RFC 2156,
- January 1998.
-
- [17] Hinden, R and S. Deering, Eds. "IP Version 6 Addressing
- Architecture", RFC 2373, July 1998.
-
- [18] Klensin, J., Freed, N. and K. Moore, "SMTP Service Extension for
- Message Size Declaration", STD 10, RFC 1870, November 1995.
-
- [19] Klensin, J., Freed, N., Rose, M., Stefferud, E. and D. Crocker,
- "SMTP Service Extensions", STD 10, RFC 1869, November 1995.
-
- [20] Klensin, J., Freed, N., Rose, M., Stefferud, E. and D. Crocker,
- "SMTP Service Extension for 8bit-MIMEtransport", RFC 1652, July
- 1994.
-
- [21] Lambert, M., "PCMAIL: A distributed mail system for personal
- computers", RFC 1056, July 1988.
-
- [22] Mockapetris, P., "Domain names - implementation and
- specification", STD 13, RFC 1035, November 1987.
-
- Mockapetris, P., "Domain names - concepts and facilities", STD
- 13, RFC 1034, November 1987.
-
- [23] Moore, K., "MIME (Multipurpose Internet Mail Extensions) Part
- Three: Message Header Extensions for Non-ASCII Text", RFC 2047,
- December 1996.
-
- [24] Moore, K., "SMTP Service Extension for Delivery Status
- Notifications", RFC 1891, January 1996.
-
- [25] Moore, K., and G. Vaudreuil, "An Extensible Message Format for
- Delivery Status Notifications", RFC 1894, January 1996.
-
- [26] Myers, J. and M. Rose, "Post Office Protocol - Version 3", STD
- 53, RFC 1939, May 1996.
-
- [27] Partridge, C., "Mail routing and the domain system", RFC 974,
- January 1986.
-
- [28] Partridge, C., "Duplicate messages and SMTP", RFC 1047, February
- 1988.
-
- [29] Postel, J., ed., "Transmission Control Protocol - DARPA Internet
- Program Protocol Specification", STD 7, RFC 793, September 1981.
-
- [30] Postel, J., "Simple Mail Transfer Protocol", RFC 821, August
- 1982.
-
- [31] Ramsdell, B., Ed., "S/MIME Version 3 Message Specification", RFC
- 2633, June 1999.
-
- [32] Resnick, P., Ed., "Internet Message Format", RFC 2822, April
- 2001.
-
- [33] Vaudreuil, G., "SMTP Service Extensions for Transmission of
- Large and Binary MIME Messages", RFC 1830, August 1995.
-
- [34] Vaudreuil, G., "Enhanced Mail System Status Codes", RFC 1893,
- January 1996.
-
-10. Editor's Address
-
- John C. Klensin
- AT&T Laboratories
- 99 Bedford St
- Boston, MA 02111 USA
-
- Phone: 617-574-3076
- EMail: klensin at research.att.com
-
-11. Acknowledgments
-
- Many people worked long and hard on the many iterations of this
- document. There was wide-ranging debate in the IETF DRUMS Working
- Group, both on its mailing list and in face to face discussions,
- about many technical issues and the role of a revised standard for
- Internet mail transport, and many contributors helped form the
- wording in this specification. The hundreds of participants in the
- many discussions since RFC 821 was produced are too numerous to
- mention, but they all helped this document become what it is.
-
-APPENDICES
-
-A. TCP Transport Service
-
- The TCP connection supports the transmission of 8-bit bytes. The
- SMTP data is 7-bit ASCII characters. Each character is transmitted
- as an 8-bit byte with the high-order bit cleared to zero. Service
- extensions may modify this rule to permit transmission of full 8-bit
- data bytes as part of the message body, but not in SMTP commands or
- responses.
-
-B. Generating SMTP Commands from RFC 822 Headers
-
- Some systems use RFC 822 headers (only) in a mail submission
- protocol, or otherwise generate SMTP commands from RFC 822 headers
- when such a message is handed to an MTA from a UA. While the MTA-UA
- protocol is a private matter, not covered by any Internet Standard,
- there are problems with this approach. For example, there have been
- repeated problems with proper handling of "bcc" copies and
- redistribution lists when information that conceptually belongs to a
- mail envelopes is not separated early in processing from header
- information (and kept separate).
-
- It is recommended that the UA provide its initial ("submission
- client") MTA with an envelope separate from the message itself.
- However, if the envelope is not supplied, SMTP commands SHOULD be
- generated as follows:
-
- 1. Each recipient address from a TO, CC, or BCC header field SHOULD
- be copied to a RCPT command (generating multiple message copies if
- that is required for queuing or delivery). This includes any
- addresses listed in a RFC 822 "group". Any BCC fields SHOULD then
- be removed from the headers. Once this process is completed, the
- remaining headers SHOULD be checked to verify that at least one
- To:, Cc:, or Bcc: header remains. If none do, then a bcc: header
- with no additional information SHOULD be inserted as specified in
- [32].
-
- 2. The return address in the MAIL command SHOULD, if possible, be
- derived from the system's identity for the submitting (local)
- user, and the "From:" header field otherwise. If there is a
- system identity available, it SHOULD also be copied to the Sender
- header field if it is different from the address in the From
- header field. (Any Sender field that was already there SHOULD be
- removed.) Systems may provide a way for submitters to override
- the envelope return address, but may want to restrict its use to
- privileged users. This will not prevent mail forgery, but may
- lessen its incidence; see section 7.1.
-
- When an MTA is being used in this way, it bears responsibility for
- ensuring that the message being transmitted is valid. The mechanisms
- for checking that validity, and for handling (or returning) messages
- that are not valid at the time of arrival, are part of the MUA-MTA
- interface and not covered by this specification.
-
- A submission protocol based on Standard RFC 822 information alone
- MUST NOT be used to gateway a message from a foreign (non-SMTP) mail
- system into an SMTP environment. Additional information to construct
- an envelope must come from some source in the other environment,
- whether supplemental headers or the foreign system's envelope.
-
- Attempts to gateway messages using only their header "to" and "cc"
- fields have repeatedly caused mail loops and other behavior adverse
- to the proper functioning of the Internet mail environment. These
- problems have been especially common when the message originates from
- an Internet mailing list and is distributed into the foreign
- environment using envelope information. When these messages are then
- processed by a header-only remailer, loops back to the Internet
- environment (and the mailing list) are almost inevitable.
-
-C. Source Routes
-
- Historically, the <reverse-path> was a reverse source routing list of
- hosts and a source mailbox. The first host in the <reverse-path>
- SHOULD be the host sending the MAIL command. Similarly, the
- <forward-path> may be a source routing lists of hosts and a
- destination mailbox. However, in general, the <forward-path> SHOULD
- contain only a mailbox and domain name, relying on the domain name
- system to supply routing information if required. The use of source
- routes is deprecated; while servers MUST be prepared to receive and
- handle them as discussed in section 3.3 and F.2, clients SHOULD NOT
- transmit them and this section was included only to provide context.
-
- For relay purposes, the forward-path may be a source route of the
- form "@ONE, at TWO:JOE at THREE", where ONE, TWO, and THREE MUST BE fully-
- qualified domain names. This form is used to emphasize the
- distinction between an address and a route. The mailbox is an
- absolute address, and the route is information about how to get
- there. The two concepts should not be confused.
-
- If source routes are used, RFC 821 and the text below should be
- consulted for the mechanisms for constructing and updating the
- forward- and reverse-paths.
-
- The SMTP server transforms the command arguments by moving its own
- identifier (its domain name or that of any domain for which it is
- acting as a mail exchanger), if it appears, from the forward-path to
- the beginning of the reverse-path.
-
- Notice that the forward-path and reverse-path appear in the SMTP
- commands and replies, but not necessarily in the message. That is,
- there is no need for these paths and especially this syntax to appear
- in the "To:" , "From:", "CC:", etc. fields of the message header.
- Conversely, SMTP servers MUST NOT derive final message delivery
- information from message header fields.
-
- When the list of hosts is present, it is a "reverse" source route and
- indicates that the mail was relayed through each host on the list
- (the first host in the list was the most recent relay). This list is
- used as a source route to return non-delivery notices to the sender.
- As each relay host adds itself to the beginning of the list, it MUST
- use its name as known in the transport environment to which it is
- relaying the mail rather than that of the transport environment from
- which the mail came (if they are different).
-
-D. Scenarios
-
- This section presents complete scenarios of several types of SMTP
- sessions. In the examples, "C:" indicates what is said by the SMTP
- client, and "S:" indicates what is said by the SMTP server.
-
-D.1 A Typical SMTP Transaction Scenario
-
- This SMTP example shows mail sent by Smith at host bar.com, to Jones,
- Green, and Brown at host foo.com. Here we assume that host bar.com
- contacts host foo.com directly. The mail is accepted for Jones and
- Brown. Green does not have a mailbox at host foo.com.
-
- S: 220 foo.com Simple Mail Transfer Service Ready
- C: EHLO bar.com
- S: 250-foo.com greets bar.com
- S: 250-8BITMIME
- S: 250-SIZE
- S: 250-DSN
- S: 250 HELP
- C: MAIL FROM:<Smith at bar.com>
- S: 250 OK
- C: RCPT TO:<Jones at foo.com>
- S: 250 OK
- C: RCPT TO:<Green at foo.com>
- S: 550 No such user here
- C: RCPT TO:<Brown at foo.com>
-
- S: 250 OK
- C: DATA
- S: 354 Start mail input; end with <CRLF>.<CRLF>
- C: Blah blah blah...
- C: ...etc. etc. etc.
- C: .
- S: 250 OK
- C: QUIT
- S: 221 foo.com Service closing transmission channel
-
-D.2 Aborted SMTP Transaction Scenario
-
- S: 220 foo.com Simple Mail Transfer Service Ready
- C: EHLO bar.com
- S: 250-foo.com greets bar.com
- S: 250-8BITMIME
- S: 250-SIZE
- S: 250-DSN
- S: 250 HELP
- C: MAIL FROM:<Smith at bar.com>
- S: 250 OK
- C: RCPT TO:<Jones at foo.com>
- S: 250 OK
- C: RCPT TO:<Green at foo.com>
- S: 550 No such user here
- C: RSET
- S: 250 OK
- C: QUIT
- S: 221 foo.com Service closing transmission channel
-
-D.3 Relayed Mail Scenario
-
- Step 1 -- Source Host to Relay Host
-
- S: 220 foo.com Simple Mail Transfer Service Ready
- C: EHLO bar.com
- S: 250-foo.com greets bar.com
- S: 250-8BITMIME
- S: 250-SIZE
- S: 250-DSN
- S: 250 HELP
- C: MAIL FROM:<JQP at bar.com>
- S: 250 OK
- C: RCPT TO:<@foo.com:Jones at XYZ.COM>
- S: 250 OK
- C: DATA
- S: 354 Start mail input; end with <CRLF>.<CRLF>
- C: Date: Thu, 21 May 1998 05:33:29 -0700
-
- C: From: John Q. Public <JQP at bar.com>
- C: Subject: The Next Meeting of the Board
- C: To: Jones at xyz.com
- C:
- C: Bill:
- C: The next meeting of the board of directors will be
- C: on Tuesday.
- C: John.
- C: .
- S: 250 OK
- C: QUIT
- S: 221 foo.com Service closing transmission channel
-
- Step 2 -- Relay Host to Destination Host
-
- S: 220 xyz.com Simple Mail Transfer Service Ready
- C: EHLO foo.com
- S: 250 xyz.com is on the air
- C: MAIL FROM:<@foo.com:JQP at bar.com>
- S: 250 OK
- C: RCPT TO:<Jones at XYZ.COM>
- S: 250 OK
- C: DATA
- S: 354 Start mail input; end with <CRLF>.<CRLF>
- C: Received: from bar.com by foo.com ; Thu, 21 May 1998
- C: 05:33:29 -0700
- C: Date: Thu, 21 May 1998 05:33:22 -0700
- C: From: John Q. Public <JQP at bar.com>
- C: Subject: The Next Meeting of the Board
- C: To: Jones at xyz.com
- C:
- C: Bill:
- C: The next meeting of the board of directors will be
- C: on Tuesday.
- C: John.
- C: .
- S: 250 OK
- C: QUIT
- S: 221 foo.com Service closing transmission channel
-
-D.4 Verifying and Sending Scenario
-
- S: 220 foo.com Simple Mail Transfer Service Ready
- C: EHLO bar.com
- S: 250-foo.com greets bar.com
- S: 250-8BITMIME
- S: 250-SIZE
- S: 250-DSN
-
- S: 250-VRFY
- S: 250 HELP
- C: VRFY Crispin
- S: 250 Mark Crispin <Admin.MRC at foo.com>
- C: SEND FROM:<EAK at bar.com>
- S: 250 OK
- C: RCPT TO:<Admin.MRC at foo.com>
- S: 250 OK
- C: DATA
- S: 354 Start mail input; end with <CRLF>.<CRLF>
- C: Blah blah blah...
- C: ...etc. etc. etc.
- C: .
- S: 250 OK
- C: QUIT
- S: 221 foo.com Service closing transmission channel
-
-E. Other Gateway Issues
-
- In general, gateways between the Internet and other mail systems
- SHOULD attempt to preserve any layering semantics across the
- boundaries between the two mail systems involved. Gateway-
- translation approaches that attempt to take shortcuts by mapping,
- (such as envelope information from one system to the message headers
- or body of another) have generally proven to be inadequate in
- important ways. Systems translating between environments that do not
- support both envelopes and headers and Internet mail must be written
- with the understanding that some information loss is almost
- inevitable.
-
-F. Deprecated Features of RFC 821
-
- A few features of RFC 821 have proven to be problematic and SHOULD
- NOT be used in Internet mail.
-
-F.1 TURN
-
- This command, described in RFC 821, raises important security issues
- since, in the absence of strong authentication of the host requesting
- that the client and server switch roles, it can easily be used to
- divert mail from its correct destination. Its use is deprecated;
- SMTP systems SHOULD NOT use it unless the server can authenticate the
- client.
-
-F.2 Source Routing
-
- RFC 821 utilized the concept of explicit source routing to get mail
- from one host to another via a series of relays. The requirement to
- utilize source routes in regular mail traffic was eliminated by the
- introduction of the domain name system "MX" record and the last
- significant justification for them was eliminated by the
- introduction, in RFC 1123, of a clear requirement that addresses
- following an "@" must all be fully-qualified domain names.
- Consequently, the only remaining justifications for the use of source
- routes are support for very old SMTP clients or MUAs and in mail
- system debugging. They can, however, still be useful in the latter
- circumstance and for routing mail around serious, but temporary,
- problems such as problems with the relevant DNS records.
-
- SMTP servers MUST continue to accept source route syntax as specified
- in the main body of this document and in RFC 1123. They MAY, if
- necessary, ignore the routes and utilize only the target domain in
- the address. If they do utilize the source route, the message MUST
- be sent to the first domain shown in the address. In particular, a
- server MUST NOT guess at shortcuts within the source route.
-
- Clients SHOULD NOT utilize explicit source routing except under
- unusual circumstances, such as debugging or potentially relaying
- around firewall or mail system configuration errors.
-
-F.3 HELO
-
- As discussed in sections 3.1 and 4.1.1, EHLO is strongly preferred to
- HELO when the server will accept the former. Servers must continue
- to accept and process HELO in order to support older clients.
-
-F.4 #-literals
-
- RFC 821 provided for specifying an Internet address as a decimal
- integer host number prefixed by a pound sign, "#". In practice, that
- form has been obsolete since the introduction of TCP/IP. It is
- deprecated and MUST NOT be used.
-
-F.5 Dates and Years
-
- When dates are inserted into messages by SMTP clients or servers
- (e.g., in trace fields), four-digit years MUST BE used. Two-digit
- years are deprecated; three-digit years were never permitted in the
- Internet mail system.
-
-F.6 Sending versus Mailing
-
- In addition to specifying a mechanism for delivering messages to
- user's mailboxes, RFC 821 provided additional, optional, commands to
- deliver messages directly to the user's terminal screen. These
- commands (SEND, SAML, SOML) were rarely implemented, and changes in
- workstation technology and the introduction of other protocols may
- have rendered them obsolete even where they are implemented.
-
- Clients SHOULD NOT provide SEND, SAML, or SOML as services. Servers
- MAY implement them. If they are implemented by servers, the
- implementation model specified in RFC 821 MUST be used and the
- command names MUST be published in the response to the EHLO command.
-
-Full Copyright Statement
-
- Copyright (C) The Internet Society (2001). All Rights Reserved.
-
- This document and translations of it may be copied and furnished to
- others, and derivative works that comment on or otherwise explain it
- or assist in its implementation may be prepared, copied, published
- and distributed, in whole or in part, without restriction of any
- kind, provided that the above copyright notice and this paragraph are
- included on all such copies and derivative works. However, this
- document itself may not be modified in any way, such as by removing
- the copyright notice or references to the Internet Society or other
- Internet organizations, except as needed for the purpose of
- developing Internet standards in which case the procedures for
- copyrights defined in the Internet Standards process must be
- followed, or as required to translate it into languages other than
- English.
-
- The limited permissions granted above are perpetual and will not be
- revoked by the Internet Society or its successors or assigns.
-
- This document and the information contained herein is provided on an
- "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
- TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
- BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
- HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
- MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
-
-Acknowledgement
-
- Funding for the RFC Editor function is currently provided by the
- Internet Society.
diff --git a/reference/rfc2822 Internet Message Format.txt b/reference/rfc2822 Internet Message Format.txt
deleted file mode 100644
index 9f698f7..0000000
--- a/reference/rfc2822 Internet Message Format.txt
+++ /dev/null
@@ -1,2859 +0,0 @@
-
-
-
-
-
-
-Network Working Group P. Resnick, Editor
-Request for Comments: 2822 QUALCOMM Incorporated
-Obsoletes: 822 April 2001
-Category: Standards Track
-
-
- Internet Message Format
-
-Status of this Memo
-
- This document specifies an Internet standards track protocol for the
- Internet community, and requests discussion and suggestions for
- improvements. Please refer to the current edition of the "Internet
- Official Protocol Standards" (STD 1) for the standardization state
- and status of this protocol. Distribution of this memo is unlimited.
-
-Copyright Notice
-
- Copyright (C) The Internet Society (2001). All Rights Reserved.
-
-Abstract
-
- This standard specifies a syntax for text messages that are sent
- between computer users, within the framework of "electronic mail"
- messages. This standard supersedes the one specified in Request For
- Comments (RFC) 822, "Standard for the Format of ARPA Internet Text
- Messages", updating it to reflect current practice and incorporating
- incremental changes that were specified in other RFCs.
-
-Table of Contents
-
- 1. Introduction ............................................... 3
- 1.1. Scope .................................................... 3
- 1.2. Notational conventions ................................... 4
- 1.2.1. Requirements notation .................................. 4
- 1.2.2. Syntactic notation ..................................... 4
- 1.3. Structure of this document ............................... 4
- 2. Lexical Analysis of Messages ............................... 5
- 2.1. General Description ...................................... 5
- 2.1.1. Line Length Limits ..................................... 6
- 2.2. Header Fields ............................................ 7
- 2.2.1. Unstructured Header Field Bodies ....................... 7
- 2.2.2. Structured Header Field Bodies ......................... 7
- 2.2.3. Long Header Fields ..................................... 7
- 2.3. Body ..................................................... 8
- 3. Syntax ..................................................... 9
- 3.1. Introduction ............................................. 9
- 3.2. Lexical Tokens ........................................... 9
-
-
-
-Resnick Standards Track [Page 1]
-
-RFC 2822 Internet Message Format April 2001
-
-
- 3.2.1. Primitive Tokens ....................................... 9
- 3.2.2. Quoted characters ......................................10
- 3.2.3. Folding white space and comments .......................11
- 3.2.4. Atom ...................................................12
- 3.2.5. Quoted strings .........................................13
- 3.2.6. Miscellaneous tokens ...................................13
- 3.3. Date and Time Specification ..............................14
- 3.4. Address Specification ....................................15
- 3.4.1. Addr-spec specification ................................16
- 3.5 Overall message syntax ....................................17
- 3.6. Field definitions ........................................18
- 3.6.1. The origination date field .............................20
- 3.6.2. Originator fields ......................................21
- 3.6.3. Destination address fields .............................22
- 3.6.4. Identification fields ..................................23
- 3.6.5. Informational fields ...................................26
- 3.6.6. Resent fields ..........................................26
- 3.6.7. Trace fields ...........................................28
- 3.6.8. Optional fields ........................................29
- 4. Obsolete Syntax ............................................29
- 4.1. Miscellaneous obsolete tokens ............................30
- 4.2. Obsolete folding white space .............................31
- 4.3. Obsolete Date and Time ...................................31
- 4.4. Obsolete Addressing ......................................33
- 4.5. Obsolete header fields ...................................33
- 4.5.1. Obsolete origination date field ........................34
- 4.5.2. Obsolete originator fields .............................34
- 4.5.3. Obsolete destination address fields ....................34
- 4.5.4. Obsolete identification fields .........................35
- 4.5.5. Obsolete informational fields ..........................35
- 4.5.6. Obsolete resent fields .................................35
- 4.5.7. Obsolete trace fields ..................................36
- 4.5.8. Obsolete optional fields ...............................36
- 5. Security Considerations ....................................36
- 6. Bibliography ...............................................37
- 7. Editor's Address ...........................................38
- 8. Acknowledgements ...........................................39
- Appendix A. Example messages ..................................41
- A.1. Addressing examples ......................................41
- A.1.1. A message from one person to another with simple
- addressing .............................................41
- A.1.2. Different types of mailboxes ...........................42
- A.1.3. Group addresses ........................................43
- A.2. Reply messages ...........................................43
- A.3. Resent messages ..........................................44
- A.4. Messages with trace fields ...............................46
- A.5. White space, comments, and other oddities ................47
- A.6. Obsoleted forms ..........................................47
-
-
-
-Resnick Standards Track [Page 2]
-
-RFC 2822 Internet Message Format April 2001
-
-
- A.6.1. Obsolete addressing ....................................48
- A.6.2. Obsolete dates .........................................48
- A.6.3. Obsolete white space and comments ......................48
- Appendix B. Differences from earlier standards ................49
- Appendix C. Notices ...........................................50
- Full Copyright Statement ......................................51
-
-1. Introduction
-
-1.1. Scope
-
- This standard specifies a syntax for text messages that are sent
- between computer users, within the framework of "electronic mail"
- messages. This standard supersedes the one specified in Request For
- Comments (RFC) 822, "Standard for the Format of ARPA Internet Text
- Messages" [RFC822], updating it to reflect current practice and
- incorporating incremental changes that were specified in other RFCs
- [STD3].
-
- This standard specifies a syntax only for text messages. In
- particular, it makes no provision for the transmission of images,
- audio, or other sorts of structured data in electronic mail messages.
- There are several extensions published, such as the MIME document
- series [RFC2045, RFC2046, RFC2049], which describe mechanisms for the
- transmission of such data through electronic mail, either by
- extending the syntax provided here or by structuring such messages to
- conform to this syntax. Those mechanisms are outside of the scope of
- this standard.
-
- In the context of electronic mail, messages are viewed as having an
- envelope and contents. The envelope contains whatever information is
- needed to accomplish transmission and delivery. (See [RFC2821] for a
- discussion of the envelope.) The contents comprise the object to be
- delivered to the recipient. This standard applies only to the format
- and some of the semantics of message contents. It contains no
- specification of the information in the envelope.
-
- However, some message systems may use information from the contents
- to create the envelope. It is intended that this standard facilitate
- the acquisition of such information by programs.
-
- This specification is intended as a definition of what message
- content format is to be passed between systems. Though some message
- systems locally store messages in this format (which eliminates the
- need for translation between formats) and others use formats that
- differ from the one specified in this standard, local storage is
- outside of the scope of this standard.
-
-
-
-
-Resnick Standards Track [Page 3]
-
-RFC 2822 Internet Message Format April 2001
-
-
- Note: This standard is not intended to dictate the internal formats
- used by sites, the specific message system features that they are
- expected to support, or any of the characteristics of user interface
- programs that create or read messages. In addition, this standard
- does not specify an encoding of the characters for either transport
- or storage; that is, it does not specify the number of bits used or
- how those bits are specifically transferred over the wire or stored
- on disk.
-
-1.2. Notational conventions
-
-1.2.1. Requirements notation
-
- This document occasionally uses terms that appear in capital letters.
- When the terms "MUST", "SHOULD", "RECOMMENDED", "MUST NOT", "SHOULD
- NOT", and "MAY" appear capitalized, they are being used to indicate
- particular requirements of this specification. A discussion of the
- meanings of these terms appears in [RFC2119].
-
-1.2.2. Syntactic notation
-
- This standard uses the Augmented Backus-Naur Form (ABNF) notation
- specified in [RFC2234] for the formal definitions of the syntax of
- messages. Characters will be specified either by a decimal value
- (e.g., the value %d65 for uppercase A and %d97 for lowercase A) or by
- a case-insensitive literal value enclosed in quotation marks (e.g.,
- "A" for either uppercase or lowercase A). See [RFC2234] for the full
- description of the notation.
-
-1.3. Structure of this document
-
- This document is divided into several sections.
-
- This section, section 1, is a short introduction to the document.
-
- Section 2 lays out the general description of a message and its
- constituent parts. This is an overview to help the reader understand
- some of the general principles used in the later portions of this
- document. Any examples in this section MUST NOT be taken as
- specification of the formal syntax of any part of a message.
-
- Section 3 specifies formal ABNF rules for the structure of each part
- of a message (the syntax) and describes the relationship between
- those parts and their meaning in the context of a message (the
- semantics). That is, it describes the actual rules for the structure
- of each part of a message (the syntax) as well as a description of
- the parts and instructions on how they ought to be interpreted (the
- semantics). This includes analysis of the syntax and semantics of
-
-
-
-Resnick Standards Track [Page 4]
-
-RFC 2822 Internet Message Format April 2001
-
-
- subparts of messages that have specific structure. The syntax
- included in section 3 represents messages as they MUST be created.
- There are also notes in section 3 to indicate if any of the options
- specified in the syntax SHOULD be used over any of the others.
-
- Both sections 2 and 3 describe messages that are legal to generate
- for purposes of this standard.
-
- Section 4 of this document specifies an "obsolete" syntax. There are
- references in section 3 to these obsolete syntactic elements. The
- rules of the obsolete syntax are elements that have appeared in
- earlier revisions of this standard or have previously been widely
- used in Internet messages. As such, these elements MUST be
- interpreted by parsers of messages in order to be conformant to this
- standard. However, since items in this syntax have been determined
- to be non-interoperable or to cause significant problems for
- recipients of messages, they MUST NOT be generated by creators of
- conformant messages.
-
- Section 5 details security considerations to take into account when
- implementing this standard.
-
- Section 6 is a bibliography of references in this document.
-
- Section 7 contains the editor's address.
-
- Section 8 contains acknowledgements.
-
- Appendix A lists examples of different sorts of messages. These
- examples are not exhaustive of the types of messages that appear on
- the Internet, but give a broad overview of certain syntactic forms.
-
- Appendix B lists the differences between this standard and earlier
- standards for Internet messages.
-
- Appendix C has copyright and intellectual property notices.
-
-2. Lexical Analysis of Messages
-
-2.1. General Description
-
- At the most basic level, a message is a series of characters. A
- message that is conformant with this standard is comprised of
- characters with values in the range 1 through 127 and interpreted as
- US-ASCII characters [ASCII]. For brevity, this document sometimes
- refers to this range of characters as simply "US-ASCII characters".
-
-
-
-
-
-Resnick Standards Track [Page 5]
-
-RFC 2822 Internet Message Format April 2001
-
-
- Note: This standard specifies that messages are made up of characters
- in the US-ASCII range of 1 through 127. There are other documents,
- specifically the MIME document series [RFC2045, RFC2046, RFC2047,
- RFC2048, RFC2049], that extend this standard to allow for values
- outside of that range. Discussion of those mechanisms is not within
- the scope of this standard.
-
- Messages are divided into lines of characters. A line is a series of
- characters that is delimited with the two characters carriage-return
- and line-feed; that is, the carriage return (CR) character (ASCII
- value 13) followed immediately by the line feed (LF) character (ASCII
- value 10). (The carriage-return/line-feed pair is usually written in
- this document as "CRLF".)
-
- A message consists of header fields (collectively called "the header
- of the message") followed, optionally, by a body. The header is a
- sequence of lines of characters with special syntax as defined in
- this standard. The body is simply a sequence of characters that
- follows the header and is separated from the header by an empty line
- (i.e., a line with nothing preceding the CRLF).
-
-2.1.1. Line Length Limits
-
- There are two limits that this standard places on the number of
- characters in a line. Each line of characters MUST be no more than
- 998 characters, and SHOULD be no more than 78 characters, excluding
- the CRLF.
-
- The 998 character limit is due to limitations in many implementations
- which send, receive, or store Internet Message Format messages that
- simply cannot handle more than 998 characters on a line. Receiving
- implementations would do well to handle an arbitrarily large number
- of characters in a line for robustness sake. However, there are so
- many implementations which (in compliance with the transport
- requirements of [RFC2821]) do not accept messages containing more
- than 1000 character including the CR and LF per line, it is important
- for implementations not to create such messages.
-
- The more conservative 78 character recommendation is to accommodate
- the many implementations of user interfaces that display these
- messages which may truncate, or disastrously wrap, the display of
- more than 78 characters per line, in spite of the fact that such
- implementations are non-conformant to the intent of this
- specification (and that of [RFC2821] if they actually cause
- information to be lost). Again, even though this limitation is put on
- messages, it is encumbant upon implementations which display messages
-
-
-
-
-
-Resnick Standards Track [Page 6]
-
-RFC 2822 Internet Message Format April 2001
-
-
- to handle an arbitrarily large number of characters in a line
- (certainly at least up to the 998 character limit) for the sake of
- robustness.
-
-2.2. Header Fields
-
- Header fields are lines composed of a field name, followed by a colon
- (":"), followed by a field body, and terminated by CRLF. A field
- name MUST be composed of printable US-ASCII characters (i.e.,
- characters that have values between 33 and 126, inclusive), except
- colon. A field body may be composed of any US-ASCII characters,
- except for CR and LF. However, a field body may contain CRLF when
- used in header "folding" and "unfolding" as described in section
- 2.2.3. All field bodies MUST conform to the syntax described in
- sections 3 and 4 of this standard.
-
-2.2.1. Unstructured Header Field Bodies
-
- Some field bodies in this standard are defined simply as
- "unstructured" (which is specified below as any US-ASCII characters,
- except for CR and LF) with no further restrictions. These are
- referred to as unstructured field bodies. Semantically, unstructured
- field bodies are simply to be treated as a single line of characters
- with no further processing (except for header "folding" and
- "unfolding" as described in section 2.2.3).
-
-2.2.2. Structured Header Field Bodies
-
- Some field bodies in this standard have specific syntactical
- structure more restrictive than the unstructured field bodies
- described above. These are referred to as "structured" field bodies.
- Structured field bodies are sequences of specific lexical tokens as
- described in sections 3 and 4 of this standard. Many of these tokens
- are allowed (according to their syntax) to be introduced or end with
- comments (as described in section 3.2.3) as well as the space (SP,
- ASCII value 32) and horizontal tab (HTAB, ASCII value 9) characters
- (together known as the white space characters, WSP), and those WSP
- characters are subject to header "folding" and "unfolding" as
- described in section 2.2.3. Semantic analysis of structured field
- bodies is given along with their syntax.
-
-2.2.3. Long Header Fields
-
- Each header field is logically a single line of characters comprising
- the field name, the colon, and the field body. For convenience
- however, and to deal with the 998/78 character limitations per line,
- the field body portion of a header field can be split into a multiple
- line representation; this is called "folding". The general rule is
-
-
-
-Resnick Standards Track [Page 7]
-
-RFC 2822 Internet Message Format April 2001
-
-
- that wherever this standard allows for folding white space (not
- simply WSP characters), a CRLF may be inserted before any WSP. For
- example, the header field:
-
- Subject: This is a test
-
- can be represented as:
-
- Subject: This
- is a test
-
- Note: Though structured field bodies are defined in such a way that
- folding can take place between many of the lexical tokens (and even
- within some of the lexical tokens), folding SHOULD be limited to
- placing the CRLF at higher-level syntactic breaks. For instance, if
- a field body is defined as comma-separated values, it is recommended
- that folding occur after the comma separating the structured items in
- preference to other places where the field could be folded, even if
- it is allowed elsewhere.
-
- The process of moving from this folded multiple-line representation
- of a header field to its single line representation is called
- "unfolding". Unfolding is accomplished by simply removing any CRLF
- that is immediately followed by WSP. Each header field should be
- treated in its unfolded form for further syntactic and semantic
- evaluation.
-
-2.3. Body
-
- The body of a message is simply lines of US-ASCII characters. The
- only two limitations on the body are as follows:
-
- - CR and LF MUST only occur together as CRLF; they MUST NOT appear
- independently in the body.
-
- - Lines of characters in the body MUST be limited to 998 characters,
- and SHOULD be limited to 78 characters, excluding the CRLF.
-
- Note: As was stated earlier, there are other standards documents,
- specifically the MIME documents [RFC2045, RFC2046, RFC2048, RFC2049]
- that extend this standard to allow for different sorts of message
- bodies. Again, these mechanisms are beyond the scope of this
- document.
-
-
-
-
-
-
-
-
-Resnick Standards Track [Page 8]
-
-RFC 2822 Internet Message Format April 2001
-
-
-3. Syntax
-
-3.1. Introduction
-
- The syntax as given in this section defines the legal syntax of
- Internet messages. Messages that are conformant to this standard
- MUST conform to the syntax in this section. If there are options in
- this section where one option SHOULD be generated, that is indicated
- either in the prose or in a comment next to the syntax.
-
- For the defined expressions, a short description of the syntax and
- use is given, followed by the syntax in ABNF, followed by a semantic
- analysis. Primitive tokens that are used but otherwise unspecified
- come from [RFC2234].
-
- In some of the definitions, there will be nonterminals whose names
- start with "obs-". These "obs-" elements refer to tokens defined in
- the obsolete syntax in section 4. In all cases, these productions
- are to be ignored for the purposes of generating legal Internet
- messages and MUST NOT be used as part of such a message. However,
- when interpreting messages, these tokens MUST be honored as part of
- the legal syntax. In this sense, section 3 defines a grammar for
- generation of messages, with "obs-" elements that are to be ignored,
- while section 4 adds grammar for interpretation of messages.
-
-3.2. Lexical Tokens
-
- The following rules are used to define an underlying lexical
- analyzer, which feeds tokens to the higher-level parsers. This
- section defines the tokens used in structured header field bodies.
-
- Note: Readers of this standard need to pay special attention to how
- these lexical tokens are used in both the lower-level and
- higher-level syntax later in the document. Particularly, the white
- space tokens and the comment tokens defined in section 3.2.3 get used
- in the lower-level tokens defined here, and those lower-level tokens
- are in turn used as parts of the higher-level tokens defined later.
- Therefore, the white space and comments may be allowed in the
- higher-level tokens even though they may not explicitly appear in a
- particular definition.
-
-3.2.1. Primitive Tokens
-
- The following are primitive tokens referred to elsewhere in this
- standard, but not otherwise defined in [RFC2234]. Some of them will
- not appear anywhere else in the syntax, but they are convenient to
- refer to in other parts of this document.
-
-
-
-
-Resnick Standards Track [Page 9]
-
-RFC 2822 Internet Message Format April 2001
-
-
- Note: The "specials" below are just such an example. Though the
- specials token does not appear anywhere else in this standard, it is
- useful for implementers who use tools that lexically analyze
- messages. Each of the characters in specials can be used to indicate
- a tokenization point in lexical analysis.
-
-NO-WS-CTL = %d1-8 / ; US-ASCII control characters
- %d11 / ; that do not include the
- %d12 / ; carriage return, line feed,
- %d14-31 / ; and white space characters
- %d127
-
-text = %d1-9 / ; Characters excluding CR and LF
- %d11 /
- %d12 /
- %d14-127 /
- obs-text
-
-specials = "(" / ")" / ; Special characters used in
- "<" / ">" / ; other parts of the syntax
- "[" / "]" /
- ":" / ";" /
- "@" / "\" /
- "," / "." /
- DQUOTE
-
- No special semantics are attached to these tokens. They are simply
- single characters.
-
-3.2.2. Quoted characters
-
- Some characters are reserved for special interpretation, such as
- delimiting lexical tokens. To permit use of these characters as
- uninterpreted data, a quoting mechanism is provided.
-
-quoted-pair = ("\" text) / obs-qp
-
- Where any quoted-pair appears, it is to be interpreted as the text
- character alone. That is to say, the "\" character that appears as
- part of a quoted-pair is semantically "invisible".
-
- Note: The "\" character may appear in a message where it is not part
- of a quoted-pair. A "\" character that does not appear in a
- quoted-pair is not semantically invisible. The only places in this
- standard where quoted-pair currently appears are ccontent, qcontent,
- dcontent, no-fold-quote, and no-fold-literal.
-
-
-
-
-
-Resnick Standards Track [Page 10]
-
-RFC 2822 Internet Message Format April 2001
-
-
-3.2.3. Folding white space and comments
-
- White space characters, including white space used in folding
- (described in section 2.2.3), may appear between many elements in
- header field bodies. Also, strings of characters that are treated as
- comments may be included in structured field bodies as characters
- enclosed in parentheses. The following defines the folding white
- space (FWS) and comment constructs.
-
- Strings of characters enclosed in parentheses are considered comments
- so long as they do not appear within a "quoted-string", as defined in
- section 3.2.5. Comments may nest.
-
- There are several places in this standard where comments and FWS may
- be freely inserted. To accommodate that syntax, an additional token
- for "CFWS" is defined for places where comments and/or FWS can occur.
- However, where CFWS occurs in this standard, it MUST NOT be inserted
- in such a way that any line of a folded header field is made up
- entirely of WSP characters and nothing else.
-
-FWS = ([*WSP CRLF] 1*WSP) / ; Folding white space
- obs-FWS
-
-ctext = NO-WS-CTL / ; Non white space controls
-
- %d33-39 / ; The rest of the US-ASCII
- %d42-91 / ; characters not including "(",
- %d93-126 ; ")", or "\"
-
-ccontent = ctext / quoted-pair / comment
-
-comment = "(" *([FWS] ccontent) [FWS] ")"
-
-CFWS = *([FWS] comment) (([FWS] comment) / FWS)
-
- Throughout this standard, where FWS (the folding white space token)
- appears, it indicates a place where header folding, as discussed in
- section 2.2.3, may take place. Wherever header folding appears in a
- message (that is, a header field body containing a CRLF followed by
- any WSP), header unfolding (removal of the CRLF) is performed before
- any further lexical analysis is performed on that header field
- according to this standard. That is to say, any CRLF that appears in
- FWS is semantically "invisible."
-
- A comment is normally used in a structured field body to provide some
- human readable informational text. Since a comment is allowed to
- contain FWS, folding is permitted within the comment. Also note that
- since quoted-pair is allowed in a comment, the parentheses and
-
-
-
-Resnick Standards Track [Page 11]
-
-RFC 2822 Internet Message Format April 2001
-
-
- backslash characters may appear in a comment so long as they appear
- as a quoted-pair. Semantically, the enclosing parentheses are not
- part of the comment; the comment is what is contained between the two
- parentheses. As stated earlier, the "\" in any quoted-pair and the
- CRLF in any FWS that appears within the comment are semantically
- "invisible" and therefore not part of the comment either.
-
- Runs of FWS, comment or CFWS that occur between lexical tokens in a
- structured field header are semantically interpreted as a single
- space character.
-
-3.2.4. Atom
-
- Several productions in structured header field bodies are simply
- strings of certain basic characters. Such productions are called
- atoms.
-
- Some of the structured header field bodies also allow the period
- character (".", ASCII value 46) within runs of atext. An additional
- "dot-atom" token is defined for those purposes.
-
-atext = ALPHA / DIGIT / ; Any character except controls,
- "!" / "#" / ; SP, and specials.
- "$" / "%" / ; Used for atoms
- "&" / "'" /
- "*" / "+" /
- "-" / "/" /
- "=" / "?" /
- "^" / "_" /
- "`" / "{" /
- "|" / "}" /
- "~"
-
-atom = [CFWS] 1*atext [CFWS]
-
-dot-atom = [CFWS] dot-atom-text [CFWS]
-
-dot-atom-text = 1*atext *("." 1*atext)
-
- Both atom and dot-atom are interpreted as a single unit, comprised of
- the string of characters that make it up. Semantically, the optional
- comments and FWS surrounding the rest of the characters are not part
- of the atom; the atom is only the run of atext characters in an atom,
- or the atext and "." characters in a dot-atom.
-
-
-
-
-
-
-
-Resnick Standards Track [Page 12]
-
-RFC 2822 Internet Message Format April 2001
-
-
-3.2.5. Quoted strings
-
- Strings of characters that include characters other than those
- allowed in atoms may be represented in a quoted string format, where
- the characters are surrounded by quote (DQUOTE, ASCII value 34)
- characters.
-
-qtext = NO-WS-CTL / ; Non white space controls
-
- %d33 / ; The rest of the US-ASCII
- %d35-91 / ; characters not including "\"
- %d93-126 ; or the quote character
-
-qcontent = qtext / quoted-pair
-
-quoted-string = [CFWS]
- DQUOTE *([FWS] qcontent) [FWS] DQUOTE
- [CFWS]
-
- A quoted-string is treated as a unit. That is, quoted-string is
- identical to atom, semantically. Since a quoted-string is allowed to
- contain FWS, folding is permitted. Also note that since quoted-pair
- is allowed in a quoted-string, the quote and backslash characters may
- appear in a quoted-string so long as they appear as a quoted-pair.
-
- Semantically, neither the optional CFWS outside of the quote
- characters nor the quote characters themselves are part of the
- quoted-string; the quoted-string is what is contained between the two
- quote characters. As stated earlier, the "\" in any quoted-pair and
- the CRLF in any FWS/CFWS that appears within the quoted-string are
- semantically "invisible" and therefore not part of the quoted-string
- either.
-
-3.2.6. Miscellaneous tokens
-
- Three additional tokens are defined, word and phrase for combinations
- of atoms and/or quoted-strings, and unstructured for use in
- unstructured header fields and in some places within structured
- header fields.
-
-word = atom / quoted-string
-
-phrase = 1*word / obs-phrase
-
-
-
-
-
-
-
-
-Resnick Standards Track [Page 13]
-
-RFC 2822 Internet Message Format April 2001
-
-
-utext = NO-WS-CTL / ; Non white space controls
- %d33-126 / ; The rest of US-ASCII
- obs-utext
-
-unstructured = *([FWS] utext) [FWS]
-
-3.3. Date and Time Specification
-
- Date and time occur in several header fields. This section specifies
- the syntax for a full date and time specification. Though folding
- white space is permitted throughout the date-time specification, it
- is RECOMMENDED that a single space be used in each place that FWS
- appears (whether it is required or optional); some older
- implementations may not interpret other occurrences of folding white
- space correctly.
-
-date-time = [ day-of-week "," ] date FWS time [CFWS]
-
-day-of-week = ([FWS] day-name) / obs-day-of-week
-
-day-name = "Mon" / "Tue" / "Wed" / "Thu" /
- "Fri" / "Sat" / "Sun"
-
-date = day month year
-
-year = 4*DIGIT / obs-year
-
-month = (FWS month-name FWS) / obs-month
-
-month-name = "Jan" / "Feb" / "Mar" / "Apr" /
- "May" / "Jun" / "Jul" / "Aug" /
- "Sep" / "Oct" / "Nov" / "Dec"
-
-day = ([FWS] 1*2DIGIT) / obs-day
-
-time = time-of-day FWS zone
-
-time-of-day = hour ":" minute [ ":" second ]
-
-hour = 2DIGIT / obs-hour
-
-minute = 2DIGIT / obs-minute
-
-second = 2DIGIT / obs-second
-
-zone = (( "+" / "-" ) 4DIGIT) / obs-zone
-
-
-
-
-
-Resnick Standards Track [Page 14]
-
-RFC 2822 Internet Message Format April 2001
-
-
- The day is the numeric day of the month. The year is any numeric
- year 1900 or later.
-
- The time-of-day specifies the number of hours, minutes, and
- optionally seconds since midnight of the date indicated.
-
- The date and time-of-day SHOULD express local time.
-
- The zone specifies the offset from Coordinated Universal Time (UTC,
- formerly referred to as "Greenwich Mean Time") that the date and
- time-of-day represent. The "+" or "-" indicates whether the
- time-of-day is ahead of (i.e., east of) or behind (i.e., west of)
- Universal Time. The first two digits indicate the number of hours
- difference from Universal Time, and the last two digits indicate the
- number of minutes difference from Universal Time. (Hence, +hhmm
- means +(hh * 60 + mm) minutes, and -hhmm means -(hh * 60 + mm)
- minutes). The form "+0000" SHOULD be used to indicate a time zone at
- Universal Time. Though "-0000" also indicates Universal Time, it is
- used to indicate that the time was generated on a system that may be
- in a local time zone other than Universal Time and therefore
- indicates that the date-time contains no information about the local
- time zone.
-
- A date-time specification MUST be semantically valid. That is, the
- day-of-the-week (if included) MUST be the day implied by the date,
- the numeric day-of-month MUST be between 1 and the number of days
- allowed for the specified month (in the specified year), the
- time-of-day MUST be in the range 00:00:00 through 23:59:60 (the
- number of seconds allowing for a leap second; see [STD12]), and the
- zone MUST be within the range -9959 through +9959.
-
-3.4. Address Specification
-
- Addresses occur in several message header fields to indicate senders
- and recipients of messages. An address may either be an individual
- mailbox, or a group of mailboxes.
-
-address = mailbox / group
-
-mailbox = name-addr / addr-spec
-
-name-addr = [display-name] angle-addr
-
-angle-addr = [CFWS] "<" addr-spec ">" [CFWS] / obs-angle-addr
-
-group = display-name ":" [mailbox-list / CFWS] ";"
- [CFWS]
-
-
-
-
-Resnick Standards Track [Page 15]
-
-RFC 2822 Internet Message Format April 2001
-
-
-display-name = phrase
-
-mailbox-list = (mailbox *("," mailbox)) / obs-mbox-list
-
-address-list = (address *("," address)) / obs-addr-list
-
- A mailbox receives mail. It is a conceptual entity which does not
- necessarily pertain to file storage. For example, some sites may
- choose to print mail on a printer and deliver the output to the
- addressee's desk. Normally, a mailbox is comprised of two parts: (1)
- an optional display name that indicates the name of the recipient
- (which could be a person or a system) that could be displayed to the
- user of a mail application, and (2) an addr-spec address enclosed in
- angle brackets ("<" and ">"). There is also an alternate simple form
- of a mailbox where the addr-spec address appears alone, without the
- recipient's name or the angle brackets. The Internet addr-spec
- address is described in section 3.4.1.
-
- Note: Some legacy implementations used the simple form where the
- addr-spec appears without the angle brackets, but included the name
- of the recipient in parentheses as a comment following the addr-spec.
- Since the meaning of the information in a comment is unspecified,
- implementations SHOULD use the full name-addr form of the mailbox,
- instead of the legacy form, to specify the display name associated
- with a mailbox. Also, because some legacy implementations interpret
- the comment, comments generally SHOULD NOT be used in address fields
- to avoid confusing such implementations.
-
- When it is desirable to treat several mailboxes as a single unit
- (i.e., in a distribution list), the group construct can be used. The
- group construct allows the sender to indicate a named group of
- recipients. This is done by giving a display name for the group,
- followed by a colon, followed by a comma separated list of any number
- of mailboxes (including zero and one), and ending with a semicolon.
- Because the list of mailboxes can be empty, using the group construct
- is also a simple way to communicate to recipients that the message
- was sent to one or more named sets of recipients, without actually
- providing the individual mailbox address for each of those
- recipients.
-
-3.4.1. Addr-spec specification
-
- An addr-spec is a specific Internet identifier that contains a
- locally interpreted string followed by the at-sign character ("@",
- ASCII value 64) followed by an Internet domain. The locally
- interpreted string is either a quoted-string or a dot-atom. If the
- string can be represented as a dot-atom (that is, it contains no
- characters other than atext characters or "." surrounded by atext
-
-
-
-Resnick Standards Track [Page 16]
-
-RFC 2822 Internet Message Format April 2001
-
-
- characters), then the dot-atom form SHOULD be used and the
- quoted-string form SHOULD NOT be used. Comments and folding white
- space SHOULD NOT be used around the "@" in the addr-spec.
-
-addr-spec = local-part "@" domain
-
-local-part = dot-atom / quoted-string / obs-local-part
-
-domain = dot-atom / domain-literal / obs-domain
-
-domain-literal = [CFWS] "[" *([FWS] dcontent) [FWS] "]" [CFWS]
-
-dcontent = dtext / quoted-pair
-
-dtext = NO-WS-CTL / ; Non white space controls
-
- %d33-90 / ; The rest of the US-ASCII
- %d94-126 ; characters not including "[",
- ; "]", or "\"
-
- The domain portion identifies the point to which the mail is
- delivered. In the dot-atom form, this is interpreted as an Internet
- domain name (either a host name or a mail exchanger name) as
- described in [STD3, STD13, STD14]. In the domain-literal form, the
- domain is interpreted as the literal Internet address of the
- particular host. In both cases, how addressing is used and how
- messages are transported to a particular host is covered in the mail
- transport document [RFC2821]. These mechanisms are outside of the
- scope of this document.
-
- The local-part portion is a domain dependent string. In addresses,
- it is simply interpreted on the particular host as a name of a
- particular mailbox.
-
-3.5 Overall message syntax
-
- A message consists of header fields, optionally followed by a message
- body. Lines in a message MUST be a maximum of 998 characters
- excluding the CRLF, but it is RECOMMENDED that lines be limited to 78
- characters excluding the CRLF. (See section 2.1.1 for explanation.)
- In a message body, though all of the characters listed in the text
- rule MAY be used, the use of US-ASCII control characters (values 1
- through 8, 11, 12, and 14 through 31) is discouraged since their
- interpretation by receivers for display is not guaranteed.
-
-
-
-
-
-
-
-Resnick Standards Track [Page 17]
-
-RFC 2822 Internet Message Format April 2001
-
-
-message = (fields / obs-fields)
- [CRLF body]
-
-body = *(*998text CRLF) *998text
-
- The header fields carry most of the semantic information and are
- defined in section 3.6. The body is simply a series of lines of text
- which are uninterpreted for the purposes of this standard.
-
-3.6. Field definitions
-
- The header fields of a message are defined here. All header fields
- have the same general syntactic structure: A field name, followed by
- a colon, followed by the field body. The specific syntax for each
- header field is defined in the subsequent sections.
-
- Note: In the ABNF syntax for each field in subsequent sections, each
- field name is followed by the required colon. However, for brevity
- sometimes the colon is not referred to in the textual description of
- the syntax. It is, nonetheless, required.
-
- It is important to note that the header fields are not guaranteed to
- be in a particular order. They may appear in any order, and they
- have been known to be reordered occasionally when transported over
- the Internet. However, for the purposes of this standard, header
- fields SHOULD NOT be reordered when a message is transported or
- transformed. More importantly, the trace header fields and resent
- header fields MUST NOT be reordered, and SHOULD be kept in blocks
- prepended to the message. See sections 3.6.6 and 3.6.7 for more
- information.
-
- The only required header fields are the origination date field and
- the originator address field(s). All other header fields are
- syntactically optional. More information is contained in the table
- following this definition.
-
-fields = *(trace
- *(resent-date /
- resent-from /
- resent-sender /
- resent-to /
- resent-cc /
- resent-bcc /
- resent-msg-id))
- *(orig-date /
- from /
- sender /
- reply-to /
-
-
-
-Resnick Standards Track [Page 18]
-
-RFC 2822 Internet Message Format April 2001
-
-
- to /
- cc /
- bcc /
- message-id /
- in-reply-to /
- references /
- subject /
- comments /
- keywords /
- optional-field)
-
- The following table indicates limits on the number of times each
- field may occur in a message header as well as any special
- limitations on the use of those fields. An asterisk next to a value
- in the minimum or maximum column indicates that a special restriction
- appears in the Notes column.
-
-Field Min number Max number Notes
-
-trace 0 unlimited Block prepended - see
- 3.6.7
-
-resent-date 0* unlimited* One per block, required
- if other resent fields
- present - see 3.6.6
-
-resent-from 0 unlimited* One per block - see
- 3.6.6
-
-resent-sender 0* unlimited* One per block, MUST
- occur with multi-address
- resent-from - see 3.6.6
-
-resent-to 0 unlimited* One per block - see
- 3.6.6
-
-resent-cc 0 unlimited* One per block - see
- 3.6.6
-
-resent-bcc 0 unlimited* One per block - see
- 3.6.6
-
-resent-msg-id 0 unlimited* One per block - see
- 3.6.6
-
-orig-date 1 1
-
-from 1 1 See sender and 3.6.2
-
-
-
-Resnick Standards Track [Page 19]
-
-RFC 2822 Internet Message Format April 2001
-
-
-sender 0* 1 MUST occur with multi-
- address from - see 3.6.2
-
-reply-to 0 1
-
-to 0 1
-
-cc 0 1
-
-bcc 0 1
-
-message-id 0* 1 SHOULD be present - see
- 3.6.4
-
-in-reply-to 0* 1 SHOULD occur in some
- replies - see 3.6.4
-
-references 0* 1 SHOULD occur in some
- replies - see 3.6.4
-
-subject 0 1
-
-comments 0 unlimited
-
-keywords 0 unlimited
-
-optional-field 0 unlimited
-
- The exact interpretation of each field is described in subsequent
- sections.
-
-3.6.1. The origination date field
-
- The origination date field consists of the field name "Date" followed
- by a date-time specification.
-
-orig-date = "Date:" date-time CRLF
-
- The origination date specifies the date and time at which the creator
- of the message indicated that the message was complete and ready to
- enter the mail delivery system. For instance, this might be the time
- that a user pushes the "send" or "submit" button in an application
- program. In any case, it is specifically not intended to convey the
- time that the message is actually transported, but rather the time at
- which the human or other creator of the message has put the message
- into its final form, ready for transport. (For example, a portable
- computer user who is not connected to a network might queue a message
-
-
-
-
-Resnick Standards Track [Page 20]
-
-RFC 2822 Internet Message Format April 2001
-
-
- for delivery. The origination date is intended to contain the date
- and time that the user queued the message, not the time when the user
- connected to the network to send the message.)
-
-3.6.2. Originator fields
-
- The originator fields of a message consist of the from field, the
- sender field (when applicable), and optionally the reply-to field.
- The from field consists of the field name "From" and a
- comma-separated list of one or more mailbox specifications. If the
- from field contains more than one mailbox specification in the
- mailbox-list, then the sender field, containing the field name
- "Sender" and a single mailbox specification, MUST appear in the
- message. In either case, an optional reply-to field MAY also be
- included, which contains the field name "Reply-To" and a
- comma-separated list of one or more addresses.
-
-from = "From:" mailbox-list CRLF
-
-sender = "Sender:" mailbox CRLF
-
-reply-to = "Reply-To:" address-list CRLF
-
- The originator fields indicate the mailbox(es) of the source of the
- message. The "From:" field specifies the author(s) of the message,
- that is, the mailbox(es) of the person(s) or system(s) responsible
- for the writing of the message. The "Sender:" field specifies the
- mailbox of the agent responsible for the actual transmission of the
- message. For example, if a secretary were to send a message for
- another person, the mailbox of the secretary would appear in the
- "Sender:" field and the mailbox of the actual author would appear in
- the "From:" field. If the originator of the message can be indicated
- by a single mailbox and the author and transmitter are identical, the
- "Sender:" field SHOULD NOT be used. Otherwise, both fields SHOULD
- appear.
-
- The originator fields also provide the information required when
- replying to a message. When the "Reply-To:" field is present, it
- indicates the mailbox(es) to which the author of the message suggests
- that replies be sent. In the absence of the "Reply-To:" field,
- replies SHOULD by default be sent to the mailbox(es) specified in the
- "From:" field unless otherwise specified by the person composing the
- reply.
-
- In all cases, the "From:" field SHOULD NOT contain any mailbox that
- does not belong to the author(s) of the message. See also section
- 3.6.3 for more information on forming the destination addresses for a
- reply.
-
-
-
-Resnick Standards Track [Page 21]
-
-RFC 2822 Internet Message Format April 2001
-
-
-3.6.3. Destination address fields
-
- The destination fields of a message consist of three possible fields,
- each of the same form: The field name, which is either "To", "Cc", or
- "Bcc", followed by a comma-separated list of one or more addresses
- (either mailbox or group syntax).
-
-to = "To:" address-list CRLF
-
-cc = "Cc:" address-list CRLF
-
-bcc = "Bcc:" (address-list / [CFWS]) CRLF
-
- The destination fields specify the recipients of the message. Each
- destination field may have one or more addresses, and each of the
- addresses indicate the intended recipients of the message. The only
- difference between the three fields is how each is used.
-
- The "To:" field contains the address(es) of the primary recipient(s)
- of the message.
-
- The "Cc:" field (where the "Cc" means "Carbon Copy" in the sense of
- making a copy on a typewriter using carbon paper) contains the
- addresses of others who are to receive the message, though the
- content of the message may not be directed at them.
-
- The "Bcc:" field (where the "Bcc" means "Blind Carbon Copy") contains
- addresses of recipients of the message whose addresses are not to be
- revealed to other recipients of the message. There are three ways in
- which the "Bcc:" field is used. In the first case, when a message
- containing a "Bcc:" field is prepared to be sent, the "Bcc:" line is
- removed even though all of the recipients (including those specified
- in the "Bcc:" field) are sent a copy of the message. In the second
- case, recipients specified in the "To:" and "Cc:" lines each are sent
- a copy of the message with the "Bcc:" line removed as above, but the
- recipients on the "Bcc:" line get a separate copy of the message
- containing a "Bcc:" line. (When there are multiple recipient
- addresses in the "Bcc:" field, some implementations actually send a
- separate copy of the message to each recipient with a "Bcc:"
- containing only the address of that particular recipient.) Finally,
- since a "Bcc:" field may contain no addresses, a "Bcc:" field can be
- sent without any addresses indicating to the recipients that blind
- copies were sent to someone. Which method to use with "Bcc:" fields
- is implementation dependent, but refer to the "Security
- Considerations" section of this document for a discussion of each.
-
-
-
-
-
-
-Resnick Standards Track [Page 22]
-
-RFC 2822 Internet Message Format April 2001
-
-
- When a message is a reply to another message, the mailboxes of the
- authors of the original message (the mailboxes in the "From:" field)
- or mailboxes specified in the "Reply-To:" field (if it exists) MAY
- appear in the "To:" field of the reply since these would normally be
- the primary recipients of the reply. If a reply is sent to a message
- that has destination fields, it is often desirable to send a copy of
- the reply to all of the recipients of the message, in addition to the
- author. When such a reply is formed, addresses in the "To:" and
- "Cc:" fields of the original message MAY appear in the "Cc:" field of
- the reply, since these are normally secondary recipients of the
- reply. If a "Bcc:" field is present in the original message,
- addresses in that field MAY appear in the "Bcc:" field of the reply,
- but SHOULD NOT appear in the "To:" or "Cc:" fields.
-
- Note: Some mail applications have automatic reply commands that
- include the destination addresses of the original message in the
- destination addresses of the reply. How those reply commands behave
- is implementation dependent and is beyond the scope of this document.
- In particular, whether or not to include the original destination
- addresses when the original message had a "Reply-To:" field is not
- addressed here.
-
-3.6.4. Identification fields
-
- Though optional, every message SHOULD have a "Message-ID:" field.
- Furthermore, reply messages SHOULD have "In-Reply-To:" and
- "References:" fields as appropriate, as described below.
-
- The "Message-ID:" field contains a single unique message identifier.
- The "References:" and "In-Reply-To:" field each contain one or more
- unique message identifiers, optionally separated by CFWS.
-
- The message identifier (msg-id) is similar in syntax to an angle-addr
- construct without the internal CFWS.
-
-message-id = "Message-ID:" msg-id CRLF
-
-in-reply-to = "In-Reply-To:" 1*msg-id CRLF
-
-references = "References:" 1*msg-id CRLF
-
-msg-id = [CFWS] "<" id-left "@" id-right ">" [CFWS]
-
-id-left = dot-atom-text / no-fold-quote / obs-id-left
-
-id-right = dot-atom-text / no-fold-literal / obs-id-right
-
-no-fold-quote = DQUOTE *(qtext / quoted-pair) DQUOTE
-
-
-
-Resnick Standards Track [Page 23]
-
-RFC 2822 Internet Message Format April 2001
-
-
-no-fold-literal = "[" *(dtext / quoted-pair) "]"
-
- The "Message-ID:" field provides a unique message identifier that
- refers to a particular version of a particular message. The
- uniqueness of the message identifier is guaranteed by the host that
- generates it (see below). This message identifier is intended to be
- machine readable and not necessarily meaningful to humans. A message
- identifier pertains to exactly one instantiation of a particular
- message; subsequent revisions to the message each receive new message
- identifiers.
-
- Note: There are many instances when messages are "changed", but those
- changes do not constitute a new instantiation of that message, and
- therefore the message would not get a new message identifier. For
- example, when messages are introduced into the transport system, they
- are often prepended with additional header fields such as trace
- fields (described in section 3.6.7) and resent fields (described in
- section 3.6.6). The addition of such header fields does not change
- the identity of the message and therefore the original "Message-ID:"
- field is retained. In all cases, it is the meaning that the sender
- of the message wishes to convey (i.e., whether this is the same
- message or a different message) that determines whether or not the
- "Message-ID:" field changes, not any particular syntactic difference
- that appears (or does not appear) in the message.
-
- The "In-Reply-To:" and "References:" fields are used when creating a
- reply to a message. They hold the message identifier of the original
- message and the message identifiers of other messages (for example,
- in the case of a reply to a message which was itself a reply). The
- "In-Reply-To:" field may be used to identify the message (or
- messages) to which the new message is a reply, while the
- "References:" field may be used to identify a "thread" of
- conversation.
-
- When creating a reply to a message, the "In-Reply-To:" and
- "References:" fields of the resultant message are constructed as
- follows:
-
- The "In-Reply-To:" field will contain the contents of the "Message-
- ID:" field of the message to which this one is a reply (the "parent
- message"). If there is more than one parent message, then the "In-
- Reply-To:" field will contain the contents of all of the parents'
- "Message-ID:" fields. If there is no "Message-ID:" field in any of
- the parent messages, then the new message will have no "In-Reply-To:"
- field.
-
-
-
-
-
-
-Resnick Standards Track [Page 24]
-
-RFC 2822 Internet Message Format April 2001
-
-
- The "References:" field will contain the contents of the parent's
- "References:" field (if any) followed by the contents of the parent's
- "Message-ID:" field (if any). If the parent message does not contain
- a "References:" field but does have an "In-Reply-To:" field
- containing a single message identifier, then the "References:" field
- will contain the contents of the parent's "In-Reply-To:" field
- followed by the contents of the parent's "Message-ID:" field (if
- any). If the parent has none of the "References:", "In-Reply-To:",
- or "Message-ID:" fields, then the new message will have no
- "References:" field.
-
- Note: Some implementations parse the "References:" field to display
- the "thread of the discussion". These implementations assume that
- each new message is a reply to a single parent and hence that they
- can walk backwards through the "References:" field to find the parent
- of each message listed there. Therefore, trying to form a
- "References:" field for a reply that has multiple parents is
- discouraged and how to do so is not defined in this document.
-
- The message identifier (msg-id) itself MUST be a globally unique
- identifier for a message. The generator of the message identifier
- MUST guarantee that the msg-id is unique. There are several
- algorithms that can be used to accomplish this. Since the msg-id has
- a similar syntax to angle-addr (identical except that comments and
- folding white space are not allowed), a good method is to put the
- domain name (or a domain literal IP address) of the host on which the
- message identifier was created on the right hand side of the "@", and
- put a combination of the current absolute date and time along with
- some other currently unique (perhaps sequential) identifier available
- on the system (for example, a process id number) on the left hand
- side. Using a date on the left hand side and a domain name or domain
- literal on the right hand side makes it possible to guarantee
- uniqueness since no two hosts use the same domain name or IP address
- at the same time. Though other algorithms will work, it is
- RECOMMENDED that the right hand side contain some domain identifier
- (either of the host itself or otherwise) such that the generator of
- the message identifier can guarantee the uniqueness of the left hand
- side within the scope of that domain.
-
- Semantically, the angle bracket characters are not part of the
- msg-id; the msg-id is what is contained between the two angle bracket
- characters.
-
-
-
-
-
-
-
-
-
-Resnick Standards Track [Page 25]
-
-RFC 2822 Internet Message Format April 2001
-
-
-3.6.5. Informational fields
-
- The informational fields are all optional. The "Keywords:" field
- contains a comma-separated list of one or more words or
- quoted-strings. The "Subject:" and "Comments:" fields are
- unstructured fields as defined in section 2.2.1, and therefore may
- contain text or folding white space.
-
-subject = "Subject:" unstructured CRLF
-
-comments = "Comments:" unstructured CRLF
-
-keywords = "Keywords:" phrase *("," phrase) CRLF
-
- These three fields are intended to have only human-readable content
- with information about the message. The "Subject:" field is the most
- common and contains a short string identifying the topic of the
- message. When used in a reply, the field body MAY start with the
- string "Re: " (from the Latin "res", in the matter of) followed by
- the contents of the "Subject:" field body of the original message.
- If this is done, only one instance of the literal string "Re: " ought
- to be used since use of other strings or more than one instance can
- lead to undesirable consequences. The "Comments:" field contains any
- additional comments on the text of the body of the message. The
- "Keywords:" field contains a comma-separated list of important words
- and phrases that might be useful for the recipient.
-
-3.6.6. Resent fields
-
- Resent fields SHOULD be added to any message that is reintroduced by
- a user into the transport system. A separate set of resent fields
- SHOULD be added each time this is done. All of the resent fields
- corresponding to a particular resending of the message SHOULD be
- together. Each new set of resent fields is prepended to the message;
- that is, the most recent set of resent fields appear earlier in the
- message. No other fields in the message are changed when resent
- fields are added.
-
- Each of the resent fields corresponds to a particular field elsewhere
- in the syntax. For instance, the "Resent-Date:" field corresponds to
- the "Date:" field and the "Resent-To:" field corresponds to the "To:"
- field. In each case, the syntax for the field body is identical to
- the syntax given previously for the corresponding field.
-
- When resent fields are used, the "Resent-From:" and "Resent-Date:"
- fields MUST be sent. The "Resent-Message-ID:" field SHOULD be sent.
- "Resent-Sender:" SHOULD NOT be used if "Resent-Sender:" would be
- identical to "Resent-From:".
-
-
-
-Resnick Standards Track [Page 26]
-
-RFC 2822 Internet Message Format April 2001
-
-
-resent-date = "Resent-Date:" date-time CRLF
-
-resent-from = "Resent-From:" mailbox-list CRLF
-
-resent-sender = "Resent-Sender:" mailbox CRLF
-
-resent-to = "Resent-To:" address-list CRLF
-
-resent-cc = "Resent-Cc:" address-list CRLF
-
-resent-bcc = "Resent-Bcc:" (address-list / [CFWS]) CRLF
-
-resent-msg-id = "Resent-Message-ID:" msg-id CRLF
-
- Resent fields are used to identify a message as having been
- reintroduced into the transport system by a user. The purpose of
- using resent fields is to have the message appear to the final
- recipient as if it were sent directly by the original sender, with
- all of the original fields remaining the same. Each set of resent
- fields correspond to a particular resending event. That is, if a
- message is resent multiple times, each set of resent fields gives
- identifying information for each individual time. Resent fields are
- strictly informational. They MUST NOT be used in the normal
- processing of replies or other such automatic actions on messages.
-
- Note: Reintroducing a message into the transport system and using
- resent fields is a different operation from "forwarding".
- "Forwarding" has two meanings: One sense of forwarding is that a mail
- reading program can be told by a user to forward a copy of a message
- to another person, making the forwarded message the body of the new
- message. A forwarded message in this sense does not appear to have
- come from the original sender, but is an entirely new message from
- the forwarder of the message. On the other hand, forwarding is also
- used to mean when a mail transport program gets a message and
- forwards it on to a different destination for final delivery. Resent
- header fields are not intended for use with either type of
- forwarding.
-
- The resent originator fields indicate the mailbox of the person(s) or
- system(s) that resent the message. As with the regular originator
- fields, there are two forms: a simple "Resent-From:" form which
- contains the mailbox of the individual doing the resending, and the
- more complex form, when one individual (identified in the
- "Resent-Sender:" field) resends a message on behalf of one or more
- others (identified in the "Resent-From:" field).
-
- Note: When replying to a resent message, replies behave just as they
- would with any other message, using the original "From:",
-
-
-
-Resnick Standards Track [Page 27]
-
-RFC 2822 Internet Message Format April 2001
-
-
- "Reply-To:", "Message-ID:", and other fields. The resent fields are
- only informational and MUST NOT be used in the normal processing of
- replies.
-
- The "Resent-Date:" indicates the date and time at which the resent
- message is dispatched by the resender of the message. Like the
- "Date:" field, it is not the date and time that the message was
- actually transported.
-
- The "Resent-To:", "Resent-Cc:", and "Resent-Bcc:" fields function
- identically to the "To:", "Cc:", and "Bcc:" fields respectively,
- except that they indicate the recipients of the resent message, not
- the recipients of the original message.
-
- The "Resent-Message-ID:" field provides a unique identifier for the
- resent message.
-
-3.6.7. Trace fields
-
- The trace fields are a group of header fields consisting of an
- optional "Return-Path:" field, and one or more "Received:" fields.
- The "Return-Path:" header field contains a pair of angle brackets
- that enclose an optional addr-spec. The "Received:" field contains a
- (possibly empty) list of name/value pairs followed by a semicolon and
- a date-time specification. The first item of the name/value pair is
- defined by item-name, and the second item is either an addr-spec, an
- atom, a domain, or a msg-id. Further restrictions may be applied to
- the syntax of the trace fields by standards that provide for their
- use, such as [RFC2821].
-
-trace = [return]
- 1*received
-
-return = "Return-Path:" path CRLF
-
-path = ([CFWS] "<" ([CFWS] / addr-spec) ">" [CFWS]) /
- obs-path
-
-received = "Received:" name-val-list ";" date-time CRLF
-
-name-val-list = [CFWS] [name-val-pair *(CFWS name-val-pair)]
-
-name-val-pair = item-name CFWS item-value
-
-item-name = ALPHA *(["-"] (ALPHA / DIGIT))
-
-item-value = 1*angle-addr / addr-spec /
- atom / domain / msg-id
-
-
-
-Resnick Standards Track [Page 28]
-
-RFC 2822 Internet Message Format April 2001
-
-
- A full discussion of the Internet mail use of trace fields is
- contained in [RFC2821]. For the purposes of this standard, the trace
- fields are strictly informational, and any formal interpretation of
- them is outside of the scope of this document.
-
-3.6.8. Optional fields
-
- Fields may appear in messages that are otherwise unspecified in this
- standard. They MUST conform to the syntax of an optional-field.
- This is a field name, made up of the printable US-ASCII characters
- except SP and colon, followed by a colon, followed by any text which
- conforms to unstructured.
-
- The field names of any optional-field MUST NOT be identical to any
- field name specified elsewhere in this standard.
-
-optional-field = field-name ":" unstructured CRLF
-
-field-name = 1*ftext
-
-ftext = %d33-57 / ; Any character except
- %d59-126 ; controls, SP, and
- ; ":".
-
- For the purposes of this standard, any optional field is
- uninterpreted.
-
-4. Obsolete Syntax
-
- Earlier versions of this standard allowed for different (usually more
- liberal) syntax than is allowed in this version. Also, there have
- been syntactic elements used in messages on the Internet whose
- interpretation have never been documented. Though some of these
- syntactic forms MUST NOT be generated according to the grammar in
- section 3, they MUST be accepted and parsed by a conformant receiver.
- This section documents many of these syntactic elements. Taking the
- grammar in section 3 and adding the definitions presented in this
- section will result in the grammar to use for interpretation of
- messages.
-
- Note: This section identifies syntactic forms that any implementation
- MUST reasonably interpret. However, there are certainly Internet
- messages which do not conform to even the additional syntax given in
- this section. The fact that a particular form does not appear in any
- section of this document is not justification for computer programs
- to crash or for malformed data to be irretrievably lost by any
- implementation. To repeat an example, though this document requires
- lines in messages to be no longer than 998 characters, silently
-
-
-
-Resnick Standards Track [Page 29]
-
-RFC 2822 Internet Message Format April 2001
-
-
- discarding the 999th and subsequent characters in a line without
- warning would still be bad behavior for an implementation. It is up
- to the implementation to deal with messages robustly.
-
- One important difference between the obsolete (interpreting) and the
- current (generating) syntax is that in structured header field bodies
- (i.e., between the colon and the CRLF of any structured header
- field), white space characters, including folding white space, and
- comments can be freely inserted between any syntactic tokens. This
- allows many complex forms that have proven difficult for some
- implementations to parse.
-
- Another key difference between the obsolete and the current syntax is
- that the rule in section 3.2.3 regarding lines composed entirely of
- white space in comments and folding white space does not apply. See
- the discussion of folding white space in section 4.2 below.
-
- Finally, certain characters that were formerly allowed in messages
- appear in this section. The NUL character (ASCII value 0) was once
- allowed, but is no longer for compatibility reasons. CR and LF were
- allowed to appear in messages other than as CRLF; this use is also
- shown here.
-
- Other differences in syntax and semantics are noted in the following
- sections.
-
-4.1. Miscellaneous obsolete tokens
-
- These syntactic elements are used elsewhere in the obsolete syntax or
- in the main syntax. The obs-char and obs-qp elements each add ASCII
- value 0. Bare CR and bare LF are added to obs-text and obs-utext.
- The period character is added to obs-phrase. The obs-phrase-list
- provides for "empty" elements in a comma-separated list of phrases.
-
- Note: The "period" (or "full stop") character (".") in obs-phrase is
- not a form that was allowed in earlier versions of this or any other
- standard. Period (nor any other character from specials) was not
- allowed in phrase because it introduced a parsing difficulty
- distinguishing between phrases and portions of an addr-spec (see
- section 4.4). It appears here because the period character is
- currently used in many messages in the display-name portion of
- addresses, especially for initials in names, and therefore must be
- interpreted properly. In the future, period may appear in the
- regular syntax of phrase.
-
-obs-qp = "\" (%d0-127)
-
-obs-text = *LF *CR *(obs-char *LF *CR)
-
-
-
-Resnick Standards Track [Page 30]
-
-RFC 2822 Internet Message Format April 2001
-
-
-obs-char = %d0-9 / %d11 / ; %d0-127 except CR and
- %d12 / %d14-127 ; LF
-
-obs-utext = obs-text
-
-obs-phrase = word *(word / "." / CFWS)
-
-obs-phrase-list = phrase / 1*([phrase] [CFWS] "," [CFWS]) [phrase]
-
- Bare CR and bare LF appear in messages with two different meanings.
- In many cases, bare CR or bare LF are used improperly instead of CRLF
- to indicate line separators. In other cases, bare CR and bare LF are
- used simply as ASCII control characters with their traditional ASCII
- meanings.
-
-4.2. Obsolete folding white space
-
- In the obsolete syntax, any amount of folding white space MAY be
- inserted where the obs-FWS rule is allowed. This creates the
- possibility of having two consecutive "folds" in a line, and
- therefore the possibility that a line which makes up a folded header
- field could be composed entirely of white space.
-
- obs-FWS = 1*WSP *(CRLF 1*WSP)
-
-4.3. Obsolete Date and Time
-
- The syntax for the obsolete date format allows a 2 digit year in the
- date field and allows for a list of alphabetic time zone
- specifications that were used in earlier versions of this standard.
- It also permits comments and folding white space between many of the
- tokens.
-
-obs-day-of-week = [CFWS] day-name [CFWS]
-
-obs-year = [CFWS] 2*DIGIT [CFWS]
-
-obs-month = CFWS month-name CFWS
-
-obs-day = [CFWS] 1*2DIGIT [CFWS]
-
-obs-hour = [CFWS] 2DIGIT [CFWS]
-
-obs-minute = [CFWS] 2DIGIT [CFWS]
-
-obs-second = [CFWS] 2DIGIT [CFWS]
-
-obs-zone = "UT" / "GMT" / ; Universal Time
-
-
-
-Resnick Standards Track [Page 31]
-
-RFC 2822 Internet Message Format April 2001
-
-
- ; North American UT
- ; offsets
- "EST" / "EDT" / ; Eastern: - 5/ - 4
- "CST" / "CDT" / ; Central: - 6/ - 5
- "MST" / "MDT" / ; Mountain: - 7/ - 6
- "PST" / "PDT" / ; Pacific: - 8/ - 7
-
- %d65-73 / ; Military zones - "A"
- %d75-90 / ; through "I" and "K"
- %d97-105 / ; through "Z", both
- %d107-122 ; upper and lower case
-
- Where a two or three digit year occurs in a date, the year is to be
- interpreted as follows: If a two digit year is encountered whose
- value is between 00 and 49, the year is interpreted by adding 2000,
- ending up with a value between 2000 and 2049. If a two digit year is
- encountered with a value between 50 and 99, or any three digit year
- is encountered, the year is interpreted by adding 1900.
-
- In the obsolete time zone, "UT" and "GMT" are indications of
- "Universal Time" and "Greenwich Mean Time" respectively and are both
- semantically identical to "+0000".
-
- The remaining three character zones are the US time zones. The first
- letter, "E", "C", "M", or "P" stands for "Eastern", "Central",
- "Mountain" and "Pacific". The second letter is either "S" for
- "Standard" time, or "D" for "Daylight" (or summer) time. Their
- interpretations are as follows:
-
- EDT is semantically equivalent to -0400
- EST is semantically equivalent to -0500
- CDT is semantically equivalent to -0500
- CST is semantically equivalent to -0600
- MDT is semantically equivalent to -0600
- MST is semantically equivalent to -0700
- PDT is semantically equivalent to -0700
- PST is semantically equivalent to -0800
-
- The 1 character military time zones were defined in a non-standard
- way in [RFC822] and are therefore unpredictable in their meaning.
- The original definitions of the military zones "A" through "I" are
- equivalent to "+0100" through "+0900" respectively; "K", "L", and "M"
- are equivalent to "+1000", "+1100", and "+1200" respectively; "N"
- through "Y" are equivalent to "-0100" through "-1200" respectively;
- and "Z" is equivalent to "+0000". However, because of the error in
- [RFC822], they SHOULD all be considered equivalent to "-0000" unless
- there is out-of-band information confirming their meaning.
-
-
-
-
-Resnick Standards Track [Page 32]
-
-RFC 2822 Internet Message Format April 2001
-
-
- Other multi-character (usually between 3 and 5) alphabetic time zones
- have been used in Internet messages. Any such time zone whose
- meaning is not known SHOULD be considered equivalent to "-0000"
- unless there is out-of-band information confirming their meaning.
-
-4.4. Obsolete Addressing
-
- There are three primary differences in addressing. First, mailbox
- addresses were allowed to have a route portion before the addr-spec
- when enclosed in "<" and ">". The route is simply a comma-separated
- list of domain names, each preceded by "@", and the list terminated
- by a colon. Second, CFWS were allowed between the period-separated
- elements of local-part and domain (i.e., dot-atom was not used). In
- addition, local-part is allowed to contain quoted-string in addition
- to just atom. Finally, mailbox-list and address-list were allowed to
- have "null" members. That is, there could be two or more commas in
- such a list with nothing in between them.
-
-obs-angle-addr = [CFWS] "<" [obs-route] addr-spec ">" [CFWS]
-
-obs-route = [CFWS] obs-domain-list ":" [CFWS]
-
-obs-domain-list = "@" domain *(*(CFWS / "," ) [CFWS] "@" domain)
-
-obs-local-part = word *("." word)
-
-obs-domain = atom *("." atom)
-
-obs-mbox-list = 1*([mailbox] [CFWS] "," [CFWS]) [mailbox]
-
-obs-addr-list = 1*([address] [CFWS] "," [CFWS]) [address]
-
- When interpreting addresses, the route portion SHOULD be ignored.
-
-4.5. Obsolete header fields
-
- Syntactically, the primary difference in the obsolete field syntax is
- that it allows multiple occurrences of any of the fields and they may
- occur in any order. Also, any amount of white space is allowed
- before the ":" at the end of the field name.
-
-obs-fields = *(obs-return /
- obs-received /
- obs-orig-date /
- obs-from /
- obs-sender /
- obs-reply-to /
- obs-to /
-
-
-
-Resnick Standards Track [Page 33]
-
-RFC 2822 Internet Message Format April 2001
-
-
- obs-cc /
- obs-bcc /
- obs-message-id /
- obs-in-reply-to /
- obs-references /
- obs-subject /
- obs-comments /
- obs-keywords /
- obs-resent-date /
- obs-resent-from /
- obs-resent-send /
- obs-resent-rply /
- obs-resent-to /
- obs-resent-cc /
- obs-resent-bcc /
- obs-resent-mid /
- obs-optional)
-
- Except for destination address fields (described in section 4.5.3),
- the interpretation of multiple occurrences of fields is unspecified.
- Also, the interpretation of trace fields and resent fields which do
- not occur in blocks prepended to the message is unspecified as well.
- Unless otherwise noted in the following sections, interpretation of
- other fields is identical to the interpretation of their non-obsolete
- counterparts in section 3.
-
-4.5.1. Obsolete origination date field
-
-obs-orig-date = "Date" *WSP ":" date-time CRLF
-
-4.5.2. Obsolete originator fields
-
-obs-from = "From" *WSP ":" mailbox-list CRLF
-
-obs-sender = "Sender" *WSP ":" mailbox CRLF
-
-obs-reply-to = "Reply-To" *WSP ":" mailbox-list CRLF
-
-4.5.3. Obsolete destination address fields
-
-obs-to = "To" *WSP ":" address-list CRLF
-
-obs-cc = "Cc" *WSP ":" address-list CRLF
-
-obs-bcc = "Bcc" *WSP ":" (address-list / [CFWS]) CRLF
-
-
-
-
-
-
-Resnick Standards Track [Page 34]
-
-RFC 2822 Internet Message Format April 2001
-
-
- When multiple occurrences of destination address fields occur in a
- message, they SHOULD be treated as if the address-list in the first
- occurrence of the field is combined with the address lists of the
- subsequent occurrences by adding a comma and concatenating.
-
-4.5.4. Obsolete identification fields
-
- The obsolete "In-Reply-To:" and "References:" fields differ from the
- current syntax in that they allow phrase (words or quoted strings) to
- appear. The obsolete forms of the left and right sides of msg-id
- allow interspersed CFWS, making them syntactically identical to
- local-part and domain respectively.
-
-obs-message-id = "Message-ID" *WSP ":" msg-id CRLF
-
-obs-in-reply-to = "In-Reply-To" *WSP ":" *(phrase / msg-id) CRLF
-
-obs-references = "References" *WSP ":" *(phrase / msg-id) CRLF
-
-obs-id-left = local-part
-
-obs-id-right = domain
-
- For purposes of interpretation, the phrases in the "In-Reply-To:" and
- "References:" fields are ignored.
-
- Semantically, none of the optional CFWS surrounding the local-part
- and the domain are part of the obs-id-left and obs-id-right
- respectively.
-
-4.5.5. Obsolete informational fields
-
-obs-subject = "Subject" *WSP ":" unstructured CRLF
-
-obs-comments = "Comments" *WSP ":" unstructured CRLF
-
-obs-keywords = "Keywords" *WSP ":" obs-phrase-list CRLF
-
-4.5.6. Obsolete resent fields
-
- The obsolete syntax adds a "Resent-Reply-To:" field, which consists
- of the field name, the optional comments and folding white space, the
- colon, and a comma separated list of addresses.
-
-obs-resent-from = "Resent-From" *WSP ":" mailbox-list CRLF
-
-obs-resent-send = "Resent-Sender" *WSP ":" mailbox CRLF
-
-
-
-
-Resnick Standards Track [Page 35]
-
-RFC 2822 Internet Message Format April 2001
-
-
-obs-resent-date = "Resent-Date" *WSP ":" date-time CRLF
-
-obs-resent-to = "Resent-To" *WSP ":" address-list CRLF
-
-obs-resent-cc = "Resent-Cc" *WSP ":" address-list CRLF
-
-obs-resent-bcc = "Resent-Bcc" *WSP ":"
- (address-list / [CFWS]) CRLF
-
-obs-resent-mid = "Resent-Message-ID" *WSP ":" msg-id CRLF
-
-obs-resent-rply = "Resent-Reply-To" *WSP ":" address-list CRLF
-
- As with other resent fields, the "Resent-Reply-To:" field is to be
- treated as trace information only.
-
-4.5.7. Obsolete trace fields
-
- The obs-return and obs-received are again given here as template
- definitions, just as return and received are in section 3. Their
- full syntax is given in [RFC2821].
-
-obs-return = "Return-Path" *WSP ":" path CRLF
-
-obs-received = "Received" *WSP ":" name-val-list CRLF
-
-obs-path = obs-angle-addr
-
-4.5.8. Obsolete optional fields
-
-obs-optional = field-name *WSP ":" unstructured CRLF
-
-5. Security Considerations
-
- Care needs to be taken when displaying messages on a terminal or
- terminal emulator. Powerful terminals may act on escape sequences
- and other combinations of ASCII control characters with a variety of
- consequences. They can remap the keyboard or permit other
- modifications to the terminal which could lead to denial of service
- or even damaged data. They can trigger (sometimes programmable)
- answerback messages which can allow a message to cause commands to be
- issued on the recipient's behalf. They can also effect the operation
- of terminal attached devices such as printers. Message viewers may
- wish to strip potentially dangerous terminal escape sequences from
- the message prior to display. However, other escape sequences appear
- in messages for useful purposes (cf. [RFC2045, RFC2046, RFC2047,
- RFC2048, RFC2049, ISO2022]) and therefore should not be stripped
- indiscriminately.
-
-
-
-Resnick Standards Track [Page 36]
-
-RFC 2822 Internet Message Format April 2001
-
-
- Transmission of non-text objects in messages raises additional
- security issues. These issues are discussed in [RFC2045, RFC2046,
- RFC2047, RFC2048, RFC2049].
-
- Many implementations use the "Bcc:" (blind carbon copy) field
- described in section 3.6.3 to facilitate sending messages to
- recipients without revealing the addresses of one or more of the
- addressees to the other recipients. Mishandling this use of "Bcc:"
- has implications for confidential information that might be revealed,
- which could eventually lead to security problems through knowledge of
- even the existence of a particular mail address. For example, if
- using the first method described in section 3.6.3, where the "Bcc:"
- line is removed from the message, blind recipients have no explicit
- indication that they have been sent a blind copy, except insofar as
- their address does not appear in the message header. Because of
- this, one of the blind addressees could potentially send a reply to
- all of the shown recipients and accidentally reveal that the message
- went to the blind recipient. When the second method from section
- 3.6.3 is used, the blind recipient's address appears in the "Bcc:"
- field of a separate copy of the message. If the "Bcc:" field sent
- contains all of the blind addressees, all of the "Bcc:" recipients
- will be seen by each "Bcc:" recipient. Even if a separate message is
- sent to each "Bcc:" recipient with only the individual's address,
- implementations still need to be careful to process replies to the
- message as per section 3.6.3 so as not to accidentally reveal the
- blind recipient to other recipients.
-
-6. Bibliography
-
- [ASCII] American National Standards Institute (ANSI), Coded
- Character Set - 7-Bit American National Standard Code for
- Information Interchange, ANSI X3.4, 1986.
-
- [ISO2022] International Organization for Standardization (ISO),
- Information processing - ISO 7-bit and 8-bit coded
- character sets - Code extension techniques, Third edition
- - 1986-05-01, ISO 2022, 1986.
-
- [RFC822] Crocker, D., "Standard for the Format of ARPA Internet
- Text Messages", RFC 822, August 1982.
-
- [RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
- Extensions (MIME) Part One: Format of Internet Message
- Bodies", RFC 2045, November 1996.
-
- [RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
- Extensions (MIME) Part Two: Media Types", RFC 2046,
- November 1996.
-
-
-
-Resnick Standards Track [Page 37]
-
-RFC 2822 Internet Message Format April 2001
-
-
- [RFC2047] Moore, K., "Multipurpose Internet Mail Extensions (MIME)
- Part Three: Message Header Extensions for Non-ASCII Text",
- RFC 2047, November 1996.
-
- [RFC2048] Freed, N., Klensin, J. and J. Postel, "Multipurpose
- Internet Mail Extensions (MIME) Part Four: Format of
- Internet Message Bodies", RFC 2048, November 1996.
-
- [RFC2049] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
- Extensions (MIME) Part Five: Conformance Criteria and
- Examples", RFC 2049, November 1996.
-
- [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
- Requirement Levels", BCP 14, RFC 2119, March 1997.
-
- [RFC2234] Crocker, D., Editor, and P. Overell, "Augmented BNF for
- Syntax Specifications: ABNF", RFC 2234, November 1997.
-
- [RFC2821] Klensin, J., Editor, "Simple Mail Transfer Protocol", RFC
- 2821, March 2001.
-
- [STD3] Braden, R., "Host Requirements", STD 3, RFC 1122 and RFC
- 1123, October 1989.
-
- [STD12] Mills, D., "Network Time Protocol", STD 12, RFC 1119,
- September 1989.
-
- [STD13] Mockapetris, P., "Domain Name System", STD 13, RFC 1034
- and RFC 1035, November 1987.
-
- [STD14] Partridge, C., "Mail Routing and the Domain System", STD
- 14, RFC 974, January 1986.
-
-7. Editor's Address
-
- Peter W. Resnick
- QUALCOMM Incorporated
- 5775 Morehouse Drive
- San Diego, CA 92121-1714
- USA
-
- Phone: +1 858 651 4478
- Fax: +1 858 651 1102
- EMail: presnick at qualcomm.com
-
-
-
-
-
-
-
-Resnick Standards Track [Page 38]
-
-RFC 2822 Internet Message Format April 2001
-
-
-8. Acknowledgements
-
- Many people contributed to this document. They included folks who
- participated in the Detailed Revision and Update of Messaging
- Standards (DRUMS) Working Group of the Internet Engineering Task
- Force (IETF), the chair of DRUMS, the Area Directors of the IETF, and
- people who simply sent their comments in via e-mail. The editor is
- deeply indebted to them all and thanks them sincerely. The below
- list includes everyone who sent e-mail concerning this document.
- Hopefully, everyone who contributed is named here:
-
- Matti Aarnio Barry Finkel Larry Masinter
- Tanaka Akira Erik Forsberg Denis McKeon
- Russ Allbery Chuck Foster William P McQuillan
- Eric Allman Paul Fox Alexey Melnikov
- Harald Tveit Alvestrand Klaus M. Frank Perry E. Metzger
- Ran Atkinson Ned Freed Steven Miller
- Jos Backus Jochen Friedrich Keith Moore
- Bruce Balden Randall C. Gellens John Gardiner Myers
- Dave Barr Sukvinder Singh Gill Chris Newman
- Alan Barrett Tim Goodwin John W. Noerenberg
- John Beck Philip Guenther Eric Norman
- J. Robert von Behren Tony Hansen Mike O'Dell
- Jos den Bekker John Hawkinson Larry Osterman
- D. J. Bernstein Philip Hazel Paul Overell
- James Berriman Kai Henningsen Jacob Palme
- Norbert Bollow Robert Herriot Michael A. Patton
- Raj Bose Paul Hethmon Uzi Paz
- Antony Bowesman Jim Hill Michael A. Quinlan
- Scott Bradner Paul E. Hoffman Eric S. Raymond
- Randy Bush Steve Hole Sam Roberts
- Tom Byrer Kari Hurtta Hugh Sasse
- Bruce Campbell Marco S. Hyman Bart Schaefer
- Larry Campbell Ofer Inbar Tom Scola
- W. J. Carpenter Olle Jarnefors Wolfgang Segmuller
- Michael Chapman Kevin Johnson Nick Shelness
- Richard Clayton Sudish Joseph John Stanley
- Maurizio Codogno Maynard Kang Einar Stefferud
- Jim Conklin Prabhat Keni Jeff Stephenson
- R. Kelley Cook John C. Klensin Bernard Stern
- Steve Coya Graham Klyne Peter Sylvester
- Mark Crispin Brad Knowles Mark Symons
- Dave Crocker Shuhei Kobayashi Eric Thomas
- Matt Curtin Peter Koch Lee Thompson
- Michael D'Errico Dan Kohn Karel De Vriendt
- Cyrus Daboo Christian Kuhtz Matthew Wall
- Jutta Degener Anand Kumria Rolf Weber
- Mark Delany Steen Larsen Brent B. Welch
-
-
-
-Resnick Standards Track [Page 39]
-
-RFC 2822 Internet Message Format April 2001
-
-
- Steve Dorner Eliot Lear Dan Wing
- Harold A. Driscoll Barry Leiba Jack De Winter
- Michael Elkins Jay Levitt Gregory J. Woodhouse
- Robert Elz Lars-Johan Liman Greg A. Woods
- Johnny Eriksson Charles Lindsey Kazu Yamamoto
- Erik E. Fair Pete Loshin Alain Zahm
- Roger Fajman Simon Lyall Jamie Zawinski
- Patrik Faltstrom Bill Manning Timothy S. Zurcher
- Claus Andre Farber John Martin
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Resnick Standards Track [Page 40]
-
-RFC 2822 Internet Message Format April 2001
-
-
-Appendix A. Example messages
-
- This section presents a selection of messages. These are intended to
- assist in the implementation of this standard, but should not be
- taken as normative; that is to say, although the examples in this
- section were carefully reviewed, if there happens to be a conflict
- between these examples and the syntax described in sections 3 and 4
- of this document, the syntax in those sections is to be taken as
- correct.
-
- Messages are delimited in this section between lines of "----". The
- "----" lines are not part of the message itself.
-
-A.1. Addressing examples
-
- The following are examples of messages that might be sent between two
- individuals.
-
-A.1.1. A message from one person to another with simple addressing
-
- This could be called a canonical message. It has a single author,
- John Doe, a single recipient, Mary Smith, a subject, the date, a
- message identifier, and a textual message in the body.
-
-----
-From: John Doe <jdoe at machine.example>
-To: Mary Smith <mary at example.net>
-Subject: Saying Hello
-Date: Fri, 21 Nov 1997 09:55:06 -0600
-Message-ID: <1234 at local.machine.example>
-
-This is a message just to say hello.
-So, "Hello".
-----
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Resnick Standards Track [Page 41]
-
-RFC 2822 Internet Message Format April 2001
-
-
- If John's secretary Michael actually sent the message, though John
- was the author and replies to this message should go back to him, the
- sender field would be used:
-
-----
-From: John Doe <jdoe at machine.example>
-Sender: Michael Jones <mjones at machine.example>
-To: Mary Smith <mary at example.net>
-Subject: Saying Hello
-Date: Fri, 21 Nov 1997 09:55:06 -0600
-Message-ID: <1234 at local.machine.example>
-
-This is a message just to say hello.
-So, "Hello".
-----
-
-A.1.2. Different types of mailboxes
-
- This message includes multiple addresses in the destination fields
- and also uses several different forms of addresses.
-
-----
-From: "Joe Q. Public" <john.q.public at example.com>
-To: Mary Smith <mary at x.test>, jdoe at example.org, Who? <one at y.test>
-Cc: <boss at nil.test>, "Giant; \"Big\" Box" <sysservices at example.net>
-Date: Tue, 1 Jul 2003 10:52:37 +0200
-Message-ID: <5678.21-Nov-1997 at example.com>
-
-Hi everyone.
-----
-
- Note that the display names for Joe Q. Public and Giant; "Big" Box
- needed to be enclosed in double-quotes because the former contains
- the period and the latter contains both semicolon and double-quote
- characters (the double-quote characters appearing as quoted-pair
- construct). Conversely, the display name for Who? could appear
- without them because the question mark is legal in an atom. Notice
- also that jdoe at example.org and boss at nil.test have no display names
- associated with them at all, and jdoe at example.org uses the simpler
- address form without the angle brackets.
-
-
-
-
-
-
-
-
-
-
-
-Resnick Standards Track [Page 42]
-
-RFC 2822 Internet Message Format April 2001
-
-
-A.1.3. Group addresses
-
-----
-From: Pete <pete at silly.example>
-To: A Group:Chris Jones <c at a.test>,joe at where.test,John <jdoe at one.test>;
-Cc: Undisclosed recipients:;
-Date: Thu, 13 Feb 1969 23:32:54 -0330
-Message-ID: <testabcd.1234 at silly.example>
-
-Testing.
-----
-
- In this message, the "To:" field has a single group recipient named A
- Group which contains 3 addresses, and a "Cc:" field with an empty
- group recipient named Undisclosed recipients.
-
-A.2. Reply messages
-
- The following is a series of three messages that make up a
- conversation thread between John and Mary. John firsts sends a
- message to Mary, Mary then replies to John's message, and then John
- replies to Mary's reply message.
-
- Note especially the "Message-ID:", "References:", and "In-Reply-To:"
- fields in each message.
-
-----
-From: John Doe <jdoe at machine.example>
-To: Mary Smith <mary at example.net>
-Subject: Saying Hello
-Date: Fri, 21 Nov 1997 09:55:06 -0600
-Message-ID: <1234 at local.machine.example>
-
-This is a message just to say hello.
-So, "Hello".
-----
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Resnick Standards Track [Page 43]
-
-RFC 2822 Internet Message Format April 2001
-
-
- When sending replies, the Subject field is often retained, though
- prepended with "Re: " as described in section 3.6.5.
-
-----
-From: Mary Smith <mary at example.net>
-To: John Doe <jdoe at machine.example>
-Reply-To: "Mary Smith: Personal Account" <smith at home.example>
-Subject: Re: Saying Hello
-Date: Fri, 21 Nov 1997 10:01:10 -0600
-Message-ID: <3456 at example.net>
-In-Reply-To: <1234 at local.machine.example>
-References: <1234 at local.machine.example>
-
-This is a reply to your hello.
-----
-
- Note the "Reply-To:" field in the above message. When John replies
- to Mary's message above, the reply should go to the address in the
- "Reply-To:" field instead of the address in the "From:" field.
-
-----
-To: "Mary Smith: Personal Account" <smith at home.example>
-From: John Doe <jdoe at machine.example>
-Subject: Re: Saying Hello
-Date: Fri, 21 Nov 1997 11:00:00 -0600
-Message-ID: <abcd.1234 at local.machine.tld>
-In-Reply-To: <3456 at example.net>
-References: <1234 at local.machine.example> <3456 at example.net>
-
-This is a reply to your reply.
-----
-
-A.3. Resent messages
-
- Start with the message that has been used as an example several
- times:
-
-----
-From: John Doe <jdoe at machine.example>
-To: Mary Smith <mary at example.net>
-Subject: Saying Hello
-Date: Fri, 21 Nov 1997 09:55:06 -0600
-Message-ID: <1234 at local.machine.example>
-
-This is a message just to say hello.
-So, "Hello".
-----
-
-
-
-
-Resnick Standards Track [Page 44]
-
-RFC 2822 Internet Message Format April 2001
-
-
- Say that Mary, upon receiving this message, wishes to send a copy of
- the message to Jane such that (a) the message would appear to have
- come straight from John; (b) if Jane replies to the message, the
- reply should go back to John; and (c) all of the original
- information, like the date the message was originally sent to Mary,
- the message identifier, and the original addressee, is preserved. In
- this case, resent fields are prepended to the message:
-
-----
-Resent-From: Mary Smith <mary at example.net>
-Resent-To: Jane Brown <j-brown at other.example>
-Resent-Date: Mon, 24 Nov 1997 14:22:01 -0800
-Resent-Message-ID: <78910 at example.net>
-From: John Doe <jdoe at machine.example>
-To: Mary Smith <mary at example.net>
-Subject: Saying Hello
-Date: Fri, 21 Nov 1997 09:55:06 -0600
-Message-ID: <1234 at local.machine.example>
-
-This is a message just to say hello.
-So, "Hello".
-----
-
- If Jane, in turn, wished to resend this message to another person,
- she would prepend her own set of resent header fields to the above
- and send that.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Resnick Standards Track [Page 45]
-
-RFC 2822 Internet Message Format April 2001
-
-
-A.4. Messages with trace fields
-
- As messages are sent through the transport system as described in
- [RFC2821], trace fields are prepended to the message. The following
- is an example of what those trace fields might look like. Note that
- there is some folding white space in the first one since these lines
- can be long.
-
-----
-Received: from x.y.test
- by example.net
- via TCP
- with ESMTP
- id ABC12345
- for <mary at example.net>; 21 Nov 1997 10:05:43 -0600
-Received: from machine.example by x.y.test; 21 Nov 1997 10:01:22 -0600
-From: John Doe <jdoe at machine.example>
-To: Mary Smith <mary at example.net>
-Subject: Saying Hello
-Date: Fri, 21 Nov 1997 09:55:06 -0600
-Message-ID: <1234 at local.machine.example>
-
-This is a message just to say hello.
-So, "Hello".
-----
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Resnick Standards Track [Page 46]
-
-RFC 2822 Internet Message Format April 2001
-
-
-A.5. White space, comments, and other oddities
-
- White space, including folding white space, and comments can be
- inserted between many of the tokens of fields. Taking the example
- from A.1.3, white space and comments can be inserted into all of the
- fields.
-
-----
-From: Pete(A wonderful \) chap) <pete(his account)@silly.test(his host)>
-To:A Group(Some people)
- :Chris Jones <c@(Chris's host.)public.example>,
- joe at example.org,
- John <jdoe at one.test> (my dear friend); (the end of the group)
-Cc:(Empty list)(start)Undisclosed recipients :(nobody(that I know)) ;
-Date: Thu,
- 13
- Feb
- 1969
- 23:32
- -0330 (Newfoundland Time)
-Message-ID: <testabcd.1234 at silly.test>
-
-Testing.
-----
-
- The above example is aesthetically displeasing, but perfectly legal.
- Note particularly (1) the comments in the "From:" field (including
- one that has a ")" character appearing as part of a quoted-pair); (2)
- the white space absent after the ":" in the "To:" field as well as
- the comment and folding white space after the group name, the special
- character (".") in the comment in Chris Jones's address, and the
- folding white space before and after "joe at example.org,"; (3) the
- multiple and nested comments in the "Cc:" field as well as the
- comment immediately following the ":" after "Cc"; (4) the folding
- white space (but no comments except at the end) and the missing
- seconds in the time of the date field; and (5) the white space before
- (but not within) the identifier in the "Message-ID:" field.
-
-A.6. Obsoleted forms
-
- The following are examples of obsolete (that is, the "MUST NOT
- generate") syntactic elements described in section 4 of this
- document.
-
-
-
-
-
-
-
-
-Resnick Standards Track [Page 47]
-
-RFC 2822 Internet Message Format April 2001
-
-
-A.6.1. Obsolete addressing
-
- Note in the below example the lack of quotes around Joe Q. Public,
- the route that appears in the address for Mary Smith, the two commas
- that appear in the "To:" field, and the spaces that appear around the
- "." in the jdoe address.
-
-----
-From: Joe Q. Public <john.q.public at example.com>
-To: Mary Smith <@machine.tld:mary at example.net>, , jdoe at test . example
-Date: Tue, 1 Jul 2003 10:52:37 +0200
-Message-ID: <5678.21-Nov-1997 at example.com>
-
-Hi everyone.
-----
-
-A.6.2. Obsolete dates
-
- The following message uses an obsolete date format, including a non-
- numeric time zone and a two digit year. Note that although the
- day-of-week is missing, that is not specific to the obsolete syntax;
- it is optional in the current syntax as well.
-
-----
-From: John Doe <jdoe at machine.example>
-To: Mary Smith <mary at example.net>
-Subject: Saying Hello
-Date: 21 Nov 97 09:55:06 GMT
-Message-ID: <1234 at local.machine.example>
-
-This is a message just to say hello.
-So, "Hello".
-----
-
-A.6.3. Obsolete white space and comments
-
- White space and comments can appear between many more elements than
- in the current syntax. Also, folding lines that are made up entirely
- of white space are legal.
-
-
-
-
-
-
-
-
-
-
-
-
-Resnick Standards Track [Page 48]
-
-RFC 2822 Internet Message Format April 2001
-
-
-----
-From : John Doe <jdoe at machine(comment). example>
-To : Mary Smith
-__
- <mary at example.net>
-Subject : Saying Hello
-Date : Fri, 21 Nov 1997 09(comment): 55 : 06 -0600
-Message-ID : <1234 @ local(blah) .machine .example>
-
-This is a message just to say hello.
-So, "Hello".
-----
-
- Note especially the second line of the "To:" field. It starts with
- two space characters. (Note that "__" represent blank spaces.)
- Therefore, it is considered part of the folding as described in
- section 4.2. Also, the comments and white space throughout
- addresses, dates, and message identifiers are all part of the
- obsolete syntax.
-
-Appendix B. Differences from earlier standards
-
- This appendix contains a list of changes that have been made in the
- Internet Message Format from earlier standards, specifically [RFC822]
- and [STD3]. Items marked with an asterisk (*) below are items which
- appear in section 4 of this document and therefore can no longer be
- generated.
-
- 1. Period allowed in obsolete form of phrase.
- 2. ABNF moved out of document to [RFC2234].
- 3. Four or more digits allowed for year.
- 4. Header field ordering (and lack thereof) made explicit.
- 5. Encrypted header field removed.
- 6. Received syntax loosened to allow any token/value pair.
- 7. Specifically allow and give meaning to "-0000" time zone.
- 8. Folding white space is not allowed between every token.
- 9. Requirement for destinations removed.
- 10. Forwarding and resending redefined.
- 11. Extension header fields no longer specifically called out.
- 12. ASCII 0 (null) removed.*
- 13. Folding continuation lines cannot contain only white space.*
- 14. Free insertion of comments not allowed in date.*
- 15. Non-numeric time zones not allowed.*
- 16. Two digit years not allowed.*
- 17. Three digit years interpreted, but not allowed for generation.
- 18. Routes in addresses not allowed.*
- 19. CFWS within local-parts and domains not allowed.*
- 20. Empty members of address lists not allowed.*
-
-
-
-Resnick Standards Track [Page 49]
-
-RFC 2822 Internet Message Format April 2001
-
-
- 21. Folding white space between field name and colon not allowed.*
- 22. Comments between field name and colon not allowed.
- 23. Tightened syntax of in-reply-to and references.*
- 24. CFWS within msg-id not allowed.*
- 25. Tightened semantics of resent fields as informational only.
- 26. Resent-Reply-To not allowed.*
- 27. No multiple occurrences of fields (except resent and received).*
- 28. Free CR and LF not allowed.*
- 29. Routes in return path not allowed.*
- 30. Line length limits specified.
- 31. Bcc more clearly specified.
-
-Appendix C. Notices
-
- Intellectual Property
-
- The IETF takes no position regarding the validity or scope of any
- intellectual property or other rights that might be claimed to
- pertain to the implementation or use of the technology described in
- this document or the extent to which any license under such rights
- might or might not be available; neither does it represent that it
- has made any effort to identify any such rights. Information on the
- IETF's procedures with respect to rights in standards-track and
- standards-related documentation can be found in BCP-11. Copies of
- claims of rights made available for publication and any assurances of
- licenses to be made available, or the result of an attempt made to
- obtain a general license or permission for the use of such
- proprietary rights by implementors or users of this specification can
- be obtained from the IETF Secretariat.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Resnick Standards Track [Page 50]
-
-RFC 2822 Internet Message Format April 2001
-
-
-Full Copyright Statement
-
- Copyright (C) The Internet Society (2001). All Rights Reserved.
-
- This document and translations of it may be copied and furnished to
- others, and derivative works that comment on or otherwise explain it
- or assist in its implementation may be prepared, copied, published
- and distributed, in whole or in part, without restriction of any
- kind, provided that the above copyright notice and this paragraph are
- included on all such copies and derivative works. However, this
- document itself may not be modified in any way, such as by removing
- the copyright notice or references to the Internet Society or other
- Internet organizations, except as needed for the purpose of
- developing Internet standards in which case the procedures for
- copyrights defined in the Internet Standards process must be
- followed, or as required to translate it into languages other than
- English.
-
- The limited permissions granted above are perpetual and will not be
- revoked by the Internet Society or its successors or assigns.
-
- This document and the information contained herein is provided on an
- "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
- TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
- BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
- HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
- MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
-
-Acknowledgement
-
- Funding for the RFC Editor function is currently provided by the
- Internet Society.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Resnick Standards Track [Page 51]
-
diff --git a/reference/rfc3462 Reporting of Mail System Administrative Messages.txt b/reference/rfc3462 Reporting of Mail System Administrative Messages.txt
deleted file mode 100644
index 7872292..0000000
--- a/reference/rfc3462 Reporting of Mail System Administrative Messages.txt
+++ /dev/null
@@ -1,396 +0,0 @@
-
-
-
-
-
-Network Working Group G. Vaudreuil
-Request for Comments: 3462 Lucent Technologies
-Obsoletes: 1892 January 2003
-Category: Standards Track
-
-
- The Multipart/Report Content Type
- for the Reporting of
- Mail System Administrative Messages
-
-Status of this Memo
-
- This document specifies an Internet standards track protocol for the
- Internet community, and requests discussion and suggestions for
- improvements. Please refer to the current edition of the "Internet
- Official Protocol Standards" (STD 1) for the standardization state
- and status of this protocol. Distribution of this memo is unlimited.
-
-Copyright Notice
-
- Copyright (C) The Internet Society (2003). All Rights Reserved.
-
-Abstract
-
- The Multipart/Report Multipurpose Internet Mail Extensions (MIME)
- content-type is a general "family" or "container" type for electronic
- mail reports of any kind. Although this memo defines only the use of
- the Multipart/Report content-type with respect to delivery status
- reports, mail processing programs will benefit if a single content-
- type is used to for all kinds of reports.
-
- This document is part of a four document set describing the delivery
- status report service. This collection includes the Simple Mail
- Transfer Protocol (SMTP) extensions to request delivery status
- reports, a MIME content for the reporting of delivery reports, an
- enumeration of extended status codes, and a multipart container for
- the delivery report, the original message, and a human-friendly
- summary of the failure.
-
-
-
-
-
-
-
-
-
-
-
-
-
-Vaudreuil Standards Track [Page 1]
-
-RFC 3462 Multipart/Report January 2003
-
-
-Table of Contents
-
- Document Conventions................................................2
- 1. The Multipart/Report Content Type................................2
- 2. The Text/RFC822-Headers..........................................4
- 3. Security Considerations..........................................4
- 4. Normative References.............................................5
- Appendix A - Changes from RFC 1893..................................6
- Author's Address....................................................6
- Full Copyright Statement............................................7
-
-Document Conventions
-
- The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
- "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
- document are to be interpreted as described in BCP 14, RFC 2119
- [RFC2119].
-
-1. The Multipart/Report Content Type
-
- The Multipart/Report MIME content-type is a general "family" or
- "container" type for electronic mail reports of any kind. Although
- this memo defines only the use of the Multipart/Report content-type
- with respect to delivery status reports, mail processing programs
- will benefit if a single content-type is used to for all kinds of
- reports.
-
- The Multipart/Report content-type is defined as follows:
-
- MIME type name: multipart
- MIME subtype name: report
- Required parameters: boundary, report-type
- Optional parameters: none
- Encoding considerations: 7bit should always be adequate
- Security considerations: see section 3 of this memo
-
- The syntax of Multipart/Report is identical to the Multipart/Mixed
- content type defined in [MIME]. When used to send a report, the
- Multipart/Report content-type must be the top-level MIME content type
- for any report message. The report-type parameter identifies the
- type of report. The parameter is the MIME content sub-type of the
- second body part of the Multipart/Report.
-
- User agents and gateways must be able to automatically determine that
- a message is a mail system report and should be processed as such.
- Placing the Multipart/Report as the outermost content provides a
- mechanism whereby an auto-processor may detect through parsing the
- RFC 822 headers that the message is a report.
-
-
-
-Vaudreuil Standards Track [Page 2]
-
-RFC 3462 Multipart/Report January 2003
-
-
- The Multipart/Report content-type contains either two or three sub-
- parts, in the following order:
-
- 1) [Required] The first body part contains human readable message.
- The purpose of this message is to provide an easily understood
- description of the condition(s) that caused the report to be
- generated, for a human reader who may not have a user agent capable
- of interpreting the second section of the Multipart/Report.
-
- The text in the first section may be in any MIME standards-track
- content-type, charset, or language. Where a description of the error
- is desired in several languages or several media, a
- Multipart/Alternative construct may be used.
-
- This body part may also be used to send detailed information that
- cannot be easily formatted into a Message/Report body part.
-
- (2) [Required] A machine parsable body part containing an account of
- the reported message handling event. The purpose of this body part is
- to provide a machine-readable description of the condition(s) that
- caused the report to be generated, along with details not present in
- the first body part that may be useful to human experts. An initial
- body part, Message/delivery-status is defined in [DSN].
-
- (3) [Optional] A body part containing the returned message or a
- portion thereof. This information may be useful to aid human experts
- in diagnosing problems. (Although it may also be useful to allow the
- sender to identify the message which the report was issued, it is
- hoped that the envelope-id and original-recipient-address returned in
- the Message/Report body part will replace the traditional use of the
- returned content for this purpose.)
-
- Return of content may be wasteful of network bandwidth and a variety
- of implementation strategies can be used. Generally the sender
- should choose the appropriate strategy and inform the recipient of
- the required level of returned content required. In the absence of
- an explicit request for level of return of content such as that
- provided in [DRPT], the agent that generated the delivery service
- report should return the full message content.
-
- When 8-bit or binary data not encoded in a 7 bit form is to be
- returned, and the return path is not guaranteed to be 8-bit or binary
- capable, two options are available. The original message MAY be re-
- encoded into a legal 7-bit MIME message or the Text/RFC822-Headers
- content-type MAY be used to return only the original message headers.
-
-
-
-
-
-
-Vaudreuil Standards Track [Page 3]
-
-RFC 3462 Multipart/Report January 2003
-
-
-2. The Text/RFC822-Headers content-type
-
- The Text/RFC822-Headers MIME content-type provides a mechanism to
- label and return only the RFC 822 headers of a failed message. These
- headers are not the complete message and should not be returned as a
- Message/RFC822. The returned headers are useful for identifying the
- failed message and for diagnostics based on the received lines.
-
- The Text/RFC822-Headers content-type is defined as follows:
-
- MIME type name: Text
- MIME subtype name: RFC822-Headers
- Required parameters: None
- Optional parameters: None
- Encoding considerations: 7 bit is sufficient for normal RFC822
- headers, however, if the headers are broken and require
- encoding to make them legal 7 bit content, they may be
- encoded in quoted-printable.
- Security considerations: See section 3 of this memo.
-
- The Text/RFC822-Headers body part should contain all the RFC822
- header lines from the message which caused the report. The RFC822
- headers include all lines prior to the blank line in the message.
- They include the MIME-Version and MIME Content-Headers.
-
-3. Security Considerations
-
- Automated use of report types without authentication presents several
- security issues. Forging negative reports presents the opportunity
- for denial-of-service attacks when the reports are used for automated
- maintenance of directories or mailing lists. Forging positive
- reports may cause the sender to incorrectly believe a message was
- delivered when it was not.
-
- A signature covering the entire multipart/report structure could be
- used to prevent such forgeries; such a signature scheme is, however,
- beyond the scope of this document.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Vaudreuil Standards Track [Page 4]
-
-RFC 3462 Multipart/Report January 2003
-
-
-4. Normative References
-
- [SMTP] Postel, J., "Simple Mail Transfer Protocol", STD 10, RFC
- 821, August 1982.
-
- [DSN] Moore, K., and G. Vaudreuil, "An Extensible Message Format
- for Delivery Status Notifications", RFC 3464, January
- 2003.
-
- [RFC822] Crocker, D., "Standard for the format of ARPA Internet
- Text Messages", STD 11, RFC 822, August 1982.
-
- [MIME] Borenstein, N. and N. Freed, "Multipurpose Internet Mail
- Extensions (MIME) Part Two: Media Types", RFC 2046,
- November 1996.
-
- [DRPT] Moore, K., "SMTP Service Extension for Delivery Status
- Notifications", RFC 3461, January 2003.
-
- [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
- Requirement Levels", BCP 14, RFC 2119, March 1997.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Vaudreuil Standards Track [Page 5]
-
-RFC 3462 Multipart/Report January 2003
-
-
-Appendix A - Changes from RFC 1892
-
- Changed Authors contact information
-
- Updated required standards boilerplate
-
- Edited the text to make it spell-checker and grammar checker
- compliant
-
-Author's Address
-
- Gregory M. Vaudreuil
- Lucent Technologies
- 7291 Williamson Rd
- Dallas Tx, 75214
-
- Phone: +1 214 823 9325
- EMail: GregV at ieee.org
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Vaudreuil Standards Track [Page 6]
-
-RFC 3462 Multipart/Report January 2003
-
-
-Full Copyright Statement
-
- Copyright (C) The Internet Society (2003). All Rights Reserved.
-
- This document and translations of it may be copied and furnished to
- others, and derivative works that comment on or otherwise explain it
- or assist in its implementation may be prepared, copied, published
- and distributed, in whole or in part, without restriction of any
- kind, provided that the above copyright notice and this paragraph are
- included on all such copies and derivative works. However, this
- document itself may not be modified in any way, such as by removing
- the copyright notice or references to the Internet Society or other
- Internet organizations, except as needed for the purpose of
- developing Internet standards in which case the procedures for
- copyrights defined in the Internet Standards process must be
- followed, or as required to translate it into languages other than
- English.
-
- The limited permissions granted above are perpetual and will not be
- revoked by the Internet Society or its successors or assigns.
-
- This document and the information contained herein is provided on an
- "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
- TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
- BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
- HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
- MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
-
-Acknowledgement
-
- Funding for the RFC Editor function is currently provided by the
- Internet Society.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Vaudreuil Standards Track [Page 7]
-
-
-
diff --git a/reference/rfc3696 Checking and Transformation of Names.txt b/reference/rfc3696 Checking and Transformation of Names.txt
deleted file mode 100644
index 7161265..0000000
--- a/reference/rfc3696 Checking and Transformation of Names.txt
+++ /dev/null
@@ -1,898 +0,0 @@
-
- INFORMATIONAL
- Errata
-Network Working Group J. Klensin
-Request for Comments: 3696 February 2004
-Category: Informational
-
-
- Application Techniques for Checking and Transformation of Names
-
-Status of this Memo
-
- This memo provides information for the Internet community. It does
- not specify an Internet standard of any kind. Distribution of this
- memo is unlimited.
-
-Copyright Notice
-
- Copyright (C) The Internet Society (2004). All Rights Reserved.
-
-Abstract
-
- Many Internet applications have been designed to deduce top-level
- domains (or other domain name labels) from partial information. The
- introduction of new top-level domains, especially non-country-code
- ones, has exposed flaws in some of the methods used by these
- applications. These flaws make it more difficult, or impossible, for
- users of the applications to access the full Internet. This memo
- discusses some of the techniques that have been used and gives some
- guidance for minimizing their negative impact as the domain name
- environment evolves. This document draws summaries of the applicable
- rules together in one place and supplies references to the actual
- standards.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Klensin Informational [Page 1]
-
-RFC 3696 Checking and Transformation of Names February 2004
-
-
-Table of Contents
-
- 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 2
- 2. Restrictions on domain (DNS) names . . . . . . . . . . . . . . 3
- 3. Restrictions on email addresses . . . . . . . . . . . . . . . 5
- 4. URLs and URIs . . . . . . . . . . . . . . . . . . . . . . . . 7
- 4.1. URI syntax definitions and issues . . . . . . . . . . . 7
- 4.2. The HTTP URL . . . . . . . . . . . . . . . . . . . . . . 8
- 4.3. The MAILTO URL . . . . . . . . . . . . . . . . . . . . . 9
- 4.4. Guessing domain names in web contexts . . . . . . . . . 11
- 5. Implications of internationalization . . . . . . . . . . . . . 11
- 6. Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
- 7. Security Considerations . . . . . . . . . . . . . . . . . . . 13
- 8. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 13
- 9. References . . . . . . . . . . . . . . . . . . . . . . . . . . 14
- 9.1. Normative References . . . . . . . . . . . . . . . . . . 14
- 9.2. Informative References . . . . . . . . . . . . . . . . . 15
- 10. Author's Address . . . . . . . . . . . . . . . . . . . . . . . 15
- 11. Full Copyright Statement . . . . . . . . . . . . . . . . . . . 16
-
-1. Introduction
-
- Designers of user interfaces to Internet applications have often
- found it useful to examine user-provided values for validity before
- passing them to the Internet tools themselves. This type of test,
- most commonly involving syntax checks or application of other rules
- to domain names, email addresses, or "web addresses" (URLs or,
- occasionally, extended URI forms (see Section 4)) may enable better-
- quality diagnostics for the user than might be available from the
- protocol itself. Local validity tests on values are also thought to
- improve the efficiency of back-office processing programs and to
- reduce the load on the protocols themselves. Certainly, they are
- consistent with the well-established principle that it is better to
- detect errors as early as possible.
-
- The tests must, however, be made correctly or at least safely. If
- criteria are applied that do not match the protocols, users will be
- inconvenienced, addresses and sites will effectively become
- inaccessible to some groups, and business and communications
- opportunities will be lost. Experience in recent years indicates
- that syntax tests are often performed incorrectly and that tests for
- top-level domain names are applied using obsolete lists and
- conventions. We assume that most of these incorrect tests are the
- result of the inability to conveniently locate exact definitions for
- the criteria to be applied. This document draws summaries of the
- applicable rules together in one place and supplies references to the
-
-
-
-
-
-Klensin Informational [Page 2]
-
-RFC 3696 Checking and Transformation of Names February 2004
-
-
- actual standards. It does not add anything to those standards; it
- merely draws the information together into a form that may be more
- accessible.
-
- Many experts on Internet protocols believe that tests and rules of
- these sorts should be avoided in applications and that the tests in
- the protocols and back-office systems should be relied on instead.
- Certainly implementations of the protocols cannot assume that the
- data passed to them will be valid. Unless the standards specify
- particular behavior, this document takes no position on whether or
- not the testing is desirable. It only identifies the correct tests
- to be made if tests are to be applied.
-
- The sections that follow discuss domain names, email addresses, and
- URLs.
-
-2. Restrictions on domain (DNS) names
-
- The authoritative definitions of the format and syntax of domain
- names appear in RFCs 1035 [RFC1035], 1123 [RFC1123], and 2181
- [RFC2181].
-
- Any characters, or combination of bits (as octets), are permitted in
- DNS names. However, there is a preferred form that is required by
- most applications. This preferred form has been the only one
- permitted in the names of top-level domains, or TLDs. In general, it
- is also the only form permitted in most second-level names registered
- in TLDs, although some names that are normally not seen by users obey
- other rules. It derives from the original ARPANET rules for the
- naming of hosts (i.e., the "hostname" rule) and is perhaps better
- described as the "LDH rule", after the characters that it permits.
- The LDH rule, as updated, provides that the labels (words or strings
- separated by periods) that make up a domain name must consist of only
- the ASCII [ASCII] alphabetic and numeric characters, plus the hyphen.
- No other symbols or punctuation characters are permitted, nor is
- blank space. If the hyphen is used, it is not permitted to appear at
- either the beginning or end of a label. There is an additional rule
- that essentially requires that top-level domain names not be all-
- numeric.
-
- When it is necessary to express labels with non-character octets, or
- to embed periods within labels, there is a mechanism for keying them
- in that utilizes an escape sequence. RFC 1035 [RFC1035] should be
- consulted if that mechanism is needed (most common applications,
- including email and the Web, will generally not permit those escaped
- strings). A special encoding is now available for non-ASCII
- characters, see the brief discussion in Section 5.
-
-
-
-
-Klensin Informational [Page 3]
-
-RFC 3696 Checking and Transformation of Names February 2004
-
-
- Most internet applications that reference other hosts or systems
- assume they will be supplied with "fully-qualified" domain names,
- i.e., ones that include all of the labels leading to the root,
- including the TLD name. Those fully-qualified domain names are then
- passed to either the domain name resolution protocol itself or to the
- remote systems. Consequently, purported DNS names to be used in
- applications and to locate resources generally must contain at least
- one period (".") character. Those that do not are either invalid or
- require the application to supply additional information. Of course,
- this principle does not apply when the purpose of the application is
- to process or query TLD names themselves. The DNS specification also
- permits a trailing period to be used to denote the root, e.g.,
- "a.b.c" and "a.b.c." are equivalent, but the latter is more explicit
- and is required to be accepted by applications. This convention is
- especially important when a TLD name is being referred to directly.
- For example, while ".COM" has become the popular terminology for
- referring to that top-level domain, "COM." would be strictly and
- technically correct in talking about the DNS, since it shows that
- "COM" is a top-level domain name.
-
- There is a long history of applications moving beyond the "one or
- more periods" test in an attempt to verify that a valid TLD name is
- actually present. They have done this either by applying some
- heuristics to the form of the name or by consulting a local list of
- valid names. The historical heuristics are no longer effective. If
- one is to keep a local list, much more effort must be devoted to
- keeping it up-to-date than was the case several years ago.
-
- The heuristics were based on the observation that, since the DNS was
- first deployed, all top-level domain names were two, three, or four
- characters in length. All two-character names were associated with
- "country code" domains, with the specific labels (with a few early
- exceptions) drawn from the ISO list of codes for countries and
- similar entities [IS3166]. The three-letter names were "generic"
- TLDs, whose function was not country-specific, and there was exactly
- one four-letter TLD, the infrastructure domain "ARPA." [RFC1591].
- However, these length-dependent rules were conventions, rather than
- anything on which the protocols depended.
-
- Before the mid-1990s, lists of valid top-level domain names changed
- infrequently. New country codes were gradually, and then more
- rapidly, added as the Internet expanded, but the list of generic
- domains did not change at all between the establishment of the "INT."
- domain in 1988 and ICANN's allocation of new generic TLDs in 2000.
- Some application developers responded by assuming that any two-letter
- domain name could be valid as a TLD, but the list of generic TLDs was
- fixed and could be kept locally and tested. Several of these
- assumptions changed as ICANN started to allocate new top-level
-
-
-
-Klensin Informational [Page 4]
-
-RFC 3696 Checking and Transformation of Names February 2004
-
-
- domains: one two-letter domain that does not appear in the ISO 3166-1
- table [ISO.3166.1988] was tentatively approved, and new domains were
- created with three, four, and even six letter codes.
-
- As of the first quarter of 2003, the list of valid, non-country,
- top-level domains was .AERO, .BIZ, .COM, .COOP, .EDU, .GOV, .INFO,
- .INT, .MIL, .MUSEUM, .NAME, .NET, .ORG, .PRO, and .ARPA. ICANN is
- expected to expand that list at regular intervals, so the list that
- appears here should not be used in testing. Instead, systems that
- filter by testing top-level domain names should regularly update
- their local tables of TLDs (both "generic" and country-code-related)
- by polling the list published by IANA [DomainList]. It is
- likely that the better strategy has now become to make the "at least
- one period" test, to verify LDH conformance (including verification
- that the apparent TLD name is not all-numeric), and then to use the
- DNS to determine domain name validity, rather than trying to maintain
- a local list of valid TLD names.
-
- A DNS label may be no more than 63 octets long. This is in the form
- actually stored; if a non-ASCII label is converted to encoded
- "punycode" form (see Section 5), the length of that form may restrict
- the number of actual characters (in the original character set) that
- can be accommodated. A complete, fully-qualified, domain name must
- not exceed 255 octets.
-
- Some additional mechanisms for guessing correct domain names when
- incomplete information is provided have been developed for use with
- the web and are discussed in Section 4.4.
-
-3. Restrictions on email addresses
-
- Reference documents: RFC 2821 [RFC2821] and RFC 2822 [RFC2822]
-
- Contemporary email addresses consist of a "local part" separated from
- a "domain part" (a fully-qualified domain name) by an at-sign ("@").
- The syntax of the domain part corresponds to that in the previous
- section. The concerns identified in that section about filtering and
- lists of names apply to the domain names used in an email context as
- well. The domain name can also be replaced by an IP address in
- square brackets, but that form is strongly discouraged except for
- testing and troubleshooting purposes.
-
- The local part may appear using the quoting conventions described
- below. The quoted forms are rarely used in practice, but are
- required for some legitimate purposes. Hence, they should not be
- rejected in filtering routines but, should instead be passed to the
- email system for evaluation by the destination host.
-
-
-
-
-Klensin Informational [Page 5]
-
-RFC 3696 Checking and Transformation of Names February 2004
-
-
- The exact rule is that any ASCII character, including control
- characters, may appear quoted, or in a quoted string. When quoting
- is needed, the backslash character is used to quote the following
- character. For example
-
- Abc\@def at example.com
-
- is a valid form of an email address. Blank spaces may also appear,
- as in
-
- Fred\ Bloggs at example.com
-
- The backslash character may also be used to quote itself, e.g.,
-
- Joe.\\Blow at example.com
-
- In addition to quoting using the backslash character, conventional
- double-quote characters may be used to surround strings. For example
-
- "Abc at def"@example.com
-
- "Fred Bloggs"@example.com
-
- are alternate forms of the first two examples above. These quoted
- forms are rarely recommended, and are uncommon in practice, but, as
- discussed above, must be supported by applications that are
- processing email addresses. In particular, the quoted forms often
- appear in the context of addresses associated with transitions from
- other systems and contexts; those transitional requirements do still
- arise and, since a system that accepts a user-provided email address
- cannot "know" whether that address is associated with a legacy
- system, the address forms must be accepted and passed into the email
- environment.
-
- Without quotes, local-parts may consist of any combination of
- alphabetic characters, digits, or any of the special characters
-
- ! # $ % & ' * + - / = ? ^ _ ` . { | } ~
-
- period (".") may also appear, but may not be used to start or end the
- local part, nor may two or more consecutive periods appear. Stated
- differently, any ASCII graphic (printing) character other than the
- at-sign ("@"), backslash, double quote, comma, or square brackets may
- appear without quoting. If any of that list of excluded characters
- are to appear, they must be quoted. Forms such as
-
- user+mailbox at example.com
-
-
-
-
-Klensin Informational [Page 6]
-
-RFC 3696 Checking and Transformation of Names February 2004
-
-
- customer/department=shipping at example.com
-
- $A12345 at example.com
-
- !def!xyz%abc at example.com
-
- _somename at example.com
-
- are valid and are seen fairly regularly, but any of the characters
- listed above are permitted. In the context of local parts,
- apostrophe ("'") and acute accent ("`") are ordinary characters, not
- quoting characters. Some of the characters listed above are used in
- conventions about routing or other types of special handling by some
- receiving hosts. But, since there is no way to know whether the
- remote host is using those conventions or just treating these
- characters as normal text, sending programs (and programs evaluating
- address validity) must simply accept the strings and pass them on.
-
- In addition to restrictions on syntax, there is a length limit on
- email addresses. That limit is a maximum of 64 characters (octets)
- in the "local part" (before the "@") and a maximum of 255 characters
- (octets) in the domain part (after the "@") for a total length of 320
- characters. Systems that handle email should be prepared to process
- addresses which are that long, even though they are rarely
- encountered.
-
-4. URLs and URIs
-
-4.1. URI syntax definitions and issues
-
- The syntax for URLs (Uniform Resource Locators) is specified in
- [RFC1738]. The syntax for the more general "URI" (Uniform Resource
- Identifier) is specified in [RFC2396]. The URI syntax is extremely
- general, with considerable variations permitted according to the type
- of "scheme" (e.g., "http", "ftp", "mailto") that is being used.
- While it is possible to use the general syntax rules of RFC 2396 to
- perform syntax checks, they are general enough --essentially only
- specifying the separation of the scheme name and "scheme specific
- part" with a colon (":") and excluding some characters that must be
- escaped if used-- to provide little significant filtering or
- validation power.
-
- The following characters are reserved in many URIs -- they must be
- used for either their URI-intended purpose or must be encoded. Some
- particular schemes may either broaden or relax these restrictions
- (see the following sections for URLs applicable to "web pages" and
- electronic mail), or apply them only to particular URI component
- parts.
-
-
-
-Klensin Informational [Page 7]
-
-RFC 3696 Checking and Transformation of Names February 2004
-
-
- ; / ? : @ & = + $ , ?
-
- In addition, control characters, the space character, the double-
- quote (") character, and the following special characters
-
- < > # %
-
- are generally forbidden and must either be avoided or escaped, as
- discussed below.
-
- The colon after the scheme name, and the percent sign used to escape
- characters, are specifically reserved for those purposes, although
- ":" may also be used elsewhere in some schemes.
-
- When it is necessary to encode these, or other, characters, the
- method used is to replace it with a percent-sign ("%") followed by
- two hexidecimal digits representing its octet value. See section
- 2.4.1 of [RFC2396] for an exact definition. Unless it is used as a
- delimiter of the URI scheme itself, any character may optionally be
- encoded this way; systems that are testing URI syntax should be
- prepared for these encodings to appear in any component of the URI
- except the scheme name itself.
-
- A "generic URI" syntax is specified and is more restrictive, but
- using it to test URI strings requires that one know whether or not
- the particular scheme in use obeys that syntax. Consequently,
- applications that intend to check or validate URIs should normally
- identify the scheme name and then apply scheme-specific tests. The
- rules for two of those -- HTTP [RFC1738] and MAILTO [RFC2368] URLs --
- are discussed below, but the author of an application which intends
- to make very precise checks, or to reject particular syntax rather
- than just warning the user, should consult the relevant scheme-
- definition documents for precise syntax and relationships.
-
-4.2. The HTTP URL
-
- Absolute HTTP URLs consist of the scheme name, a host name (expressed
- as a domain name or IP address), and optional port number, and then,
- optionally, a path, a search part, and a fragment identifier. These
- are separated, respectively, by a colon and the two slashes that
- precede the host name, a colon, a slash, a question mark, and a hash
- mark ("#"). So we have
-
- http://host:port/path?search#fragment
-
- http://host/path/
-
- http://host/path#fragment
-
-
-
-Klensin Informational [Page 8]
-
-RFC 3696 Checking and Transformation of Names February 2004
-
-
- http://host/path?search
-
- http://host
-
- and other variations on that form. There is also a "relative" form,
- but it almost never appears in text that a user might, e.g., enter
- into a form. See [RFC2616] for details.
-
- The characters
-
- / ; ?
-
- are reserved within the path and search parts and must be encoded;
- the first of these may be used unencoded, and is often used within
- the path, to designate hierarchy.
-
-4.3. The MAILTO URL
-
- MAILTO is a URL type whose content is an email address. It can be
- used to encode any of the email address formats discussed in Section
- 3 above. It can also support multiple addresses and the inclusion of
- headers (e.g., Subject lines) within the body of the URL. MAILTO is
- authoritatively defined in RFC 2368 [RFC2368]; anyone expecting to
- accept and test multiple addresses or mail header or body formats
- should consult that document carefully.
-
- In accepting text for, or validating, a MAILTO URL, it is important
- to note that, while it can be used to encode any valid email address,
- it is not sufficient to copy an email address into a MAILTO URL since
- email addresses may include a number of characters that are invalid
- in, or have reserved uses for, URLs. Those characters must be
- encoded, as outlined in Section 4.1 above, when the addresses are
- mapped into the URL form. Conversely, addresses in MAILTO URLs
- cannot, in general, be copied directly into email contexts, since few
- email programs will reverse the decodings (and doing so might be
- interpreted as a protocol violation).
-
- The following characters may appear in MAILTO URLs only with the
- specific defined meanings given. If they appear in an email address
- (i.e., for some other purpose), they must be encoded:
-
- : The colon in "mailto:"
-
- < > # " % { } | \ ^ ~ `
-
- These characters are "unsafe" in any URL, and must always be
- encoded.
-
-
-
-
-Klensin Informational [Page 9]
-
-RFC 3696 Checking and Transformation of Names February 2004
-
-
- The following characters must also be encoded if they appear in a
- MAILTO URL
-
- ? & =
- Used to delimit headers and their values when these are encoded
- into URLs.
-
- Some examples may be helpful:
-
- +-------------------------+-----------------------------+-----------+
- | Email address | MAILTO URL | Notes |
- +-------------------------+-----------------------------+-----------+
- | Joe at example.com | mailto:joe at example.com | 1 |
- | | | |
- | user+mailbox at example | mailto: | 2 |
- | .com | user%2Bmailbox at example | |
- | | .com | |
- | | | |
- | customer/department= | mailto:customer%2F | 3 |
- | shipping at example.com | department=shipping at example | |
- | | .com | |
- | | | |
- | $A12345 at example.com | mailto:$A12345 at example | 4 |
- | | .com | |
- | | | |
- | !def!xyz%abc at example | mailto:!def!xyz%25abc | 5 |
- | .com | @example.com | |
- | | | |
- | _somename at example.com | mailto:_somename at example | 4 |
- | | .com | |
- +-------------------------+-----------------------------+-----------+
-
- Table 1
-
- Notes on Table
-
- 1. No characters appear in the email address that require escaping,
- so the body of the MAILTO URL is identical to the email address.
-
- 2. There is actually some uncertainty as to whether or not the "+"
- characters requires escaping in MAILTO URLs (the standards are
- not precisely clear). But, since any character in the address
- specification may optionally be encoded, it is probably safer to
- encode it.
-
- 3. The "/" character is generally reserved in URLs, and must be
- encoded as %2F.
-
-
-
-
-Klensin Informational [Page 10]
-
-RFC 3696 Checking and Transformation of Names February 2004
-
-
- 4. Neither the "$" nor the "_" character are given any special
- interpretation in MAILTO URLs, so need not be encoded.
-
- 5. While the "!" character has no special interpretation, the "%"
- character is used to introduce encoded sequences and hence it
- must always be encoded.
-
-4.4. Guessing domain names in web contexts
-
- Several web browsers have adopted a practice that permits an
- incomplete domain name to be used as input instead of a complete URL.
- This has, for example, permitted users to type "microsoft" and have
- the browser interpret the input as "http://www.microsoft.com/".
- Other browser versions have gone even further, trying to build DNS
- names up through a series of heuristics, testing each variation in
- turn to see if it appears in the DNS, and accepting the first one
- found as the intended domain name. Still, others automatically
- invoke search engines if no period appears or if the reference fails.
- If any of these approaches are to be used, it is often critical that
- the browser recognize the complete list of TLDs. If an incomplete
- list is used, complete domain names may not be recognized as such and
- the system may try to turn them into completely different names. For
- example, "example.aero" is a fully-qualified name, since "AERO." is a
- TLD name. But, if the system doesn't recognize "AERO" as a TLD name,
- it is likely to try to look up "example.aero.com" and
- "www.example.aero.com" (and then fail or find the wrong host), rather
- than simply looking up the user-supplied name.
-
- As discussed in Section 2 above, there are dangers associated with
- software that attempts to "know" the list of top-level domain names
- locally and take advantage of that knowledge. These name-guessing
- heuristics are another example of that situation: if the lists are
- up-to-date and used carefully, the systems in which they are embedded
- may provide an easier, and more attractive, experience for at least
- some users. But finding the wrong host, or being unable to find a
- host even when its name is precisely known, constitute bad
- experiences by any measure.
-
- More generally, there have been bad experiences with attempts to
- "complete" domain names by adding additional information to them.
- These issues are described in some detail in RFC 1535 [RFC1535].
-
-5. Implications of internationalization
-
- The IETF has adopted a series of proposals ([RFC3490] - [RFC3492])
- whose purpose is to permit encoding internationalized (i.e., non-
- ASCII) names in the DNS. The primary standard, and the group
- generically, are known as "IDNA". The actual strings stored in the
-
-
-
-Klensin Informational [Page 11]
-
-RFC 3696 Checking and Transformation of Names February 2004
-
-
- DNS are in an encoded form: the labels begin with the characters
- "xn--" followed by the encoded string. Applications should be
- prepared to accept and process the encoded form (those strings are
- consistent with the "LDH rule" (see Section 2) so should not raise
- any separate issues) and the use of local, and potentially other,
- characters as appropriate to local systems and circumstances.
-
- The IDNA specification describes the exact process to be used to
- validate a name or encoded string. The process is sufficiently
- complex that shortcuts or heuristics, especially for versions of
- labels written directly in Unicode or other coded character sets, are
- likely to fail and cause problems. In particular, the strings cannot
- be validated with syntax or semantic rules of any of the usual sorts:
- syntax validity is defined only in terms of the result of executing a
- particular function.
-
- In addition to the restrictions imposed by the protocols themselves,
- many domains are implementing rules about just which non-ASCII names
- they will permit to be registered (see, e.g., [JET], [RegRestr]).
- This work is still relatively new, and the rules and conventions are
- likely to be different for each domain, or at least each language or
- script group. Attempting to test for those rules in a client program
- to see if a user-supplied name might possibly exist in the relevant
- domain would almost certainly be ill-advised.
-
- One quick local test however, may be reasonable: as of the time of
- this writing, there should be no instances of labels in the DNS that
- start with two characters, followed by two hyphens, where the two
- characters are not "xn" (in, of course, either upper or lower case).
- Such label strings, if they appear, are probably erroneous or
- obsolete, and it may be reasonable to at least warn the user about
- them.
-
- There is ongoing work in the IETF and elsewhere to define
- internationalized formats for use in other protocols, including email
- addresses. Those forms may or may not conform to existing rules for
- ASCII-only identifiers; anyone designing evaluators or filters should
- watch that work closely.
-
-6. Summary
-
- When an application accepts a string from the user and ultimately
- passes it on to an API for a protocol, the desirability of testing or
- filtering the text in any way not required by the protocol itself is
- hotly debated. If it must divide the string into its components, or
- otherwise interpret it, it obviously must make at least enough tests
- to validate that process. With, e.g., domain names or email
- addresses that can be passed on untouched, the appropriateness of
-
-
-
-Klensin Informational [Page 12]
-
-RFC 3696 Checking and Transformation of Names February 2004
-
-
- trying to figure out which ones are valid and which ones are not
- requires a more complex decision, one that should include
- considerations of how to make exactly the correct tests and to keep
- information that changes and evolves up-to-date. A test containing
- obsolete information, can be extremely frustrating for potential
- correspondents or customers and may harm desired relationships.
-
-7. Security Considerations
-
- Since this document merely summarizes the requirements of existing
- standards, it does not introduce any new security issues. However,
- many of the techniques that motivate the document raise important
- security concerns of their own. Rejecting valid forms of domain
- names, email addresses, or URIs often denies service to the user of
- those entities. Worse, guessing at the user's intent when an
- incomplete address, or other string, is given can result in
- compromises to privacy or accuracy of reference if the wrong target
- is found and returned. From a security standpoint, the optimum
- behavior is probably to never guess, but instead, to force the user
- to specify exactly what is wanted. When that position involves a
- tradeoff with an acceptable user experience, good judgment should be
- used and the fact that it is a tradeoff recognized.
-
- Some characters have special or privileged meanings on some systems
- (i.e., ` on Unix). Applications should be careful to escape those
- locally if necessary. By the same token, they are valid, and should
- not be disallowed locally, or escaped when transmitted through
- Internet protocols, for such reasons if a remote site chooses to use
- them.
-
- The presence of local checking does not permit remote checking to be
- bypassed. Note that this can apply to a single machine; in
- particular, a local MTA should not assume that a local MUA has
- properly escaped locally-significant special characters.
-
-8. Acknowledgements
-
- The author would like to express his appreciation for helpful
- comments from Harald Alvestrand, Eric A. Hall, and the RFC Editor,
- and for partial support of this work from SITA. Responsibility for
- any errors remains, of course, with the author.
-
- The first Internet-Draft on this subject was posted in February 2003.
- The document was submitted to the RFC Editor on 20 June 2003,
- returned for revisions on 19 August, and resubmitted on 5 September
- 2003.
-
-
-
-
-
-Klensin Informational [Page 13]
-
-RFC 3696 Checking and Transformation of Names February 2004
-
-
-9. References
-
-9.1. Normative References
-
- [RFC1035] Mockapetris, P., "Domain names - implementation and
- specification", STD 13, RFC 1035, November 1987.
-
- [RFC1123] Braden, R., Ed., "Requirements for Internet Hosts -
- Application and Support", STD 3, RFC 1123, October
- 1989.
-
- [RFC1535] Gavron, E., "A Security Problem and Proposed
- Correction With Widely Deployed DNS Software", RFC
- 1535, October 1993.
-
- [RFC1738] Berners-Lee, T., Masinter, L. and M. McCahill,
- "Uniform Resource Locators (URL)", RFC 1738, December
- 1994.
-
- [RFC2181] Elz, R. and R. Bush, "Clarifications to the DNS
- Specification", RFC 2181, July 1997.
-
- [RFC2368] Hoffman, P., Masinter, L. and J. Zawinski, "The
- mailto URL scheme", RFC 2368, July 1998.
-
- [RFC2396] Berners-Lee, T., Fielding, R. and L. Masinter,
- "Uniform Resource Identifiers (URI): Generic Syntax",
- RFC 2396, August 1998.
-
- [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
- Masinter, L., Leach, P. and T. Berners-Lee,
- "Hypertext Transfer Protocol -- HTTP/1.1", RFC 2616,
- June 1999.
-
- [RFC2821] Klensin, J., Ed., "Simple Mail Transfer Protocol",
- RFC 2821, April 2001.
-
- [RFC2822] Resnick, P., Ed., "Internet Message Format", RFC
- 2822, April 2001.
-
- [RFC3490] Faltstrom, P., Hoffman, P. and A. Costello,
- "Internationalizing Domain Names in Applications
- (IDNA)", RFC 3490, March 2003.
-
- [RFC3491] Hoffman, P. and M. Blanchet, "Nameprep: A Stringprep
- Profile for Internationalized Domain Names (IDN)",
- RFC 3491, March 2003.
-
-
-
-
-Klensin Informational [Page 14]
-
-RFC 3696 Checking and Transformation of Names February 2004
-
-
- [RFC3492] Costello, A., "Punycode: A Bootstring encoding of
- Unicode for Internationalized Domain Names in
- Applications (IDNA)", RFC 3492, March 2003.
-
- [ASCII] American National Standards Institute (formerly
- United States of America Standards Institute), "USA
- Code for Information Interchange", ANSI X3.4-1968.
- ANSI X3.4-1968 has been replaced by newer versions
- with slight modifications, but the 1968 version
- remains definitive for the Internet.
-
- [DomainList] Internet Assigned Numbers Authority (IANA), Untitled
- alphabetical list of current top-level domains.
- http://data.iana.org/TLD/tlds-alpha-by-domain.txt
- ftp://data.iana.org/TLD/tlds-alpha-by-domain.txt
-
-9.2. Informative References
-
- [ISO.3166.1988] International Organization for Standardization,
- "Codes for the representation of names of countries,
- 3rd edition", ISO Standard 3166, August 1988.
-
- [JET] Konishi, K., et al., "Internationalized Domain Names
- Registration and Administration Guideline for
- Chinese, Japanese and Korean", Work in Progress.
-
- [RFC1591] Postel, J., "Domain Name System Structure and
- Delegation", RFC 1591, March 1994.
-
- [RegRestr] Klensin, J., "Registration of Internationalized
- Domain Names: Overview and Method", Work in Progress,
- February 2004.
-
-10. Author's Address
-
- John C Klensin
- 1770 Massachusetts Ave, #322
- Cambridge, MA 02140
- USA
-
- Phone: +1 617 491 5735
- EMail: john-ietf at jck.com
-
-
-
-
-
-
-
-
-
-Klensin Informational [Page 15]
-
-RFC 3696 Checking and Transformation of Names February 2004
-
-
-11. Full Copyright Statement
-
- Copyright (C) The Internet Society (2004). This document is subject
- to the rights, licenses and restrictions contained in BCP 78 and
- except as set forth therein, the authors retain all their rights.
-
- This document and the information contained herein are provided on an
- "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
- OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET
- ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED,
- INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
- INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
- WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
-
-Intellectual Property
-
- The IETF takes no position regarding the validity or scope of any
- Intellectual Property Rights or other rights that might be claimed to
- pertain to the implementation or use of the technology described in
- this document or the extent to which any license under such rights
- might or might not be available; nor does it represent that it has
- made any independent effort to identify any such rights. Information
- on the procedures with respect to rights in RFC documents can be
- found in BCP 78 and BCP 79.
-
- Copies of IPR disclosures made to the IETF Secretariat and any
- assurances of licenses to be made available, or the result of an
- attempt made to obtain a general license or permission for the use of
- such proprietary rights by implementers or users of this
- specification can be obtained from the IETF on-line IPR repository at
- http://www.ietf.org/ipr.
-
- The IETF invites any interested party to bring to its attention any
- copyrights, patents or patent applications, or other proprietary
- rights that may cover technology that may be required to implement
- this standard. Please address the information to the IETF at ietf-
- ipr at ietf.org.
-
-Acknowledgement
-
- Funding for the RFC Editor function is currently provided by the
- Internet Society.
-
-
-
-
-
-
-
-
-
-Klensin Informational [Page 16]
-
-
-Html markup produced by rfcmarkup 1.77, available from http://tools.ietf.org/tools/rfcmarkup/
\ No newline at end of file
diff --git a/reference/rfc4155 The application-mbox Media Type.txt b/reference/rfc4155 The application-mbox Media Type.txt
deleted file mode 100644
index f685040..0000000
--- a/reference/rfc4155 The application-mbox Media Type.txt
+++ /dev/null
@@ -1,502 +0,0 @@
- INFORMATIONAL
-
-Network Working Group E. Hall
-Request for Comments: 4155 September 2005
-Category: Informational
-
-
- The application/mbox Media Type
-
-Status of This Memo
-
- This memo provides information for the Internet community. It does
- not specify an Internet standard of any kind. Distribution of this
- memo is unlimited.
-
-Copyright Notice
-
- Copyright (C) The Internet Society (2005).
-
-Abstract
-
- This memo requests that the application/mbox media type be authorized
- for allocation by the IESG, according to the terms specified in RFC
- 2048. This memo also defines a default format for the mbox database,
- which must be supported by all conformant implementations.
-
-1. Background and Overview
-
- UNIX-like operating systems have historically made widespread use of
- "mbox" database files for a variety of local email purposes. In the
- common case, mbox files store linear sequences of one or more
- electronic mail messages, with local email clients treating the
- database as a logical folder of email messages. mbox databases are
- also used by a variety of other messaging tools, such as mailing list
- management programs, archiving and filtering utilities, messaging
- servers, and other related applications. In recent years, mbox
- databases have also become common on a large number of non-UNIX
- computing platforms, for similar kinds of purposes.
-
- The increased pervasiveness of these files has led to an increased
- demand for a standardized, network-wide interchange of these files as
- discrete database objects. In turn, this dictates a need for a
- general media type definition for mbox files, which is the subject
- and purpose of this memo.
-
-
-
-
-
-
-
-
-
-Hall Informational [Page 1]
-
-RFC 4155 The application/mbox Media Type September 2005
-
-
-2. About the mbox Database
-
- The mbox database format is not documented in an authoritative
- specification, but instead exists as a well-known output format that
- is anecdotally documented, or which is only authoritatively
- documented for a specific platform or tool.
-
- mbox databases typically contain a linear sequence of electronic mail
- messages. Each message begins with a separator line that identifies
- the message sender, and also identifies the date and time at which
- the message was received by the final recipient (either the last-hop
- system in the transfer path, or the system which serves as the
- recipient's mailstore). Each message is typically terminated by an
- empty line. The end of the database is usually recognized by either
- the absence of any additional data, or by the presence of an explicit
- end-of-file marker.
-
- The structure of the separator lines vary across implementations, but
- usually contain the exact character sequence of "From", followed by a
- single Space character (0x20), an email address of some kind, another
- Space character, a timestamp sequence of some kind, and an end-of-
- line marker. However, due to the lack of any authoritative
- specification, each of these attributes are known to vary widely
- across implementations. For example, the email address can reflect
- any addressing syntax that has ever been used on any messaging system
- in all of history (specifically including address forms that are not
- compatible with Internet messages, as defined by RFC 2822 [RFC2822]).
- Similarly, the timestamp sequences can also vary according to system
- output, while the end-of-line sequences will often reflect platform-
- specific requirements. Different data formats can even appear within
- a single database as a result of multiple mbox files being
- concatenated together, or because a single file was accessed by
- multiple messaging clients, each of which has used its own syntax for
- the separator line.
-
- Message data within mbox databases often reflects site-specific
- peculiarities. For example, it is entirely possible for the message
- body or headers in an mbox database to contain untagged eight-bit
- character data that implicitly reflects a site-specific default
- language or locale, or that reflects local defaults for timestamps
- and email addresses; none of this data is widely portable beyond the
- local scope. Similarly, message data can also contain unencoded
- eight-bit binary data, or can use encoding formats that represent a
- specific platform (e.g., BINHEX or UUENCODE sequences).
-
-
-
-
-
-
-
-Hall Informational [Page 2]
-
-RFC 4155 The application/mbox Media Type September 2005
-
-
- Many implementations are also known to escape message body lines that
- begin with the character sequence of "From ", so as to prevent
- confusion with overly-liberal parsers that do not search for full
- separator lines. In the common case, a leading Greater-Than symbol
- (0x3E) is used for this purpose (with "From " becoming ">From ").
- However, other implementations are known not to escape such lines
- unless they are immediately preceded by a blank line or if they also
- appear to contain an email address and a timestamp. Other
- implementations are also known to perform secondary escapes against
- these lines if they are already escaped or quoted, while others
- ignore these mechanisms altogether.
-
- A comprehensive description of mbox database files on UNIX-like
- systems can be found at http://qmail.org./man/man5/mbox.html, which
- should be treated as mostly authoritative for those variations that
- are otherwise only documented in anecdotal form. However, readers
- are advised that many other platforms and tools make use of mbox
- databases, and that there are many more potential variations that can
- be encountered in the wild.
-
- In order to mitigate errors that may arise from such vagaries, this
- specification defines a "format" parameter to the application/mbox
- media type declaration, which can be used to identify the specific
- kind of mbox database that is being transferred. Furthermore, this
- specification defines a "default" database format which MUST be
- supported by implementations that claim to be compliant with this
- specification, and which is to be used as the implicit format for
- undeclared application/mbox data objects. Additional format types
- are to be defined in subsequent specifications. Messaging systems
- that receive an mbox database with an unknown format parameter value
- SHOULD treat the data as an opaque binary object, as if the data had
- been declared as application/octet-stream
-
- Refer to Appendix A for a description of the default mbox format.
-
- Note that RFC 2046 [RFC2046] defines the multipart/digest media type
- for transferring platform-independent message files. Because that
- specification defines a set of neutral and strict formatting rules,
- the multipart/digest media type already facilitates highly-
- predictable transfer and conversion operations; as such, implementers
- are strongly encouraged to support and use that media type where
- possible.
-
-
-
-
-
-
-
-
-
-Hall Informational [Page 3]
-
-RFC 4155 The application/mbox Media Type September 2005
-
-
-3. Prerequisites and Terminology
-
- Readers of this document are expected to be familiar with the
- specification for MIME [RFC2045] and MIME-type registrations
- [RFC2048].
-
- The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
- "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
- document are to be interpreted as described in RFC 2119 [RFC2119].
-
-4. The application/mbox Media Type Registration
-
- This section provides the media type registration application (as per
- [RFC2048]).
-
- MIME media type name: application
-
- MIME subtype name: mbox
-
- Required parameters: none
-
- Optional parameters: The "format" parameter identifies the format of
- the mbox database and the messages contained therein. The default
- value for the "format" parameter is "default", and refers to the
- formatting rules defined in Appendix A of this memo. mbox databases
- that do not have a "format" parameter SHOULD be interpreted as having
- the implicit "format" value of "default". mbox databases that have
- an unknown value for the "format" parameter SHOULD be treated as
- opaque data objects, as if the media type had been specified as
- application/octet-stream. Additional values for the format parameter
- are to be defined in subsequent specifications, and registered with
- IANA.
-
- Encoding considerations: If an email client receives an mbox database
- as a message attachment, and then stores that attachment within a
- local mbox database, the contents of the two database files may
- become irreversibly intermingled, such that both databases are
- rendered unrecognizable. In order to avoid these collisions,
- messaging systems that support this specification MUST encode an mbox
- database (or at a minimum, the separator lines) with non-transparent
- transfer encoding (such as BASE64 or Quoted-Printable) whenever an
- application/mbox object is transferred via messaging protocols.
- Other transfer services are generally encouraged to adopt similar
- encoding strategies in order to allow for any subsequent
- retransmission that might occur, but this is not a requirement.
- Implementers should also be prepared to encode mbox data locally if
- non-compliant data is received.
-
-
-
-
-Hall Informational [Page 4]
-
-RFC 4155 The application/mbox Media Type September 2005
-
-
- Security considerations: mbox data is passive, and does not generally
- represent a unique or new security threat. However, there is risk in
- sharing any kind of data, because unintentional information may be
- exposed, and this risk certainly applies to mbox data as well.
-
- Interoperability considerations: Due to the lack of a single
- authoritative specification for mbox databases, there are a large
- number of variations between database formats (refer to the
- introduction text for common examples), and it is expected that non-
- conformant data will be erroneously tagged or exchanged. Although
- the "default" format specified in this memo does not allow for these
- kinds of vagaries, prior negotiation or agreement between humans may
- sometimes be needed.
-
- Published specification: see Appendix A.
-
- Applications that use this media type: hundreds of messaging products
- make use of the mbox database format, in one form or another.
-
- Magic number(s): mbox database files can be recognized by having a
- leading character sequence of "From", followed by a single Space
- character (0x20), followed by additional printable character data
- (refer to the description in Appendix A for details). However,
- implementers are cautioned that all such files will not be compliant
- with all of the formatting rules, therefore implementers should treat
- these files with an appropriate amount of circumspection.
-
- File extension(s): mbox database files sometimes have an ".mbox"
- extension, but this is not required nor expected. As with magic
- numbers, implementers should avoid reflexive assumptions about the
- contents of such files.
-
- Macintosh File Type Code(s): None are known to be common.
-
- Person & email address to contact for further information: Eric A.
- Hall (ehall at ntrg.com)
-
- Intended usage: COMMON
-
-5. Security Considerations
-
- See the discussion in section 4.
-
-
-
-
-
-
-
-
-
-Hall Informational [Page 5]
-
-RFC 4155 The application/mbox Media Type September 2005
-
-
-6. IANA Considerations
-
- The IANA has registered the application/mbox media type in the MIME
- registry, using the application provided in section 4 above.
-
- Furthermore, IANA has established and will maintain a registry of
- values for the "format" parameter as described in this memo. The
- first registration is the "default" value, using the description
- provided in Appendix A. Subsequent values for the "format" parameter
- MUST be accompanied by some form of recognizable, complete, and
- legitimate specification, such as an IESG-approved specification, or
- some kind of authoritative vendor documentation.
-
-7. Normative References
-
- [RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
- Extensions (MIME) Part One: Format of Internet Message
- Bodies", RFC 2045, November 1996.
-
- [RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
- Extensions (MIME) Part Two: Media Types", RFC 2046,
- November 1996.
-
- [RFC2048] Freed, N., Klensin, J., and J. Postel, "Multipurpose
- Internet Mail Extensions (MIME) Part Four: Registration
- Procedures", BCP 13, RFC 2048, November 1996.
-
- [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
- Requirement Levels", BCP 14, RFC 2119, March 1997.
-
- [RFC2822] Resnick, P., "Internet Message Format", RFC 2822, April
- 2001.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Hall Informational [Page 6]
-
-RFC 4155 The application/mbox Media Type September 2005
-
-
-Appendix A. The "default" mbox Database Format
-
- In order to improve interoperability among messaging systems, this
- memo defines a "default" mbox database format, which MUST be
- supported by all implementations that claim to be compliant with this
- specification.
-
- The "default" mbox database format uses a linear sequence of Internet
- messages, with each message being immediately prefaced by a separator
- line, and being terminated by an empty line. More specifically:
-
- o Each message within the database MUST follow the syntax and
- formatting rules defined in RFC 2822 [RFC2822] and its related
- specifications, with the exception that the canonical mbox
- database MUST use a single Line-Feed character (0x0A) as the
- end-of-line sequence, and MUST NOT use a Carriage-Return/Line-
- Feed pair (NB: this requirement only applies to the canonical
- mbox database as transferred, and does not override any other
- specifications). This usage represents the most common
- historical representation of the mbox database format, and
- allows for the least amount of conversion.
-
- o Messages within the default mbox database MUST consist of
- seven-bit characters within an eight-bit stream. Eight-bit data
- within the stream MUST be converted to a seven-bit form (using
- appropriate, standardized encoding) and appropriately tagged
- (with the correct header fields) before the database is
- transferred.
-
- o Message headers and data in the default mbox database MUST be
- fully-qualified, as per the relevant specification(s). For
- example, email addresses in the various header fields MUST have
- legitimate domain names (as per RFC 2822), while extended
- characters and encodings MUST be specified in the appropriate
- location (as per the appropriate MIME specifications), and so
- forth.
-
- o Each message in the mbox database MUST be immediately preceded
- by a single separator line, which MUST conform to the following
- syntax:
-
- The exact character sequence of "From";
-
- a single Space character (0x20);
-
- the email address of the message sender (as obtained from the
- message envelope or other authoritative source), conformant
- with the "addr-spec" syntax from RFC 2822;
-
-
-
-Hall Informational [Page 7]
-
-RFC 4155 The application/mbox Media Type September 2005
-
-
- a single Space character;
-
- a timestamp indicating the UTC date and time when the message
- was originally received, conformant with the syntax of the
- traditional UNIX 'ctime' output sans timezone (note that the
- use of UTC precludes the need for a timezone indicator);
-
- an end-of-line marker.
-
- o Each message in the database MUST be terminated by an empty
- line, containing a single end-of-line marker.
-
- Note that the first message in an mbox database will only be prefaced
- by a separator line, while every other message will begin with two
- end-of-line sequences (one at the end of the message itself, and
- another to mark the end of the message within the mbox database file
- stream) and a separator line (marking the new message). The end of
- the database is implicitly reached when no more message data or
- separator lines are found.
-
- Also note that this specification does not prescribe any escape
- syntax for message body lines that begin with the character sequence
- of "From ". Recipient systems are expected to parse full separator
- lines as they are documented above.
-
-Author's Address
-
- Eric A. Hall
-
- EMail: ehall at ntrg.com
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Hall Informational [Page 8]
-
-RFC 4155 The application/mbox Media Type September 2005
-
-
-Full Copyright Statement
-
- Copyright (C) The Internet Society (2005).
-
- This document is subject to the rights, licenses and restrictions
- contained in BCP 78, and except as set forth therein, the authors
- retain all their rights.
-
- This document and the information contained herein are provided on an
- "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
- OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET
- ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED,
- INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
- INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
- WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
-
-Intellectual Property
-
- The IETF takes no position regarding the validity or scope of any
- Intellectual Property Rights or other rights that might be claimed to
- pertain to the implementation or use of the technology described in
- this document or the extent to which any license under such rights
- might or might not be available; nor does it represent that it has
- made any independent effort to identify any such rights. Information
- on the procedures with respect to rights in RFC documents can be
- found in BCP 78 and BCP 79.
-
- Copies of IPR disclosures made to the IETF Secretariat and any
- assurances of licenses to be made available, or the result of an
- attempt made to obtain a general license or permission for the use of
- such proprietary rights by implementers or users of this
- specification can be obtained from the IETF on-line IPR repository at
- http://www.ietf.org/ipr.
-
- The IETF invites any interested party to bring to its attention any
- copyrights, patents or patent applications, or other proprietary
- rights that may cover technology that may be required to implement
- this standard. Please address the information to the IETF at ietf-
- ipr at ietf.org.
-
-Acknowledgement
-
- Funding for the RFC Editor function is currently provided by the
- Internet Society.
-
-
-
-
-
-
-
-Hall Informational [Page 9]
diff --git a/reference/rfc4234 Augmented BNF for Syntax Specifications - ABNF.txt b/reference/rfc4234 Augmented BNF for Syntax Specifications - ABNF.txt
deleted file mode 100644
index dcb41c3..0000000
--- a/reference/rfc4234 Augmented BNF for Syntax Specifications - ABNF.txt
+++ /dev/null
@@ -1,899 +0,0 @@
-
-
-
-
-
-
-Network Working Group D. Crocker, Ed.
-Request for Comments: 4234 Brandenburg InternetWorking
-Obsoletes: 2234 P. Overell
-Category: Standards Track THUS plc.
- October 2005
-
-
- Augmented BNF for Syntax Specifications: ABNF
-
-Status of This Memo
-
- This document specifies an Internet standards track protocol for the
- Internet community, and requests discussion and suggestions for
- improvements. Please refer to the current edition of the "Internet
- Official Protocol Standards" (STD 1) for the standardization state
- and status of this protocol. Distribution of this memo is unlimited.
-
-Copyright Notice
-
- Copyright (C) The Internet Society (2005).
-
-Abstract
-
- Internet technical specifications often need to define a formal
- syntax. Over the years, a modified version of Backus-Naur Form
- (BNF), called Augmented BNF (ABNF), has been popular among many
- Internet specifications. The current specification documents ABNF.
- It balances compactness and simplicity, with reasonable
- representational power. The differences between standard BNF and
- ABNF involve naming rules, repetition, alternatives, order-
- independence, and value ranges. This specification also supplies
- additional rule definitions and encoding for a core lexical analyzer
- of the type common to several Internet specifications.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Crocker & Overell Standards Track [Page 1]
-
-RFC 4234 ABNF October 2005
-
-
-Table of Contents
-
- 1. INTRODUCTION ....................................................2
- 2. RULE DEFINITION .................................................3
- 2.1. Rule Naming ................................................3
- 2.2. Rule Form ..................................................3
- 2.3. Terminal Values ............................................4
- 2.4. External Encodings .........................................5
- 3. OPERATORS .......................................................6
- 3.1. Concatenation: Rule1 Rule2 ................................6
- 3.2. Alternatives: Rule1 / Rule2 ...............................6
- 3.3. Incremental Alternatives: Rule1 =/ Rule2 ...................7
- 3.4. Value Range Alternatives: %c##-## .........................7
- 3.5. Sequence Group: (Rule1 Rule2) .............................8
- 3.6. Variable Repetition: *Rule ................................8
- 3.7. Specific Repetition: nRule ................................9
- 3.8. Optional Sequence: [RULE] .................................9
- 3.9. Comment: ; Comment ........................................9
- 3.10. Operator Precedence .......................................9
- 4. ABNF DEFINITION OF ABNF ........................................10
- 5. SECURITY CONSIDERATIONS ........................................11
- 6. References .....................................................11
- 6.1. Normative References ......................................11
- 6.2. Informative References ....................................11
- Appendix A. ACKNOWLEDGEMENTS .....................................13
- Appendix B. APPENDIX - CORE ABNF OF ABNF .........................13
- B.1. Core Rules ...............................................13
- B.2. Common Encoding ..........................................14
-
-1. INTRODUCTION
-
- Internet technical specifications often need to define a formal
- syntax and are free to employ whatever notation their authors deem
- useful. Over the years, a modified version of Backus-Naur Form
- (BNF), called Augmented BNF (ABNF), has been popular among many
- Internet specifications. It balances compactness and simplicity,
- with reasonable representational power. In the early days of the
- Arpanet, each specification contained its own definition of ABNF.
- This included the email specifications, [RFC733] and then [RFC822],
- which came to be the common citations for defining ABNF. The current
- document separates those definitions to permit selective reference.
- Predictably, it also provides some modifications and enhancements.
-
- The differences between standard BNF and ABNF involve naming rules,
- repetition, alternatives, order-independence, and value ranges.
- Appendix B supplies rule definitions and encoding for a core lexical
- analyzer of the type common to several Internet specifications. It
- is provided as a convenience and is otherwise separate from the meta
-
-
-
-Crocker & Overell Standards Track [Page 2]
-
-RFC 4234 ABNF October 2005
-
-
- language defined in the body of this document, and separate from its
- formal status.
-
- Changes since [RFC2234]:
-
- In Section 3.7, the phrase: "That is, exactly <N> occurrences of
- <element>." was corrected to: "That is, exactly <n> occurrences of
- <element>."
-
- Some continuation comment lines needed to be corrected to begin
- with comment character (";").
-
-2. RULE DEFINITION
-
-2.1. Rule Naming
-
- The name of a rule is simply the name itself; that is, a sequence of
- characters, beginning with an alphabetic character, and followed by a
- combination of alphabetics, digits, and hyphens (dashes).
-
- NOTE:
-
- Rule names are case-insensitive
-
- The names <rulename>, <Rulename>, <RULENAME>, and <rUlENamE> all
- refer to the same rule.
-
- Unlike original BNF, angle brackets ("<", ">") are not required.
- However, angle brackets may be used around a rule name whenever their
- presence facilitates in discerning the use of a rule name. This is
- typically restricted to rule name references in free-form prose, or
- to distinguish partial rules that combine into a string not separated
- by white space, such as shown in the discussion about repetition,
- below.
-
-2.2. Rule Form
-
- A rule is defined by the following sequence:
-
- name = elements crlf
-
- where <name> is the name of the rule, <elements> is one or more rule
- names or terminal specifications, and <crlf> is the end-of-line
- indicator (carriage return followed by line feed). The equal sign
- separates the name from the definition of the rule. The elements
- form a sequence of one or more rule names and/or value definitions,
- combined according to the various operators defined in this document,
- such as alternative and repetition.
-
-
-
-Crocker & Overell Standards Track [Page 3]
-
-RFC 4234 ABNF October 2005
-
-
- For visual ease, rule definitions are left aligned. When a rule
- requires multiple lines, the continuation lines are indented. The
- left alignment and indentation are relative to the first lines of the
- ABNF rules and need not match the left margin of the document.
-
-2.3. Terminal Values
-
- Rules resolve into a string of terminal values, sometimes called
- characters. In ABNF, a character is merely a non-negative integer.
- In certain contexts, a specific mapping (encoding) of values into a
- character set (such as ASCII) will be specified.
-
- Terminals are specified by one or more numeric characters, with the
- base interpretation of those characters indicated explicitly. The
- following bases are currently defined:
-
- b = binary
-
- d = decimal
-
- x = hexadecimal
-
- Hence:
-
- CR = %d13
-
- CR = %x0D
-
- respectively specify the decimal and hexadecimal representation of
- [US-ASCII] for carriage return.
-
- A concatenated string of such values is specified compactly, using a
- period (".") to indicate a separation of characters within that
- value. Hence:
-
- CRLF = %d13.10
-
- ABNF permits the specification of literal text strings directly,
- enclosed in quotation-marks. Hence:
-
- command = "command string"
-
- Literal text strings are interpreted as a concatenated set of
- printable characters.
-
-
-
-
-
-
-
-Crocker & Overell Standards Track [Page 4]
-
-RFC 4234 ABNF October 2005
-
-
- NOTE:
-
- ABNF strings are case-insensitive and the character set for these
- strings is us-ascii.
-
- Hence:
-
- rulename = "abc"
-
- and:
-
- rulename = "aBc"
-
- will match "abc", "Abc", "aBc", "abC", "ABc", "aBC", "AbC", and
- "ABC".
-
- To specify a rule that IS case SENSITIVE, specify the characters
- individually.
-
- For example:
-
- rulename = %d97 %d98 %d99
-
- or
-
- rulename = %d97.98.99
-
- will match only the string that comprises only the lowercased
- characters, abc.
-
-2.4. External Encodings
-
- External representations of terminal value characters will vary
- according to constraints in the storage or transmission environment.
- Hence, the same ABNF-based grammar may have multiple external
- encodings, such as one for a 7-bit US-ASCII environment, another for
- a binary octet environment, and still a different one when 16-bit
- Unicode is used. Encoding details are beyond the scope of ABNF,
- although Appendix A (Core) provides definitions for a 7-bit US-ASCII
- environment as has been common to much of the Internet.
-
- By separating external encoding from the syntax, it is intended that
- alternate encoding environments can be used for the same syntax.
-
-
-
-
-
-
-
-
-Crocker & Overell Standards Track [Page 5]
-
-RFC 4234 ABNF October 2005
-
-
-3. OPERATORS
-
-3.1. Concatenation: Rule1 Rule2
-
- A rule can define a simple, ordered string of values (i.e., a
- concatenation of contiguous characters) by listing a sequence of rule
- names. For example:
-
- foo = %x61 ; a
-
- bar = %x62 ; b
-
- mumble = foo bar foo
-
- So that the rule <mumble> matches the lowercase string "aba".
-
- LINEAR WHITE SPACE: Concatenation is at the core of the ABNF parsing
- model. A string of contiguous characters (values) is parsed
- according to the rules defined in ABNF. For Internet specifications,
- there is some history of permitting linear white space (space and
- horizontal tab) to be freely and implicitly interspersed around major
- constructs, such as delimiting special characters or atomic strings.
-
- NOTE:
-
- This specification for ABNF does not provide for implicit
- specification of linear white space.
-
- Any grammar that wishes to permit linear white space around
- delimiters or string segments must specify it explicitly. It is
- often useful to provide for such white space in "core" rules that are
- then used variously among higher-level rules. The "core" rules might
- be formed into a lexical analyzer or simply be part of the main
- ruleset.
-
-3.2. Alternatives: Rule1 / Rule2
-
- Elements separated by a forward slash ("/") are alternatives.
- Therefore,
-
- foo / bar
-
- will accept <foo> or <bar>.
-
-
-
-
-
-
-
-
-Crocker & Overell Standards Track [Page 6]
-
-RFC 4234 ABNF October 2005
-
-
- NOTE:
-
- A quoted string containing alphabetic characters is a special form
- for specifying alternative characters and is interpreted as a
- non-terminal representing the set of combinatorial strings with
- the contained characters, in the specified order but with any
- mixture of upper and lower case.
-
-3.3. Incremental Alternatives: Rule1 =/ Rule2
-
- It is sometimes convenient to specify a list of alternatives in
- fragments. That is, an initial rule may match one or more
- alternatives, with later rule definitions adding to the set of
- alternatives. This is particularly useful for otherwise, independent
- specifications that derive from the same parent rule set, such as
- often occurs with parameter lists. ABNF permits this incremental
- definition through the construct:
-
- oldrule =/ additional-alternatives
-
- So that the rule set
-
- ruleset = alt1 / alt2
-
- ruleset =/ alt3
-
- ruleset =/ alt4 / alt5
-
- is the same as specifying
-
- ruleset = alt1 / alt2 / alt3 / alt4 / alt5
-
-3.4. Value Range Alternatives: %c##-##
-
- A range of alternative numeric values can be specified compactly,
- using dash ("-") to indicate the range of alternative values. Hence:
-
- DIGIT = %x30-39
-
- is equivalent to:
-
- DIGIT = "0" / "1" / "2" / "3" / "4" / "5" / "6" /
-
- "7" / "8" / "9"
-
- Concatenated numeric values and numeric value ranges cannot be
- specified in the same string. A numeric value may use the dotted
- notation for concatenation or it may use the dash notation to specify
-
-
-
-Crocker & Overell Standards Track [Page 7]
-
-RFC 4234 ABNF October 2005
-
-
- one value range. Hence, to specify one printable character between
- end of line sequences, the specification could be:
-
- char-line = %x0D.0A %x20-7E %x0D.0A
-
-3.5. Sequence Group: (Rule1 Rule2)
-
- Elements enclosed in parentheses are treated as a single element,
- whose contents are STRICTLY ORDERED. Thus,
-
- elem (foo / bar) blat
-
- matches (elem foo blat) or (elem bar blat), and
-
- elem foo / bar blat
-
- matches (elem foo) or (bar blat).
-
- NOTE:
-
- It is strongly advised that grouping notation be used, rather than
- relying on the proper reading of "bare" alternations, when
- alternatives consist of multiple rule names or literals.
-
- Hence, it is recommended that the following form be used:
-
- (elem foo) / (bar blat)
-
- It will avoid misinterpretation by casual readers.
-
- The sequence group notation is also used within free text to set off
- an element sequence from the prose.
-
-3.6. Variable Repetition: *Rule
-
- The operator "*" preceding an element indicates repetition. The full
- form is:
-
- <a>*<b>element
-
- where <a> and <b> are optional decimal values, indicating at least
- <a> and at most <b> occurrences of the element.
-
- Default values are 0 and infinity so that *<element> allows any
- number, including zero; 1*<element> requires at least one;
- 3*3<element> allows exactly 3 and 1*2<element> allows one or two.
-
-
-
-
-
-Crocker & Overell Standards Track [Page 8]
-
-RFC 4234 ABNF October 2005
-
-
-3.7. Specific Repetition: nRule
-
- A rule of the form:
-
- <n>element
-
- is equivalent to
-
- <n>*<n>element
-
- That is, exactly <n> occurrences of <element>. Thus, 2DIGIT is a 2-
- digit number, and 3ALPHA is a string of three alphabetic characters.
-
-3.8. Optional Sequence: [RULE]
-
- Square brackets enclose an optional element sequence:
-
- [foo bar]
-
- is equivalent to
-
- *1(foo bar).
-
-3.9. Comment: ; Comment
-
- A semi-colon starts a comment that continues to the end of line.
- This is a simple way of including useful notes in parallel with the
- specifications.
-
-3.10. Operator Precedence
-
- The various mechanisms described above have the following precedence,
- from highest (binding tightest) at the top, to lowest (loosest) at
- the bottom:
-
- Strings, Names formation
-
- Comment
-
- Value range
-
- Repetition
-
- Grouping, Optional
-
- Concatenation
-
- Alternative
-
-
-
-Crocker & Overell Standards Track [Page 9]
-
-RFC 4234 ABNF October 2005
-
-
- Use of the alternative operator, freely mixed with concatenations,
- can be confusing.
-
- Again, it is recommended that the grouping operator be used to
- make explicit concatenation groups.
-
-4. ABNF DEFINITION OF ABNF
-
- NOTES:
-
- 1. This syntax requires a formatting of rules that is relatively
- strict. Hence, the version of a ruleset included in a
- specification might need preprocessing to ensure that it can be
- interpreted by an ABNF parser.
-
- 2. This syntax uses the rules provided in Appendix B (Core).
-
- rulelist = 1*( rule / (*c-wsp c-nl) )
-
- rule = rulename defined-as elements c-nl
- ; continues if next line starts
- ; with white space
-
- rulename = ALPHA *(ALPHA / DIGIT / "-")
-
- defined-as = *c-wsp ("=" / "=/") *c-wsp
- ; basic rules definition and
- ; incremental alternatives
-
- elements = alternation *c-wsp
-
- c-wsp = WSP / (c-nl WSP)
-
- c-nl = comment / CRLF
- ; comment or newline
-
- comment = ";" *(WSP / VCHAR) CRLF
-
- alternation = concatenation
- *(*c-wsp "/" *c-wsp concatenation)
-
- concatenation = repetition *(1*c-wsp repetition)
-
- repetition = [repeat] element
-
- repeat = 1*DIGIT / (*DIGIT "*" *DIGIT)
-
-
-
-
-
-Crocker & Overell Standards Track [Page 10]
-
-RFC 4234 ABNF October 2005
-
-
- element = rulename / group / option /
- char-val / num-val / prose-val
-
- group = "(" *c-wsp alternation *c-wsp ")"
-
- option = "[" *c-wsp alternation *c-wsp "]"
-
- char-val = DQUOTE *(%x20-21 / %x23-7E) DQUOTE
- ; quoted string of SP and VCHAR
- ; without DQUOTE
-
- num-val = "%" (bin-val / dec-val / hex-val)
-
- bin-val = "b" 1*BIT
- [ 1*("." 1*BIT) / ("-" 1*BIT) ]
- ; series of concatenated bit values
- ; or single ONEOF range
-
- dec-val = "d" 1*DIGIT
- [ 1*("." 1*DIGIT) / ("-" 1*DIGIT) ]
-
- hex-val = "x" 1*HEXDIG
- [ 1*("." 1*HEXDIG) / ("-" 1*HEXDIG) ]
-
- prose-val = "<" *(%x20-3D / %x3F-7E) ">"
- ; bracketed string of SP and VCHAR
- ; without angles
- ; prose description, to be used as
- ; last resort
-
-5. SECURITY CONSIDERATIONS
-
- Security is truly believed to be irrelevant to this document.
-
-6. References
-
-6.1. Normative References
-
- [US-ASCII] American National Standards Institute, "Coded Character
- Set -- 7-bit American Standard Code for Information
- Interchange", ANSI X3.4, 1986.
-
-6.2. Informative References
-
- [RFC2234] Crocker, D. and P. Overell, "Augmented BNF for Syntax
- Specifications: ABNF", RFC 2234, November 1997.
-
-
-
-
-
-Crocker & Overell Standards Track [Page 11]
-
-RFC 4234 ABNF October 2005
-
-
- [RFC733] Crocker, D., Vittal, J., Pogran, K., and D. Henderson,
- "Standard for the format of ARPA network text messages",
- RFC 733, November 1977.
-
- [RFC822] Crocker, D., "Standard for the format of ARPA Internet
- text messages", STD 11, RFC 822, August 1982.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Crocker & Overell Standards Track [Page 12]
-
-RFC 4234 ABNF October 2005
-
-
-Appendix A. ACKNOWLEDGEMENTS
-
- The syntax for ABNF was originally specified in RFC 733. Ken L.
- Harrenstien, of SRI International, was responsible for re-coding the
- BNF into an augmented BNF that makes the representation smaller and
- easier to understand.
-
- This recent project began as a simple effort to cull out the portion
- of RFC 822 that has been repeatedly cited by non-email specification
- writers, namely the description of augmented BNF. Rather than simply
- and blindly converting the existing text into a separate document,
- the working group chose to give careful consideration to the
- deficiencies, as well as benefits, of the existing specification and
- related specifications made available over the last 15 years, and
- therefore to pursue enhancement. This turned the project into
- something rather more ambitious than was first intended.
- Interestingly, the result is not massively different from that
- original, although decisions, such as removing the list notation,
- came as a surprise.
-
- This "separated" version of the specification was part of the DRUMS
- working group, with significant contributions from Jerome Abela,
- Harald Alvestrand, Robert Elz, Roger Fajman, Aviva Garrett, Tom
- Harsch, Dan Kohn, Bill McQuillan, Keith Moore, Chris Newman, Pete
- Resnick, and Henning Schulzrinne.
-
- Julian Reschke warrants a special thanks for converting the Draft
- Standard version to XML source form.
-
-Appendix B. APPENDIX - CORE ABNF OF ABNF
-
- This Appendix is provided as a convenient core for specific grammars.
- The definitions may be used as a core set of rules.
-
-B.1. Core Rules
-
- Certain basic rules are in uppercase, such as SP, HTAB, CRLF, DIGIT,
- ALPHA, etc.
-
- ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
-
- BIT = "0" / "1"
-
- CHAR = %x01-7F
- ; any 7-bit US-ASCII character,
- ; excluding NUL
-
-
-
-
-
-Crocker & Overell Standards Track [Page 13]
-
-RFC 4234 ABNF October 2005
-
-
- CR = %x0D
- ; carriage return
-
- CRLF = CR LF
- ; Internet standard newline
-
- CTL = %x00-1F / %x7F
- ; controls
-
- DIGIT = %x30-39
- ; 0-9
-
- DQUOTE = %x22
- ; " (Double Quote)
-
- HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
-
- HTAB = %x09
- ; horizontal tab
-
- LF = %x0A
- ; linefeed
-
- LWSP = *(WSP / CRLF WSP)
- ; linear white space (past newline)
-
- OCTET = %x00-FF
- ; 8 bits of data
-
- SP = %x20
-
- VCHAR = %x21-7E
- ; visible (printing) characters
-
- WSP = SP / HTAB
- ; white space
-
-B.2. Common Encoding
-
- Externally, data are represented as "network virtual ASCII" (namely,
- 7-bit US-ASCII in an 8-bit field), with the high (8th) bit set to
- zero. A string of values is in "network byte order", in which the
- higher-valued bytes are represented on the left-hand side and are
- sent over the network first.
-
-
-
-
-
-
-
-Crocker & Overell Standards Track [Page 14]
-
-RFC 4234 ABNF October 2005
-
-
-Authors' Addresses
-
- Dave Crocker (editor)
- Brandenburg InternetWorking
- 675 Spruce Dr.
- Sunnyvale, CA 94086
- US
-
- Phone: +1.408.246.8253
- EMail: dcrocker at bbiw.net
-
-
- Paul Overell
- THUS plc.
- 1/2 Berkeley Square
- 99 Berkeley Street
- Glasgow
- G3 7HR
- UK
-
- EMail: paul.overell at thus.net
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Crocker & Overell Standards Track [Page 15]
-
-RFC 4234 ABNF October 2005
-
-
-Full Copyright Statement
-
- Copyright (C) The Internet Society (2005).
-
- This document is subject to the rights, licenses and restrictions
- contained in BCP 78, and except as set forth therein, the authors
- retain all their rights.
-
- This document and the information contained herein are provided on an
- "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
- OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET
- ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED,
- INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
- INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
- WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
-
-Intellectual Property
-
- The IETF takes no position regarding the validity or scope of any
- Intellectual Property Rights or other rights that might be claimed to
- pertain to the implementation or use of the technology described in
- this document or the extent to which any license under such rights
- might or might not be available; nor does it represent that it has
- made any independent effort to identify any such rights. Information
- on the procedures with respect to rights in RFC documents can be
- found in BCP 78 and BCP 79.
-
- Copies of IPR disclosures made to the IETF Secretariat and any
- assurances of licenses to be made available, or the result of an
- attempt made to obtain a general license or permission for the use of
- such proprietary rights by implementers or users of this
- specification can be obtained from the IETF on-line IPR repository at
- http://www.ietf.org/ipr.
-
- The IETF invites any interested party to bring to its attention any
- copyrights, patents or patent applications, or other proprietary
- rights that may cover technology that may be required to implement
- this standard. Please address the information to the IETF at ietf-
- ipr at ietf.org.
-
-Acknowledgement
-
- Funding for the RFC Editor function is currently provided by the
- Internet Society.
-
-
-
-
-
-
-
-Crocker & Overell Standards Track [Page 16]
-
\ No newline at end of file
diff --git a/reference/rfc822 Standard for the Format of ARPA Internet Text Messages.txt b/reference/rfc822 Standard for the Format of ARPA Internet Text Messages.txt
deleted file mode 100644
index 0948400..0000000
--- a/reference/rfc822 Standard for the Format of ARPA Internet Text Messages.txt
+++ /dev/null
@@ -1,2900 +0,0 @@
-
-
-
-
-
-
- RFC # 822
-
- Obsoletes: RFC #733 (NIC #41952)
-
-
-
-
-
-
-
-
-
-
-
-
- STANDARD FOR THE FORMAT OF
-
- ARPA INTERNET TEXT MESSAGES
-
-
-
-
-
-
- August 13, 1982
-
-
-
-
-
-
- Revised by
-
- David H. Crocker
-
-
- Dept. of Electrical Engineering
- University of Delaware, Newark, DE 19711
- Network: DCrocker @ UDel-Relay
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- TABLE OF CONTENTS
-
-
- PREFACE .................................................... ii
-
- 1. INTRODUCTION ........................................... 1
-
- 1.1. Scope ............................................ 1
- 1.2. Communication Framework .......................... 2
-
- 2. NOTATIONAL CONVENTIONS ................................. 3
-
- 3. LEXICAL ANALYSIS OF MESSAGES ........................... 5
-
- 3.1. General Description .............................. 5
- 3.2. Header Field Definitions ......................... 9
- 3.3. Lexical Tokens ................................... 10
- 3.4. Clarifications ................................... 11
-
- 4. MESSAGE SPECIFICATION .................................. 17
-
- 4.1. Syntax ........................................... 17
- 4.2. Forwarding ....................................... 19
- 4.3. Trace Fields ..................................... 20
- 4.4. Originator Fields ................................ 21
- 4.5. Receiver Fields .................................. 23
- 4.6. Reference Fields ................................. 23
- 4.7. Other Fields ..................................... 24
-
- 5. DATE AND TIME SPECIFICATION ............................ 26
-
- 5.1. Syntax ........................................... 26
- 5.2. Semantics ........................................ 26
-
- 6. ADDRESS SPECIFICATION .................................. 27
-
- 6.1. Syntax ........................................... 27
- 6.2. Semantics ........................................ 27
- 6.3. Reserved Address ................................. 33
-
- 7. BIBLIOGRAPHY ........................................... 34
-
-
- APPENDIX
-
- A. EXAMPLES ............................................... 36
- B. SIMPLE FIELD PARSING ................................... 40
- C. DIFFERENCES FROM RFC #733 .............................. 41
- D. ALPHABETICAL LISTING OF SYNTAX RULES ................... 44
-
-
- August 13, 1982 - i - RFC #822
-
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- PREFACE
-
-
- By 1977, the Arpanet employed several informal standards for
- the text messages (mail) sent among its host computers. It was
- felt necessary to codify these practices and provide for those
- features that seemed imminent. The result of that effort was
- Request for Comments (RFC) #733, "Standard for the Format of ARPA
- Network Text Message", by Crocker, Vittal, Pogran, and Henderson.
- The specification attempted to avoid major changes in existing
- software, while permitting several new features.
-
- This document revises the specifications in RFC #733, in
- order to serve the needs of the larger and more complex ARPA
- Internet. Some of RFC #733's features failed to gain adequate
- acceptance. In order to simplify the standard and the software
- that follows it, these features have been removed. A different
- addressing scheme is used, to handle the case of inter-network
- mail; and the concept of re-transmission has been introduced.
-
- This specification is intended for use in the ARPA Internet.
- However, an attempt has been made to free it of any dependence on
- that environment, so that it can be applied to other network text
- message systems.
-
- The specification of RFC #733 took place over the course of
- one year, using the ARPANET mail environment, itself, to provide
- an on-going forum for discussing the capabilities to be included.
- More than twenty individuals, from across the country, partici-
- pated in the original discussion. The development of this
- revised specification has, similarly, utilized network mail-based
- group discussion. Both specification efforts greatly benefited
- from the comments and ideas of the participants.
-
- The syntax of the standard, in RFC #733, was originally
- specified in the Backus-Naur Form (BNF) meta-language. Ken L.
- Harrenstien, of SRI International, was responsible for re-coding
- the BNF into an augmented BNF that makes the representation
- smaller and easier to understand.
-
-
-
-
-
-
-
-
-
-
-
-
- August 13, 1982 - ii - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- 1. INTRODUCTION
-
- 1.1. SCOPE
-
- This standard specifies a syntax for text messages that are
- sent among computer users, within the framework of "electronic
- mail". The standard supersedes the one specified in ARPANET
- Request for Comments #733, "Standard for the Format of ARPA Net-
- work Text Messages".
-
- In this context, messages are viewed as having an envelope
- and contents. The envelope contains whatever information is
- needed to accomplish transmission and delivery. The contents
- compose the object to be delivered to the recipient. This stan-
- dard applies only to the format and some of the semantics of mes-
- sage contents. It contains no specification of the information
- in the envelope.
-
- However, some message systems may use information from the
- contents to create the envelope. It is intended that this stan-
- dard facilitate the acquisition of such information by programs.
-
- Some message systems may store messages in formats that
- differ from the one specified in this standard. This specifica-
- tion is intended strictly as a definition of what message content
- format is to be passed BETWEEN hosts.
-
- Note: This standard is NOT intended to dictate the internal for-
- mats used by sites, the specific message system features
- that they are expected to support, or any of the charac-
- teristics of user interface programs that create or read
- messages.
-
- A distinction should be made between what the specification
- REQUIRES and what it ALLOWS. Messages can be made complex and
- rich with formally-structured components of information or can be
- kept small and simple, with a minimum of such information. Also,
- the standard simplifies the interpretation of differing visual
- formats in messages; only the visual aspect of a message is
- affected and not the interpretation of information within it.
- Implementors may choose to retain such visual distinctions.
-
- The formal definition is divided into four levels. The bot-
- tom level describes the meta-notation used in this document. The
- second level describes basic lexical analyzers that feed tokens
- to higher-level parsers. Next is an overall specification for
- messages; it permits distinguishing individual fields. Finally,
- there is definition of the contents of several structured fields.
-
-
-
- August 13, 1982 - 1 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- 1.2. COMMUNICATION FRAMEWORK
-
- Messages consist of lines of text. No special provisions
- are made for encoding drawings, facsimile, speech, or structured
- text. No significant consideration has been given to questions
- of data compression or to transmission and storage efficiency,
- and the standard tends to be free with the number of bits con-
- sumed. For example, field names are specified as free text,
- rather than special terse codes.
-
- A general "memo" framework is used. That is, a message con-
- sists of some information in a rigid format, followed by the main
- part of the message, with a format that is not specified in this
- document. The syntax of several fields of the rigidly-formated
- ("headers") section is defined in this specification; some of
- these fields must be included in all messages.
-
- The syntax that distinguishes between header fields is
- specified separately from the internal syntax for particular
- fields. This separation is intended to allow simple parsers to
- operate on the general structure of messages, without concern for
- the detailed structure of individual header fields. Appendix B
- is provided to facilitate construction of these parsers.
-
- In addition to the fields specified in this document, it is
- expected that other fields will gain common use. As necessary,
- the specifications for these "extension-fields" will be published
- through the same mechanism used to publish this document. Users
- may also wish to extend the set of fields that they use
- privately. Such "user-defined fields" are permitted.
-
- The framework severely constrains document tone and appear-
- ance and is primarily useful for most intra-organization communi-
- cations and well-structured inter-organization communication.
- It also can be used for some types of inter-process communica-
- tion, such as simple file transfer and remote job entry. A more
- robust framework might allow for multi-font, multi-color, multi-
- dimension encoding of information. A less robust one, as is
- present in most single-machine message systems, would more
- severely constrain the ability to add fields and the decision to
- include specific fields. In contrast with paper-based communica-
- tion, it is interesting to note that the RECEIVER of a message
- can exercise an extraordinary amount of control over the
- message's appearance. The amount of actual control available to
- message receivers is contingent upon the capabilities of their
- individual message systems.
-
-
-
-
-
- August 13, 1982 - 2 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- 2. NOTATIONAL CONVENTIONS
-
- This specification uses an augmented Backus-Naur Form (BNF)
- notation. The differences from standard BNF involve naming rules
- and indicating repetition and "local" alternatives.
-
- 2.1. RULE NAMING
-
- Angle brackets ("<", ">") are not used, in general. The
- name of a rule is simply the name itself, rather than "<name>".
- Quotation-marks enclose literal text (which may be upper and/or
- lower case). Certain basic rules are in uppercase, such as
- SPACE, TAB, CRLF, DIGIT, ALPHA, etc. Angle brackets are used in
- rule definitions, and in the rest of this document, whenever
- their presence will facilitate discerning the use of rule names.
-
- 2.2. RULE1 / RULE2: ALTERNATIVES
-
- Elements separated by slash ("/") are alternatives. There-
- fore "foo / bar" will accept foo or bar.
-
- 2.3. (RULE1 RULE2): LOCAL ALTERNATIVES
-
- Elements enclosed in parentheses are treated as a single
- element. Thus, "(elem (foo / bar) elem)" allows the token
- sequences "elem foo elem" and "elem bar elem".
-
- 2.4. *RULE: REPETITION
-
- The character "*" preceding an element indicates repetition.
- The full form is:
-
- <l>*<m>element
-
- indicating at least <l> and at most <m> occurrences of element.
- Default values are 0 and infinity so that "*(element)" allows any
- number, including zero; "1*element" requires at least one; and
- "1*2element" allows one or two.
-
- 2.5. [RULE]: OPTIONAL
-
- Square brackets enclose optional elements; "[foo bar]" is
- equivalent to "*1(foo bar)".
-
- 2.6. NRULE: SPECIFIC REPETITION
-
- "<n>(element)" is equivalent to "<n>*<n>(element)"; that is,
- exactly <n> occurrences of (element). Thus 2DIGIT is a 2-digit
- number, and 3ALPHA is a string of three alphabetic characters.
-
-
- August 13, 1982 - 3 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- 2.7. #RULE: LISTS
-
- A construct "#" is defined, similar to "*", as follows:
-
- <l>#<m>element
-
- indicating at least <l> and at most <m> elements, each separated
- by one or more commas (","). This makes the usual form of lists
- very easy; a rule such as '(element *("," element))' can be shown
- as "1#element". Wherever this construct is used, null elements
- are allowed, but do not contribute to the count of elements
- present. That is, "(element),,(element)" is permitted, but
- counts as only two elements. Therefore, where at least one ele-
- ment is required, at least one non-null element must be present.
- Default values are 0 and infinity so that "#(element)" allows any
- number, including zero; "1#element" requires at least one; and
- "1#2element" allows one or two.
-
- 2.8. ; COMMENTS
-
- A semi-colon, set off some distance to the right of rule
- text, starts a comment that continues to the end of line. This
- is a simple way of including useful notes in parallel with the
- specifications.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- August 13, 1982 - 4 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- 3. LEXICAL ANALYSIS OF MESSAGES
-
- 3.1. GENERAL DESCRIPTION
-
- A message consists of header fields and, optionally, a body.
- The body is simply a sequence of lines containing ASCII charac-
- ters. It is separated from the headers by a null line (i.e., a
- line with nothing preceding the CRLF).
-
- 3.1.1. LONG HEADER FIELDS
-
- Each header field can be viewed as a single, logical line of
- ASCII characters, comprising a field-name and a field-body.
- For convenience, the field-body portion of this conceptual
- entity can be split into a multiple-line representation; this
- is called "folding". The general rule is that wherever there
- may be linear-white-space (NOT simply LWSP-chars), a CRLF
- immediately followed by AT LEAST one LWSP-char may instead be
- inserted. Thus, the single line
-
- To: "Joe & J. Harvey" <ddd @Org>, JJV @ BBN
-
- can be represented as:
-
- To: "Joe & J. Harvey" <ddd @ Org>,
- JJV at BBN
-
- and
-
- To: "Joe & J. Harvey"
- <ddd@ Org>, JJV
- @BBN
-
- and
-
- To: "Joe &
- J. Harvey" <ddd @ Org>, JJV @ BBN
-
- The process of moving from this folded multiple-line
- representation of a header field to its single line represen-
- tation is called "unfolding". Unfolding is accomplished by
- regarding CRLF immediately followed by a LWSP-char as
- equivalent to the LWSP-char.
-
- Note: While the standard permits folding wherever linear-
- white-space is permitted, it is recommended that struc-
- tured fields, such as those containing addresses, limit
- folding to higher-level syntactic breaks. For address
- fields, it is recommended that such folding occur
-
-
- August 13, 1982 - 5 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- between addresses, after the separating comma.
-
- 3.1.2. STRUCTURE OF HEADER FIELDS
-
- Once a field has been unfolded, it may be viewed as being com-
- posed of a field-name followed by a colon (":"), followed by a
- field-body, and terminated by a carriage-return/line-feed.
- The field-name must be composed of printable ASCII characters
- (i.e., characters that have values between 33. and 126.,
- decimal, except colon). The field-body may be composed of any
- ASCII characters, except CR or LF. (While CR and/or LF may be
- present in the actual text, they are removed by the action of
- unfolding the field.)
-
- Certain field-bodies of headers may be interpreted according
- to an internal syntax that some systems may wish to parse.
- These fields are called "structured fields". Examples
- include fields containing dates and addresses. Other fields,
- such as "Subject" and "Comments", are regarded simply as
- strings of text.
-
- Note: Any field which has a field-body that is defined as
- other than simply <text> is to be treated as a struc-
- tured field.
-
- Field-names, unstructured field bodies and structured
- field bodies each are scanned by their own, independent
- "lexical" analyzers.
-
- 3.1.3. UNSTRUCTURED FIELD BODIES
-
- For some fields, such as "Subject" and "Comments", no struc-
- turing is assumed, and they are treated simply as <text>s, as
- in the message body. Rules of folding apply to these fields,
- so that such field bodies which occupy several lines must
- therefore have the second and successive lines indented by at
- least one LWSP-char.
-
- 3.1.4. STRUCTURED FIELD BODIES
-
- To aid in the creation and reading of structured fields, the
- free insertion of linear-white-space (which permits folding
- by inclusion of CRLFs) is allowed between lexical tokens.
- Rather than obscuring the syntax specifications for these
- structured fields with explicit syntax for this linear-white-
- space, the existence of another "lexical" analyzer is assumed.
- This analyzer does not apply for unstructured field bodies
- that are simply strings of text, as described above. The
- analyzer provides an interpretation of the unfolded text
-
-
- August 13, 1982 - 6 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- composing the body of the field as a sequence of lexical sym-
- bols.
-
- These symbols are:
-
- - individual special characters
- - quoted-strings
- - domain-literals
- - comments
- - atoms
-
- The first four of these symbols are self-delimiting. Atoms
- are not; they are delimited by the self-delimiting symbols and
- by linear-white-space. For the purposes of regenerating
- sequences of atoms and quoted-strings, exactly one SPACE is
- assumed to exist, and should be used, between them. (Also, in
- the "Clarifications" section on "White Space", below, note the
- rules about treatment of multiple contiguous LWSP-chars.)
-
- So, for example, the folded body of an address field
-
- ":sysmail"@ Some-Group. Some-Org,
- Muhammed.(I am the greatest) Ali @(the)Vegas.WBA
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- August 13, 1982 - 7 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- is analyzed into the following lexical symbols and types:
-
- :sysmail quoted string
- @ special
- Some-Group atom
- . special
- Some-Org atom
- , special
- Muhammed atom
- . special
- (I am the greatest) comment
- Ali atom
- @ atom
- (the) comment
- Vegas atom
- . special
- WBA atom
-
- The canonical representations for the data in these addresses
- are the following strings:
-
- ":sysmail"@Some-Group.Some-Org
-
- and
-
- Muhammed.Ali at Vegas.WBA
-
- Note: For purposes of display, and when passing such struc-
- tured information to other systems, such as mail proto-
- col services, there must be NO linear-white-space
- between <word>s that are separated by period (".") or
- at-sign ("@") and exactly one SPACE between all other
- <word>s. Also, headers should be in a folded form.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- August 13, 1982 - 8 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- 3.2. HEADER FIELD DEFINITIONS
-
- These rules show a field meta-syntax, without regard for the
- particular type or internal syntax. Their purpose is to permit
- detection of fields; also, they present to higher-level parsers
- an image of each field as fitting on one line.
-
- field = field-name ":" [ field-body ] CRLF
-
- field-name = 1*<any CHAR, excluding CTLs, SPACE, and ":">
-
- field-body = field-body-contents
- [CRLF LWSP-char field-body]
-
- field-body-contents =
- <the ASCII characters making up the field-body, as
- defined in the following sections, and consisting
- of combinations of atom, quoted-string, and
- specials tokens, or else consisting of texts>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- August 13, 1982 - 9 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- 3.3. LEXICAL TOKENS
-
- The following rules are used to define an underlying lexical
- analyzer, which feeds tokens to higher level parsers. See the
- ANSI references, in the Bibliography.
-
- ; ( Octal, Decimal.)
- CHAR = <any ASCII character> ; ( 0-177, 0.-127.)
- ALPHA = <any ASCII alphabetic character>
- ; (101-132, 65.- 90.)
- ; (141-172, 97.-122.)
- DIGIT = <any ASCII decimal digit> ; ( 60- 71, 48.- 57.)
- CTL = <any ASCII control ; ( 0- 37, 0.- 31.)
- character and DEL> ; ( 177, 127.)
- CR = <ASCII CR, carriage return> ; ( 15, 13.)
- LF = <ASCII LF, linefeed> ; ( 12, 10.)
- SPACE = <ASCII SP, space> ; ( 40, 32.)
- HTAB = <ASCII HT, horizontal-tab> ; ( 11, 9.)
- <"> = <ASCII quote mark> ; ( 42, 34.)
- CRLF = CR LF
-
- LWSP-char = SPACE / HTAB ; semantics = SPACE
-
- linear-white-space = 1*([CRLF] LWSP-char) ; semantics = SPACE
- ; CRLF => folding
-
- specials = "(" / ")" / "<" / ">" / "@" ; Must be in quoted-
- / "," / ";" / ":" / "\" / <"> ; string, to use
- / "." / "[" / "]" ; within a word.
-
- delimiters = specials / linear-white-space / comment
-
- text = <any CHAR, including bare ; => atoms, specials,
- CR & bare LF, but NOT ; comments and
- including CRLF> ; quoted-strings are
- ; NOT recognized.
-
- atom = 1*<any CHAR except specials, SPACE and CTLs>
-
- quoted-string = <"> *(qtext/quoted-pair) <">; Regular qtext or
- ; quoted chars.
-
- qtext = <any CHAR excepting <">, ; => may be folded
- "\" & CR, and including
- linear-white-space>
-
- domain-literal = "[" *(dtext / quoted-pair) "]"
-
-
-
-
- August 13, 1982 - 10 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- dtext = <any CHAR excluding "[", ; => may be folded
- "]", "\" & CR, & including
- linear-white-space>
-
- comment = "(" *(ctext / quoted-pair / comment) ")"
-
- ctext = <any CHAR excluding "(", ; => may be folded
- ")", "\" & CR, & including
- linear-white-space>
-
- quoted-pair = "\" CHAR ; may quote any char
-
- phrase = 1*word ; Sequence of words
-
- word = atom / quoted-string
-
-
- 3.4. CLARIFICATIONS
-
- 3.4.1. QUOTING
-
- Some characters are reserved for special interpretation, such
- as delimiting lexical tokens. To permit use of these charac-
- ters as uninterpreted data, a quoting mechanism is provided.
- To quote a character, precede it with a backslash ("\").
-
- This mechanism is not fully general. Characters may be quoted
- only within a subset of the lexical constructs. In particu-
- lar, quoting is limited to use within:
-
- - quoted-string
- - domain-literal
- - comment
-
- Within these constructs, quoting is REQUIRED for CR and "\"
- and for the character(s) that delimit the token (e.g., "(" and
- ")" for a comment). However, quoting is PERMITTED for any
- character.
-
- Note: In particular, quoting is NOT permitted within atoms.
- For example when the local-part of an addr-spec must
- contain a special character, a quoted string must be
- used. Therefore, a specification such as:
-
- Full\ Name at Domain
-
- is not legal and must be specified as:
-
- "Full Name"@Domain
-
-
- August 13, 1982 - 11 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- 3.4.2. WHITE SPACE
-
- Note: In structured field bodies, multiple linear space ASCII
- characters (namely HTABs and SPACEs) are treated as
- single spaces and may freely surround any symbol. In
- all header fields, the only place in which at least one
- LWSP-char is REQUIRED is at the beginning of continua-
- tion lines in a folded field.
-
- When passing text to processes that do not interpret text
- according to this standard (e.g., mail protocol servers), then
- NO linear-white-space characters should occur between a period
- (".") or at-sign ("@") and a <word>. Exactly ONE SPACE should
- be used in place of arbitrary linear-white-space and comment
- sequences.
-
- Note: Within systems conforming to this standard, wherever a
- member of the list of delimiters is allowed, LWSP-chars
- may also occur before and/or after it.
-
- Writers of mail-sending (i.e., header-generating) programs
- should realize that there is no network-wide definition of the
- effect of ASCII HT (horizontal-tab) characters on the appear-
- ance of text at another network host; therefore, the use of
- tabs in message headers, though permitted, is discouraged.
-
- 3.4.3. COMMENTS
-
- A comment is a set of ASCII characters, which is enclosed in
- matching parentheses and which is not within a quoted-string
- The comment construct permits message originators to add text
- which will be useful for human readers, but which will be
- ignored by the formal semantics. Comments should be retained
- while the message is subject to interpretation according to
- this standard. However, comments must NOT be included in
- other cases, such as during protocol exchanges with mail
- servers.
-
- Comments nest, so that if an unquoted left parenthesis occurs
- in a comment string, there must also be a matching right
- parenthesis. When a comment acts as the delimiter between a
- sequence of two lexical symbols, such as two atoms, it is lex-
- ically equivalent with a single SPACE, for the purposes of
- regenerating the sequence, such as when passing the sequence
- onto a mail protocol server. Comments are detected as such
- only within field-bodies of structured fields.
-
- If a comment is to be "folded" onto multiple lines, then the
- syntax for folding must be adhered to. (See the "Lexical
-
-
- August 13, 1982 - 12 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- Analysis of Messages" section on "Folding Long Header Fields"
- above, and the section on "Case Independence" below.) Note
- that the official semantics therefore do not "see" any
- unquoted CRLFs that are in comments, although particular pars-
- ing programs may wish to note their presence. For these pro-
- grams, it would be reasonable to interpret a "CRLF LWSP-char"
- as being a CRLF that is part of the comment; i.e., the CRLF is
- kept and the LWSP-char is discarded. Quoted CRLFs (i.e., a
- backslash followed by a CR followed by a LF) still must be
- followed by at least one LWSP-char.
-
- 3.4.4. DELIMITING AND QUOTING CHARACTERS
-
- The quote character (backslash) and characters that delimit
- syntactic units are not, generally, to be taken as data that
- are part of the delimited or quoted unit(s). In particular,
- the quotation-marks that define a quoted-string, the
- parentheses that define a comment and the backslash that
- quotes a following character are NOT part of the quoted-
- string, comment or quoted character. A quotation-mark that is
- to be part of a quoted-string, a parenthesis that is to be
- part of a comment and a backslash that is to be part of either
- must each be preceded by the quote-character backslash ("\").
- Note that the syntax allows any character to be quoted within
- a quoted-string or comment; however only certain characters
- MUST be quoted to be included as data. These characters are
- the ones that are not part of the alternate text group (i.e.,
- ctext or qtext).
-
- The one exception to this rule is that a single SPACE is
- assumed to exist between contiguous words in a phrase, and
- this interpretation is independent of the actual number of
- LWSP-chars that the creator places between the words. To
- include more than one SPACE, the creator must make the LWSP-
- chars be part of a quoted-string.
-
- Quotation marks that delimit a quoted string and backslashes
- that quote the following character should NOT accompany the
- quoted-string when the string is passed to processes that do
- not interpret data according to this specification (e.g., mail
- protocol servers).
-
- 3.4.5. QUOTED-STRINGS
-
- Where permitted (i.e., in words in structured fields) quoted-
- strings are treated as a single symbol. That is, a quoted-
- string is equivalent to an atom, syntactically. If a quoted-
- string is to be "folded" onto multiple lines, then the syntax
- for folding must be adhered to. (See the "Lexical Analysis of
-
-
- August 13, 1982 - 13 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- Messages" section on "Folding Long Header Fields" above, and
- the section on "Case Independence" below.) Therefore, the
- official semantics do not "see" any bare CRLFs that are in
- quoted-strings; however particular parsing programs may wish
- to note their presence. For such programs, it would be rea-
- sonable to interpret a "CRLF LWSP-char" as being a CRLF which
- is part of the quoted-string; i.e., the CRLF is kept and the
- LWSP-char is discarded. Quoted CRLFs (i.e., a backslash fol-
- lowed by a CR followed by a LF) are also subject to rules of
- folding, but the presence of the quoting character (backslash)
- explicitly indicates that the CRLF is data to the quoted
- string. Stripping off the first following LWSP-char is also
- appropriate when parsing quoted CRLFs.
-
- 3.4.6. BRACKETING CHARACTERS
-
- There is one type of bracket which must occur in matched pairs
- and may have pairs nested within each other:
-
- o Parentheses ("(" and ")") are used to indicate com-
- ments.
-
- There are three types of brackets which must occur in matched
- pairs, and which may NOT be nested:
-
- o Colon/semi-colon (":" and ";") are used in address
- specifications to indicate that the included list of
- addresses are to be treated as a group.
-
- o Angle brackets ("<" and ">") are generally used to
- indicate the presence of a one machine-usable refer-
- ence (e.g., delimiting mailboxes), possibly including
- source-routing to the machine.
-
- o Square brackets ("[" and "]") are used to indicate the
- presence of a domain-literal, which the appropriate
- name-domain is to use directly, bypassing normal
- name-resolution mechanisms.
-
- 3.4.7. CASE INDEPENDENCE
-
- Except as noted, alphabetic strings may be represented in any
- combination of upper and lower case. The only syntactic units
-
-
-
-
-
-
-
-
- August 13, 1982 - 14 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- which requires preservation of case information are:
-
- - text
- - qtext
- - dtext
- - ctext
- - quoted-pair
- - local-part, except "Postmaster"
-
- When matching any other syntactic unit, case is to be ignored.
- For example, the field-names "From", "FROM", "from", and even
- "FroM" are semantically equal and should all be treated ident-
- ically.
-
- When generating these units, any mix of upper and lower case
- alphabetic characters may be used. The case shown in this
- specification is suggested for message-creating processes.
-
- Note: The reserved local-part address unit, "Postmaster", is
- an exception. When the value "Postmaster" is being
- interpreted, it must be accepted in any mixture of
- case, including "POSTMASTER", and "postmaster".
-
- 3.4.8. FOLDING LONG HEADER FIELDS
-
- Each header field may be represented on exactly one line con-
- sisting of the name of the field and its body, and terminated
- by a CRLF; this is what the parser sees. For readability, the
- field-body portion of long header fields may be "folded" onto
- multiple lines of the actual field. "Long" is commonly inter-
- preted to mean greater than 65 or 72 characters. The former
- length serves as a limit, when the message is to be viewed on
- most simple terminals which use simple display software; how-
- ever, the limit is not imposed by this standard.
-
- Note: Some display software often can selectively fold lines,
- to suit the display terminal. In such cases, sender-
- provided folding can interfere with the display
- software.
-
- 3.4.9. BACKSPACE CHARACTERS
-
- ASCII BS characters (Backspace, decimal 8) may be included in
- texts and quoted-strings to effect overstriking. However, any
- use of backspaces which effects an overstrike to the left of
- the beginning of the text or quoted-string is prohibited.
-
-
-
-
-
- August 13, 1982 - 15 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- 3.4.10. NETWORK-SPECIFIC TRANSFORMATIONS
-
- During transmission through heterogeneous networks, it may be
- necessary to force data to conform to a network's local con-
- ventions. For example, it may be required that a CR be fol-
- lowed either by LF, making a CRLF, or by <null>, if the CR is
- to stand alone). Such transformations are reversed, when the
- message exits that network.
-
- When crossing network boundaries, the message should be
- treated as passing through two modules. It will enter the
- first module containing whatever network-specific transforma-
- tions that were necessary to permit migration through the
- "current" network. It then passes through the modules:
-
- o Transformation Reversal
-
- The "current" network's idiosyncracies are removed and
- the message is returned to the canonical form speci-
- fied in this standard.
-
- o Transformation
-
- The "next" network's local idiosyncracies are imposed
- on the message.
-
- ------------------
- From ==> | Remove Net-A |
- Net-A | idiosyncracies |
- ------------------
- ||
- \/
- Conformance
- with standard
- ||
- \/
- ------------------
- | Impose Net-B | ==> To
- | idiosyncracies | Net-B
- ------------------
-
-
-
-
-
-
-
-
-
-
-
- August 13, 1982 - 16 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- 4. MESSAGE SPECIFICATION
-
- 4.1. SYNTAX
-
- Note: Due to an artifact of the notational conventions, the syn-
- tax indicates that, when present, some fields, must be in
- a particular order. Header fields are NOT required to
- occur in any particular order, except that the message
- body must occur AFTER the headers. It is recommended
- that, if present, headers be sent in the order "Return-
- Path", "Received", "Date", "From", "Subject", "Sender",
- "To", "cc", etc.
-
- This specification permits multiple occurrences of most
- fields. Except as noted, their interpretation is not
- specified here, and their use is discouraged.
-
- The following syntax for the bodies of various fields should
- be thought of as describing each field body as a single long
- string (or line). The "Lexical Analysis of Message" section on
- "Long Header Fields", above, indicates how such long strings can
- be represented on more than one line in the actual transmitted
- message.
-
- message = fields *( CRLF *text ) ; Everything after
- ; first null line
- ; is message body
-
- fields = dates ; Creation time,
- source ; author id & one
- 1*destination ; address required
- *optional-field ; others optional
-
- source = [ trace ] ; net traversals
- originator ; original mail
- [ resent ] ; forwarded
-
- trace = return ; path to sender
- 1*received ; receipt tags
-
- return = "Return-path" ":" route-addr ; return address
-
- received = "Received" ":" ; one per relay
- ["from" domain] ; sending host
- ["by" domain] ; receiving host
- ["via" atom] ; physical path
- *("with" atom) ; link/mail protocol
- ["id" msg-id] ; receiver msg id
- ["for" addr-spec] ; initial form
-
-
- August 13, 1982 - 17 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- ";" date-time ; time received
-
- originator = authentic ; authenticated addr
- [ "Reply-To" ":" 1#address] )
-
- authentic = "From" ":" mailbox ; Single author
- / ( "Sender" ":" mailbox ; Actual submittor
- "From" ":" 1#mailbox) ; Multiple authors
- ; or not sender
-
- resent = resent-authentic
- [ "Resent-Reply-To" ":" 1#address] )
-
- resent-authentic =
- = "Resent-From" ":" mailbox
- / ( "Resent-Sender" ":" mailbox
- "Resent-From" ":" 1#mailbox )
-
- dates = orig-date ; Original
- [ resent-date ] ; Forwarded
-
- orig-date = "Date" ":" date-time
-
- resent-date = "Resent-Date" ":" date-time
-
- destination = "To" ":" 1#address ; Primary
- / "Resent-To" ":" 1#address
- / "cc" ":" 1#address ; Secondary
- / "Resent-cc" ":" 1#address
- / "bcc" ":" #address ; Blind carbon
- / "Resent-bcc" ":" #address
-
- optional-field =
- / "Message-ID" ":" msg-id
- / "Resent-Message-ID" ":" msg-id
- / "In-Reply-To" ":" *(phrase / msg-id)
- / "References" ":" *(phrase / msg-id)
- / "Keywords" ":" #phrase
- / "Subject" ":" *text
- / "Comments" ":" *text
- / "Encrypted" ":" 1#2word
- / extension-field ; To be defined
- / user-defined-field ; May be pre-empted
-
- msg-id = "<" addr-spec ">" ; Unique message id
-
-
-
-
-
-
- August 13, 1982 - 18 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- extension-field =
- <Any field which is defined in a document
- published as a formal extension to this
- specification; none will have names beginning
- with the string "X-">
-
- user-defined-field =
- <Any field which has not been defined
- in this specification or published as an
- extension to this specification; names for
- such fields must be unique and may be
- pre-empted by published extensions>
-
- 4.2. FORWARDING
-
- Some systems permit mail recipients to forward a message,
- retaining the original headers, by adding some new fields. This
- standard supports such a service, through the "Resent-" prefix to
- field names.
-
- Whenever the string "Resent-" begins a field name, the field
- has the same semantics as a field whose name does not have the
- prefix. However, the message is assumed to have been forwarded
- by an original recipient who attached the "Resent-" field. This
- new field is treated as being more recent than the equivalent,
- original field. For example, the "Resent-From", indicates the
- person that forwarded the message, whereas the "From" field indi-
- cates the original author.
-
- Use of such precedence information depends upon partici-
- pants' communication needs. For example, this standard does not
- dictate when a "Resent-From:" address should receive replies, in
- lieu of sending them to the "From:" address.
-
- Note: In general, the "Resent-" fields should be treated as con-
- taining a set of information that is independent of the
- set of original fields. Information for one set should
- not automatically be taken from the other. The interpre-
- tation of multiple "Resent-" fields, of the same type, is
- undefined.
-
- In the remainder of this specification, occurrence of legal
- "Resent-" fields are treated identically with the occurrence of
-
-
-
-
-
-
-
-
- August 13, 1982 - 19 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- fields whose names do not contain this prefix.
-
- 4.3. TRACE FIELDS
-
- Trace information is used to provide an audit trail of mes-
- sage handling. In addition, it indicates a route back to the
- sender of the message.
-
- The list of known "via" and "with" values are registered
- with the Network Information Center, SRI International, Menlo
- Park, California.
-
- 4.3.1. RETURN-PATH
-
- This field is added by the final transport system that
- delivers the message to its recipient. The field is intended
- to contain definitive information about the address and route
- back to the message's originator.
-
- Note: The "Reply-To" field is added by the originator and
- serves to direct replies, whereas the "Return-Path"
- field is used to identify a path back to the origina-
- tor.
-
- While the syntax indicates that a route specification is
- optional, every attempt should be made to provide that infor-
- mation in this field.
-
- 4.3.2. RECEIVED
-
- A copy of this field is added by each transport service that
- relays the message. The information in the field can be quite
- useful for tracing transport problems.
-
- The names of the sending and receiving hosts and time-of-
- receipt may be specified. The "via" parameter may be used, to
- indicate what physical mechanism the message was sent over,
- such as Arpanet or Phonenet, and the "with" parameter may be
- used to indicate the mail-, or connection-, level protocol
- that was used, such as the SMTP mail protocol, or X.25 tran-
- sport protocol.
-
- Note: Several "with" parameters may be included, to fully
- specify the set of protocols that were used.
-
- Some transport services queue mail; the internal message iden-
- tifier that is assigned to the message may be noted, using the
- "id" parameter. When the sending host uses a destination
- address specification that the receiving host reinterprets, by
-
-
- August 13, 1982 - 20 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- expansion or transformation, the receiving host may wish to
- record the original specification, using the "for" parameter.
- For example, when a copy of mail is sent to the member of a
- distribution list, this parameter may be used to record the
- original address that was used to specify the list.
-
- 4.4. ORIGINATOR FIELDS
-
- The standard allows only a subset of the combinations possi-
- ble with the From, Sender, Reply-To, Resent-From, Resent-Sender,
- and Resent-Reply-To fields. The limitation is intentional.
-
- 4.4.1. FROM / RESENT-FROM
-
- This field contains the identity of the person(s) who wished
- this message to be sent. The message-creation process should
- default this field to be a single, authenticated machine
- address, indicating the AGENT (person, system or process)
- entering the message. If this is not done, the "Sender" field
- MUST be present. If the "From" field IS defaulted this way,
- the "Sender" field is optional and is redundant with the
- "From" field. In all cases, addresses in the "From" field
- must be machine-usable (addr-specs) and may not contain named
- lists (groups).
-
- 4.4.2. SENDER / RESENT-SENDER
-
- This field contains the authenticated identity of the AGENT
- (person, system or process) that sends the message. It is
- intended for use when the sender is not the author of the mes-
- sage, or to indicate who among a group of authors actually
- sent the message. If the contents of the "Sender" field would
- be completely redundant with the "From" field, then the
- "Sender" field need not be present and its use is discouraged
- (though still legal). In particular, the "Sender" field MUST
- be present if it is NOT the same as the "From" Field.
-
- The Sender mailbox specification includes a word sequence
- which must correspond to a specific agent (i.e., a human user
- or a computer program) rather than a standard address. This
- indicates the expectation that the field will identify the
- single AGENT (person, system, or process) responsible for
- sending the mail and not simply include the name of a mailbox
- from which the mail was sent. For example in the case of a
- shared login name, the name, by itself, would not be adequate.
- The local-part address unit, which refers to this agent, is
- expected to be a computer system term, and not (for example) a
- generalized person reference which can be used outside the
- network text message context.
-
-
- August 13, 1982 - 21 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- Since the critical function served by the "Sender" field is
- identification of the agent responsible for sending mail and
- since computer programs cannot be held accountable for their
- behavior, it is strongly recommended that when a computer pro-
- gram generates a message, the HUMAN who is responsible for
- that program be referenced as part of the "Sender" field mail-
- box specification.
-
- 4.4.3. REPLY-TO / RESENT-REPLY-TO
-
- This field provides a general mechanism for indicating any
- mailbox(es) to which responses are to be sent. Three typical
- uses for this feature can be distinguished. In the first
- case, the author(s) may not have regular machine-based mail-
- boxes and therefore wish(es) to indicate an alternate machine
- address. In the second case, an author may wish additional
- persons to be made aware of, or responsible for, replies. A
- somewhat different use may be of some help to "text message
- teleconferencing" groups equipped with automatic distribution
- services: include the address of that service in the "Reply-
- To" field of all messages submitted to the teleconference;
- then participants can "reply" to conference submissions to
- guarantee the correct distribution of any submission of their
- own.
-
- Note: The "Return-Path" field is added by the mail transport
- service, at the time of final deliver. It is intended
- to identify a path back to the orginator of the mes-
- sage. The "Reply-To" field is added by the message
- originator and is intended to direct replies.
-
- 4.4.4. AUTOMATIC USE OF FROM / SENDER / REPLY-TO
-
- For systems which automatically generate address lists for
- replies to messages, the following recommendations are made:
-
- o The "Sender" field mailbox should be sent notices of
- any problems in transport or delivery of the original
- messages. If there is no "Sender" field, then the
- "From" field mailbox should be used.
-
- o The "Sender" field mailbox should NEVER be used
- automatically, in a recipient's reply message.
-
- o If the "Reply-To" field exists, then the reply should
- go to the addresses indicated in that field and not to
- the address(es) indicated in the "From" field.
-
-
-
-
- August 13, 1982 - 22 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- o If there is a "From" field, but no "Reply-To" field,
- the reply should be sent to the address(es) indicated
- in the "From" field.
-
- Sometimes, a recipient may actually wish to communicate with
- the person that initiated the message transfer. In such
- cases, it is reasonable to use the "Sender" address.
-
- This recommendation is intended only for automated use of
- originator-fields and is not intended to suggest that replies
- may not also be sent to other recipients of messages. It is
- up to the respective mail-handling programs to decide what
- additional facilities will be provided.
-
- Examples are provided in Appendix A.
-
- 4.5. RECEIVER FIELDS
-
- 4.5.1. TO / RESENT-TO
-
- This field contains the identity of the primary recipients of
- the message.
-
- 4.5.2. CC / RESENT-CC
-
- This field contains the identity of the secondary (informa-
- tional) recipients of the message.
-
- 4.5.3. BCC / RESENT-BCC
-
- This field contains the identity of additional recipients of
- the message. The contents of this field are not included in
- copies of the message sent to the primary and secondary reci-
- pients. Some systems may choose to include the text of the
- "Bcc" field only in the author(s)'s copy, while others may
- also include it in the text sent to all those indicated in the
- "Bcc" list.
-
- 4.6. REFERENCE FIELDS
-
- 4.6.1. MESSAGE-ID / RESENT-MESSAGE-ID
-
- This field contains a unique identifier (the local-part
- address unit) which refers to THIS version of THIS message.
- The uniqueness of the message identifier is guaranteed by the
- host which generates it. This identifier is intended to be
- machine readable and not necessarily meaningful to humans. A
- message identifier pertains to exactly one instantiation of a
- particular message; subsequent revisions to the message should
-
-
- August 13, 1982 - 23 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- each receive new message identifiers.
-
- 4.6.2. IN-REPLY-TO
-
- The contents of this field identify previous correspon-
- dence which this message answers. Note that if message iden-
- tifiers are used in this field, they must use the msg-id
- specification format.
-
- 4.6.3. REFERENCES
-
- The contents of this field identify other correspondence
- which this message references. Note that if message identif-
- iers are used, they must use the msg-id specification format.
-
- 4.6.4. KEYWORDS
-
- This field contains keywords or phrases, separated by
- commas.
-
- 4.7. OTHER FIELDS
-
- 4.7.1. SUBJECT
-
- This is intended to provide a summary, or indicate the
- nature, of the message.
-
- 4.7.2. COMMENTS
-
- Permits adding text comments onto the message without
- disturbing the contents of the message's body.
-
- 4.7.3. ENCRYPTED
-
- Sometimes, data encryption is used to increase the
- privacy of message contents. If the body of a message has
- been encrypted, to keep its contents private, the "Encrypted"
- field can be used to note the fact and to indicate the nature
- of the encryption. The first <word> parameter indicates the
- software used to encrypt the body, and the second, optional
- <word> is intended to aid the recipient in selecting the
- proper decryption key. This code word may be viewed as an
- index to a table of keys held by the recipient.
-
- Note: Unfortunately, headers must contain envelope, as well
- as contents, information. Consequently, it is neces-
- sary that they remain unencrypted, so that mail tran-
- sport services may access them. Since names,
- addresses, and "Subject" field contents may contain
-
-
- August 13, 1982 - 24 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- sensitive information, this requirement limits total
- message privacy.
-
- Names of encryption software are registered with the Net-
- work Information Center, SRI International, Menlo Park, Cali-
- fornia.
-
- 4.7.4. EXTENSION-FIELD
-
- A limited number of common fields have been defined in
- this document. As network mail requirements dictate, addi-
- tional fields may be standardized. To provide user-defined
- fields with a measure of safety, in name selection, such
- extension-fields will never have names that begin with the
- string "X-".
-
- Names of Extension-fields are registered with the Network
- Information Center, SRI International, Menlo Park, California.
-
- 4.7.5. USER-DEFINED-FIELD
-
- Individual users of network mail are free to define and
- use additional header fields. Such fields must have names
- which are not already used in the current specification or in
- any definitions of extension-fields, and the overall syntax of
- these user-defined-fields must conform to this specification's
- rules for delimiting and folding fields. Due to the
- extension-field publishing process, the name of a user-
- defined-field may be pre-empted
-
- Note: The prefatory string "X-" will never be used in the
- names of Extension-fields. This provides user-defined
- fields with a protected set of names.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- August 13, 1982 - 25 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- 5. DATE AND TIME SPECIFICATION
-
- 5.1. SYNTAX
-
- date-time = [ day "," ] date time ; dd mm yy
- ; hh:mm:ss zzz
-
- day = "Mon" / "Tue" / "Wed" / "Thu"
- / "Fri" / "Sat" / "Sun"
-
- date = 1*2DIGIT month 2DIGIT ; day month year
- ; e.g. 20 Jun 82
-
- month = "Jan" / "Feb" / "Mar" / "Apr"
- / "May" / "Jun" / "Jul" / "Aug"
- / "Sep" / "Oct" / "Nov" / "Dec"
-
- time = hour zone ; ANSI and Military
-
- hour = 2DIGIT ":" 2DIGIT [":" 2DIGIT]
- ; 00:00:00 - 23:59:59
-
- zone = "UT" / "GMT" ; Universal Time
- ; North American : UT
- / "EST" / "EDT" ; Eastern: - 5/ - 4
- / "CST" / "CDT" ; Central: - 6/ - 5
- / "MST" / "MDT" ; Mountain: - 7/ - 6
- / "PST" / "PDT" ; Pacific: - 8/ - 7
- / 1ALPHA ; Military: Z = UT;
- ; A:-1; (J not used)
- ; M:-12; N:+1; Y:+12
- / ( ("+" / "-") 4DIGIT ) ; Local differential
- ; hours+min. (HHMM)
-
- 5.2. SEMANTICS
-
- If included, day-of-week must be the day implied by the date
- specification.
-
- Time zone may be indicated in several ways. "UT" is Univer-
- sal Time (formerly called "Greenwich Mean Time"); "GMT" is per-
- mitted as a reference to Universal Time. The military standard
- uses a single character for each zone. "Z" is Universal Time.
- "A" indicates one hour earlier, and "M" indicates 12 hours ear-
- lier; "N" is one hour later, and "Y" is 12 hours later. The
- letter "J" is not used. The other remaining two forms are taken
- from ANSI standard X3.51-1975. One allows explicit indication of
- the amount of offset from UT; the other uses common 3-character
- strings for indicating time zones in North America.
-
-
- August 13, 1982 - 26 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- 6. ADDRESS SPECIFICATION
-
- 6.1. SYNTAX
-
- address = mailbox ; one addressee
- / group ; named list
-
- group = phrase ":" [#mailbox] ";"
-
- mailbox = addr-spec ; simple address
- / phrase route-addr ; name & addr-spec
-
- route-addr = "<" [route] addr-spec ">"
-
- route = 1#("@" domain) ":" ; path-relative
-
- addr-spec = local-part "@" domain ; global address
-
- local-part = word *("." word) ; uninterpreted
- ; case-preserved
-
- domain = sub-domain *("." sub-domain)
-
- sub-domain = domain-ref / domain-literal
-
- domain-ref = atom ; symbolic reference
-
- 6.2. SEMANTICS
-
- A mailbox receives mail. It is a conceptual entity which
- does not necessarily pertain to file storage. For example, some
- sites may choose to print mail on their line printer and deliver
- the output to the addressee's desk.
-
- A mailbox specification comprises a person, system or pro-
- cess name reference, a domain-dependent string, and a name-domain
- reference. The name reference is optional and is usually used to
- indicate the human name of a recipient. The name-domain refer-
- ence specifies a sequence of sub-domains. The domain-dependent
- string is uninterpreted, except by the final sub-domain; the rest
- of the mail service merely transmits it as a literal string.
-
- 6.2.1. DOMAINS
-
- A name-domain is a set of registered (mail) names. A name-
- domain specification resolves to a subordinate name-domain
- specification or to a terminal domain-dependent string.
- Hence, domain specification is extensible, permitting any
- number of registration levels.
-
-
- August 13, 1982 - 27 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- Name-domains model a global, logical, hierarchical addressing
- scheme. The model is logical, in that an address specifica-
- tion is related to name registration and is not necessarily
- tied to transmission path. The model's hierarchy is a
- directed graph, called an in-tree, such that there is a single
- path from the root of the tree to any node in the hierarchy.
- If more than one path actually exists, they are considered to
- be different addresses.
-
- The root node is common to all addresses; consequently, it is
- not referenced. Its children constitute "top-level" name-
- domains. Usually, a service has access to its own full domain
- specification and to the names of all top-level name-domains.
-
- The "top" of the domain addressing hierarchy -- a child of the
- root -- is indicated by the right-most field, in a domain
- specification. Its child is specified to the left, its child
- to the left, and so on.
-
- Some groups provide formal registration services; these con-
- stitute name-domains that are independent logically of
- specific machines. In addition, networks and machines impli-
- citly compose name-domains, since their membership usually is
- registered in name tables.
-
- In the case of formal registration, an organization implements
- a (distributed) data base which provides an address-to-route
- mapping service for addresses of the form:
-
- person at registry.organization
-
- Note that "organization" is a logical entity, separate from
- any particular communication network.
-
- A mechanism for accessing "organization" is universally avail-
- able. That mechanism, in turn, seeks an instantiation of the
- registry; its location is not indicated in the address specif-
- ication. It is assumed that the system which operates under
- the name "organization" knows how to find a subordinate regis-
- try. The registry will then use the "person" string to deter-
- mine where to send the mail specification.
-
- The latter, network-oriented case permits simple, direct,
- attachment-related address specification, such as:
-
- user at host.network
-
- Once the network is accessed, it is expected that a message
- will go directly to the host and that the host will resolve
-
-
- August 13, 1982 - 28 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- the user name, placing the message in the user's mailbox.
-
- 6.2.2. ABBREVIATED DOMAIN SPECIFICATION
-
- Since any number of levels is possible within the domain
- hierarchy, specification of a fully qualified address can
- become inconvenient. This standard permits abbreviated domain
- specification, in a special case:
-
- For the address of the sender, call the left-most
- sub-domain Level N. In a header address, if all of
- the sub-domains above (i.e., to the right of) Level N
- are the same as those of the sender, then they do not
- have to appear in the specification. Otherwise, the
- address must be fully qualified.
-
- This feature is subject to approval by local sub-
- domains. Individual sub-domains may require their
- member systems, which originate mail, to provide full
- domain specification only. When permitted, abbrevia-
- tions may be present only while the message stays
- within the sub-domain of the sender.
-
- Use of this mechanism requires the sender's sub-domain
- to reserve the names of all top-level domains, so that
- full specifications can be distinguished from abbrevi-
- ated specifications.
-
- For example, if a sender's address is:
-
- sender at registry-A.registry-1.organization-X
-
- and one recipient's address is:
-
- recipient at registry-B.registry-1.organization-X
-
- and another's is:
-
- recipient at registry-C.registry-2.organization-X
-
- then ".registry-1.organization-X" need not be specified in the
- the message, but "registry-C.registry-2" DOES have to be
- specified. That is, the first two addresses may be abbrevi-
- ated, but the third address must be fully specified.
-
- When a message crosses a domain boundary, all addresses must
- be specified in the full format, ending with the top-level
- name-domain in the right-most field. It is the responsibility
- of mail forwarding services to ensure that addresses conform
-
-
- August 13, 1982 - 29 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- with this requirement. In the case of abbreviated addresses,
- the relaying service must make the necessary expansions. It
- should be noted that it often is difficult for such a service
- to locate all occurrences of address abbreviations. For exam-
- ple, it will not be possible to find such abbreviations within
- the body of the message. The "Return-Path" field can aid
- recipients in recovering from these errors.
-
- Note: When passing any portion of an addr-spec onto a process
- which does not interpret data according to this stan-
- dard (e.g., mail protocol servers). There must be NO
- LWSP-chars preceding or following the at-sign or any
- delimiting period ("."), such as shown in the above
- examples, and only ONE SPACE between contiguous
- <word>s.
-
- 6.2.3. DOMAIN TERMS
-
- A domain-ref must be THE official name of a registry, network,
- or host. It is a symbolic reference, within a name sub-
- domain. At times, it is necessary to bypass standard mechan-
- isms for resolving such references, using more primitive
- information, such as a network host address rather than its
- associated host name.
-
- To permit such references, this standard provides the domain-
- literal construct. Its contents must conform with the needs
- of the sub-domain in which it is interpreted.
-
- Domain-literals which refer to domains within the ARPA Inter-
- net specify 32-bit Internet addresses, in four 8-bit fields
- noted in decimal, as described in Request for Comments #820,
- "Assigned Numbers." For example:
-
- [10.0.3.19]
-
- Note: THE USE OF DOMAIN-LITERALS IS STRONGLY DISCOURAGED. It
- is permitted only as a means of bypassing temporary
- system limitations, such as name tables which are not
- complete.
-
- The names of "top-level" domains, and the names of domains
- under in the ARPA Internet, are registered with the Network
- Information Center, SRI International, Menlo Park, California.
-
- 6.2.4. DOMAIN-DEPENDENT LOCAL STRING
-
- The local-part of an addr-spec in a mailbox specification
- (i.e., the host's name for the mailbox) is understood to be
-
-
- August 13, 1982 - 30 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- whatever the receiving mail protocol server allows. For exam-
- ple, some systems do not understand mailbox references of the
- form "P. D. Q. Bach", but others do.
-
- This specification treats periods (".") as lexical separators.
- Hence, their presence in local-parts which are not quoted-
- strings, is detected. However, such occurrences carry NO
- semantics. That is, if a local-part has periods within it, an
- address parser will divide the local-part into several tokens,
- but the sequence of tokens will be treated as one uninter-
- preted unit. The sequence will be re-assembled, when the
- address is passed outside of the system such as to a mail pro-
- tocol service.
-
- For example, the address:
-
- First.Last at Registry.Org
-
- is legal and does not require the local-part to be surrounded
- with quotation-marks. (However, "First Last" DOES require
- quoting.) The local-part of the address, when passed outside
- of the mail system, within the Registry.Org domain, is
- "First.Last", again without quotation marks.
-
- 6.2.5. BALANCING LOCAL-PART AND DOMAIN
-
- In some cases, the boundary between local-part and domain can
- be flexible. The local-part may be a simple string, which is
- used for the final determination of the recipient's mailbox.
- All other levels of reference are, therefore, part of the
- domain.
-
- For some systems, in the case of abbreviated reference to the
- local and subordinate sub-domains, it may be possible to
- specify only one reference within the domain part and place
- the other, subordinate name-domain references within the
- local-part. This would appear as:
-
- mailbox.sub1.sub2 at this-domain
-
- Such a specification would be acceptable to address parsers
- which conform to RFC #733, but do not support this newer
- Internet standard. While contrary to the intent of this stan-
- dard, the form is legal.
-
- Also, some sub-domains have a specification syntax which does
- not conform to this standard. For example:
-
- sub-net.mailbox at sub-domain.domain
-
-
- August 13, 1982 - 31 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- uses a different parsing sequence for local-part than for
- domain.
-
- Note: As a rule, the domain specification should contain
- fields which are encoded according to the syntax of
- this standard and which contain generally-standardized
- information. The local-part specification should con-
- tain only that portion of the address which deviates
- from the form or intention of the domain field.
-
- 6.2.6. MULTIPLE MAILBOXES
-
- An individual may have several mailboxes and wish to receive
- mail at whatever mailbox is convenient for the sender to
- access. This standard does not provide a means of specifying
- "any member of" a list of mailboxes.
-
- A set of individuals may wish to receive mail as a single unit
- (i.e., a distribution list). The <group> construct permits
- specification of such a list. Recipient mailboxes are speci-
- fied within the bracketed part (":" - ";"). A copy of the
- transmitted message is to be sent to each mailbox listed.
- This standard does not permit recursive specification of
- groups within groups.
-
- While a list must be named, it is not required that the con-
- tents of the list be included. In this case, the <address>
- serves only as an indication of group distribution and would
- appear in the form:
-
- name:;
-
- Some mail services may provide a group-list distribution
- facility, accepting a single mailbox reference, expanding it
- to the full distribution list, and relaying the mail to the
- list's members. This standard provides no additional syntax
- for indicating such a service. Using the <group> address
- alternative, while listing one mailbox in it, can mean either
- that the mailbox reference will be expanded to a list or that
- there is a group with one member.
-
- 6.2.7. EXPLICIT PATH SPECIFICATION
-
- At times, a message originator may wish to indicate the
- transmission path that a message should follow. This is
- called source routing. The normal addressing scheme, used in
- an addr-spec, is carefully separated from such information;
- the <route> portion of a route-addr is provided for such occa-
- sions. It specifies the sequence of hosts and/or transmission
-
-
- August 13, 1982 - 32 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- services that are to be traversed. Both domain-refs and
- domain-literals may be used.
-
- Note: The use of source routing is discouraged. Unless the
- sender has special need of path restriction, the choice
- of transmission route should be left to the mail tran-
- sport service.
-
- 6.3. RESERVED ADDRESS
-
- It often is necessary to send mail to a site, without know-
- ing any of its valid addresses. For example, there may be mail
- system dysfunctions, or a user may wish to find out a person's
- correct address, at that site.
-
- This standard specifies a single, reserved mailbox address
- (local-part) which is to be valid at each site. Mail sent to
- that address is to be routed to a person responsible for the
- site's mail system or to a person with responsibility for general
- site operation. The name of the reserved local-part address is:
-
- Postmaster
-
- so that "Postmaster at domain" is required to be valid.
-
- Note: This reserved local-part must be matched without sensi-
- tivity to alphabetic case, so that "POSTMASTER", "postmas-
- ter", and even "poStmASteR" is to be accepted.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- August 13, 1982 - 33 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- 7. BIBLIOGRAPHY
-
-
- ANSI. "USA Standard Code for Information Interchange," X3.4.
- American National Standards Institute: New York (1968). Also
- in: Feinler, E. and J. Postel, eds., "ARPANET Protocol Hand-
- book", NIC 7104.
-
- ANSI. "Representations of Universal Time, Local Time Differen-
- tials, and United States Time Zone References for Information
- Interchange," X3.51-1975. American National Standards Insti-
- tute: New York (1975).
-
- Bemer, R.W., "Time and the Computer." In: Interface Age (Feb.
- 1979).
-
- Bennett, C.J. "JNT Mail Protocol". Joint Network Team, Ruther-
- ford and Appleton Laboratory: Didcot, England.
-
- Bhushan, A.K., Pogran, K.T., Tomlinson, R.S., and White, J.E.
- "Standardizing Network Mail Headers," ARPANET Request for
- Comments No. 561, Network Information Center No. 18516; SRI
- International: Menlo Park (September 1973).
-
- Birrell, A.D., Levin, R., Needham, R.M., and Schroeder, M.D.
- "Grapevine: An Exercise in Distributed Computing," Communica-
- tions of the ACM 25, 4 (April 1982), 260-274.
-
- Crocker, D.H., Vittal, J.J., Pogran, K.T., Henderson, D.A.
- "Standard for the Format of ARPA Network Text Message,"
- ARPANET Request for Comments No. 733, Network Information
- Center No. 41952. SRI International: Menlo Park (November
- 1977).
-
- Feinler, E.J. and Postel, J.B. ARPANET Protocol Handbook, Net-
- work Information Center No. 7104 (NTIS AD A003890). SRI
- International: Menlo Park (April 1976).
-
- Harary, F. "Graph Theory". Addison-Wesley: Reading, Mass.
- (1969).
-
- Levin, R. and Schroeder, M. "Transport of Electronic Messages
- through a Network," TeleInformatics 79, pp. 29-33. North
- Holland (1979). Also as Xerox Palo Alto Research Center
- Technical Report CSL-79-4.
-
- Myer, T.H. and Henderson, D.A. "Message Transmission Protocol,"
- ARPANET Request for Comments, No. 680, Network Information
- Center No. 32116. SRI International: Menlo Park (1975).
-
-
- August 13, 1982 - 34 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- NBS. "Specification of Message Format for Computer Based Message
- Systems, Recommended Federal Information Processing Standard."
- National Bureau of Standards: Gaithersburg, Maryland
- (October 1981).
-
- NIC. Internet Protocol Transition Workbook. Network Information
- Center, SRI-International, Menlo Park, California (March
- 1982).
-
- Oppen, D.C. and Dalal, Y.K. "The Clearinghouse: A Decentralized
- Agent for Locating Named Objects in a Distributed Environ-
- ment," OPD-T8103. Xerox Office Products Division: Palo Alto,
- CA. (October 1981).
-
- Postel, J.B. "Assigned Numbers," ARPANET Request for Comments,
- No. 820. SRI International: Menlo Park (August 1982).
-
- Postel, J.B. "Simple Mail Transfer Protocol," ARPANET Request
- for Comments, No. 821. SRI International: Menlo Park (August
- 1982).
-
- Shoch, J.F. "Internetwork naming, addressing and routing," in
- Proc. 17th IEEE Computer Society International Conference, pp.
- 72-79, Sept. 1978, IEEE Cat. No. 78 CH 1388-8C.
-
- Su, Z. and Postel, J. "The Domain Naming Convention for Internet
- User Applications," ARPANET Request for Comments, No. 819.
- SRI International: Menlo Park (August 1982).
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- August 13, 1982 - 35 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- APPENDIX
-
-
- A. EXAMPLES
-
- A.1. ADDRESSES
-
- A.1.1. Alfred Neuman <Neuman at BBN-TENEXA>
-
- A.1.2. Neuman at BBN-TENEXA
-
- These two "Alfred Neuman" examples have identical seman-
- tics, as far as the operation of the local host's mail sending
- (distribution) program (also sometimes called its "mailer")
- and the remote host's mail protocol server are concerned. In
- the first example, the "Alfred Neuman" is ignored by the
- mailer, as "Neuman at BBN-TENEXA" completely specifies the reci-
- pient. The second example contains no superfluous informa-
- tion, and, again, "Neuman at BBN-TENEXA" is the intended reci-
- pient.
-
- Note: When the message crosses name-domain boundaries, then
- these specifications must be changed, so as to indicate
- the remainder of the hierarchy, starting with the top
- level.
-
- A.1.3. "George, Ted" <Shared at Group.Arpanet>
-
- This form might be used to indicate that a single mailbox
- is shared by several users. The quoted string is ignored by
- the originating host's mailer, because "Shared at Group.Arpanet"
- completely specifies the destination mailbox.
-
- A.1.4. Wilt . (the Stilt) Chamberlain at NBA.US
-
- The "(the Stilt)" is a comment, which is NOT included in
- the destination mailbox address handed to the originating
- system's mailer. The local-part of the address is the string
- "Wilt.Chamberlain", with NO space between the first and second
- words.
-
- A.1.5. Address Lists
-
- Gourmets: Pompous Person <WhoZiWhatZit at Cordon-Bleu>,
- Childs at WGBH.Boston, Galloping Gourmet@
- ANT.Down-Under (Australian National Television),
- Cheapie at Discount-Liquors;,
- Cruisers: Port at Portugal, Jones at SEA;,
- Another at Somewhere.SomeOrg
-
-
- August 13, 1982 - 36 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- This group list example points out the use of comments and the
- mixing of addresses and groups.
-
- A.2. ORIGINATOR ITEMS
-
- A.2.1. Author-sent
-
- George Jones logs into his host as "Jones". He sends
- mail himself.
-
- From: Jones at Group.Org
-
- or
-
- From: George Jones <Jones at Group.Org>
-
- A.2.2. Secretary-sent
-
- George Jones logs in as Jones on his host. His secre-
- tary, who logs in as Secy sends mail for him. Replies to the
- mail should go to George.
-
- From: George Jones <Jones at Group>
- Sender: Secy at Other-Group
-
- A.2.3. Secretary-sent, for user of shared directory
-
- George Jones' secretary sends mail for George. Replies
- should go to George.
-
- From: George Jones<Shared at Group.Org>
- Sender: Secy at Other-Group
-
- Note that there need not be a space between "Jones" and the
- "<", but adding a space enhances readability (as is the case
- in other examples.
-
- A.2.4. Committee activity, with one author
-
- George is a member of a committee. He wishes to have any
- replies to his message go to all committee members.
-
- From: George Jones <Jones at Host.Net>
- Sender: Jones at Host
- Reply-To: The Committee: Jones at Host.Net,
- Smith at Other.Org,
- Doe at Somewhere-Else;
-
- Note that if George had not included himself in the
-
-
- August 13, 1982 - 37 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- enumeration of The Committee, he would not have gotten an
- implicit reply; the presence of the "Reply-to" field SUPER-
- SEDES the sending of a reply to the person named in the "From"
- field.
-
- A.2.5. Secretary acting as full agent of author
-
- George Jones asks his secretary (Secy at Host) to send a
- message for him in his capacity as Group. He wants his secre-
- tary to handle all replies.
-
- From: George Jones <Group at Host>
- Sender: Secy at Host
- Reply-To: Secy at Host
-
- A.2.6. Agent for user without online mailbox
-
- A friend of George's, Sarah, is visiting. George's
- secretary sends some mail to a friend of Sarah in computer-
- land. Replies should go to George, whose mailbox is Jones at
- Registry.
-
- From: Sarah Friendly <Secy at Registry>
- Sender: Secy-Name <Secy at Registry>
- Reply-To: Jones at Registry.
-
- A.2.7. Agent for member of a committee
-
- George's secretary sends out a message which was authored
- jointly by all the members of a committee. Note that the name
- of the committee cannot be specified, since <group> names are
- not permitted in the From field.
-
- From: Jones at Host,
- Smith at Other-Host,
- Doe at Somewhere-Else
- Sender: Secy at SHost
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- August 13, 1982 - 38 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- A.3. COMPLETE HEADERS
-
- A.3.1. Minimum required
-
- Date: 26 Aug 76 1429 EDT Date: 26 Aug 76 1429 EDT
- From: Jones at Registry.Org or From: Jones at Registry.Org
- Bcc: To: Smith at Registry.Org
-
- Note that the "Bcc" field may be empty, while the "To" field
- is required to have at least one address.
-
- A.3.2. Using some of the additional fields
-
- Date: 26 Aug 76 1430 EDT
- From: George Jones<Group at Host>
- Sender: Secy at SHOST
- To: "Al Neuman"@Mad-Host,
- Sam.Irving at Other-Host
- Message-ID: <some.string at SHOST>
-
- A.3.3. About as complex as you're going to get
-
- Date : 27 Aug 76 0932 PDT
- From : Ken Davis <KDavis at This-Host.This-net>
- Subject : Re: The Syntax in the RFC
- Sender : KSecy at Other-Host
- Reply-To : Sam.Irving at Reg.Organization
- To : George Jones <Group at Some-Reg.An-Org>,
- Al.Neuman at MAD.Publisher
- cc : Important folk:
- Tom Softwood <Balsa at Tree.Root>,
- "Sam Irving"@Other-Host;,
- Standard Distribution:
- /main/davis/people/standard at Other-Host,
- "<Jones>standard.dist.3"@Tops-20-Host>;
- Comment : Sam is away on business. He asked me to handle
- his mail for him. He'll be able to provide a
- more accurate explanation when he returns
- next week.
- In-Reply-To: <some.string at DBM.Group>, George's message
- X-Special-action: This is a sample of user-defined field-
- names. There could also be a field-name
- "Special-action", but its name might later be
- preempted
- Message-ID: <4231.629.XYzi-What at Other-Host>
-
-
-
-
-
-
- August 13, 1982 - 39 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- B. SIMPLE FIELD PARSING
-
- Some mail-reading software systems may wish to perform only
- minimal processing, ignoring the internal syntax of structured
- field-bodies and treating them the same as unstructured-field-
- bodies. Such software will need only to distinguish:
-
- o Header fields from the message body,
-
- o Beginnings of fields from lines which continue fields,
-
- o Field-names from field-contents.
-
- The abbreviated set of syntactic rules which follows will
- suffice for this purpose. It describes a limited view of mes-
- sages and is a subset of the syntactic rules provided in the main
- part of this specification. One small exception is that the con-
- tents of field-bodies consist only of text:
-
- B.1. SYNTAX
-
-
- message = *field *(CRLF *text)
-
- field = field-name ":" [field-body] CRLF
-
- field-name = 1*<any CHAR, excluding CTLs, SPACE, and ":">
-
- field-body = *text [CRLF LWSP-char field-body]
-
-
- B.2. SEMANTICS
-
- Headers occur before the message body and are terminated by
- a null line (i.e., two contiguous CRLFs).
-
- A line which continues a header field begins with a SPACE or
- HTAB character, while a line beginning a field starts with a
- printable character which is not a colon.
-
- A field-name consists of one or more printable characters
- (excluding colon, space, and control-characters). A field-name
- MUST be contained on one line. Upper and lower case are not dis-
- tinguished when comparing field-names.
-
-
-
-
-
-
-
- August 13, 1982 - 40 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- C. DIFFERENCES FROM RFC #733
-
- The following summarizes the differences between this stan-
- dard and the one specified in Arpanet Request for Comments #733,
- "Standard for the Format of ARPA Network Text Messages". The
- differences are listed in the order of their occurrence in the
- current specification.
-
- C.1. FIELD DEFINITIONS
-
- C.1.1. FIELD NAMES
-
- These now must be a sequence of printable characters. They
- may not contain any LWSP-chars.
-
- C.2. LEXICAL TOKENS
-
- C.2.1. SPECIALS
-
- The characters period ("."), left-square bracket ("["), and
- right-square bracket ("]") have been added. For presentation
- purposes, and when passing a specification to a system that
- does not conform to this standard, periods are to be contigu-
- ous with their surrounding lexical tokens. No linear-white-
- space is permitted between them. The presence of one LWSP-
- char between other tokens is still directed.
-
- C.2.2. ATOM
-
- Atoms may not contain SPACE.
-
- C.2.3. SPECIAL TEXT
-
- ctext and qtext have had backslash ("\") added to the list of
- prohibited characters.
-
- C.2.4. DOMAINS
-
- The lexical tokens <domain-literal> and <dtext> have been
- added.
-
- C.3. MESSAGE SPECIFICATION
-
- C.3.1. TRACE
-
- The "Return-path:" and "Received:" fields have been specified.
-
-
-
-
-
- August 13, 1982 - 41 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- C.3.2. FROM
-
- The "From" field must contain machine-usable addresses (addr-
- spec). Multiple addresses may be specified, but named-lists
- (groups) may not.
-
- C.3.3. RESENT
-
- The meta-construct of prefacing field names with the string
- "Resent-" has been added, to indicate that a message has been
- forwarded by an intermediate recipient.
-
- C.3.4. DESTINATION
-
- A message must contain at least one destination address field.
- "To" and "CC" are required to contain at least one address.
-
- C.3.5. IN-REPLY-TO
-
- The field-body is no longer a comma-separated list, although a
- sequence is still permitted.
-
- C.3.6. REFERENCE
-
- The field-body is no longer a comma-separated list, although a
- sequence is still permitted.
-
- C.3.7. ENCRYPTED
-
- A field has been specified that permits senders to indicate
- that the body of a message has been encrypted.
-
- C.3.8. EXTENSION-FIELD
-
- Extension fields are prohibited from beginning with the char-
- acters "X-".
-
- C.4. DATE AND TIME SPECIFICATION
-
- C.4.1. SIMPLIFICATION
-
- Fewer optional forms are permitted and the list of three-
- letter time zones has been shortened.
-
- C.5. ADDRESS SPECIFICATION
-
-
-
-
-
-
- August 13, 1982 - 42 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- C.5.1. ADDRESS
-
- The use of quoted-string, and the ":"-atom-":" construct, have
- been removed. An address now is either a single mailbox
- reference or is a named list of addresses. The latter indi-
- cates a group distribution.
-
- C.5.2. GROUPS
-
- Group lists are now required to to have a name. Group lists
- may not be nested.
-
- C.5.3. MAILBOX
-
- A mailbox specification may indicate a person's name, as
- before. Such a named list no longer may specify multiple
- mailboxes and may not be nested.
-
- C.5.4. ROUTE ADDRESSING
-
- Addresses now are taken to be absolute, global specifications,
- independent of transmission paths. The <route> construct has
- been provided, to permit explicit specification of transmis-
- sion path. RFC #733's use of multiple at-signs ("@") was
- intended as a general syntax for indicating routing and/or
- hierarchical addressing. The current standard separates these
- specifications and only one at-sign is permitted.
-
- C.5.5. AT-SIGN
-
- The string " at " no longer is used as an address delimiter.
- Only at-sign ("@") serves the function.
-
- C.5.6. DOMAINS
-
- Hierarchical, logical name-domains have been added.
-
- C.6. RESERVED ADDRESS
-
- The local-part "Postmaster" has been reserved, so that users can
- be guaranteed at least one valid address at a site.
-
-
-
-
-
-
-
-
-
-
- August 13, 1982 - 43 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- D. ALPHABETICAL LISTING OF SYNTAX RULES
-
- address = mailbox ; one addressee
- / group ; named list
- addr-spec = local-part "@" domain ; global address
- ALPHA = <any ASCII alphabetic character>
- ; (101-132, 65.- 90.)
- ; (141-172, 97.-122.)
- atom = 1*<any CHAR except specials, SPACE and CTLs>
- authentic = "From" ":" mailbox ; Single author
- / ( "Sender" ":" mailbox ; Actual submittor
- "From" ":" 1#mailbox) ; Multiple authors
- ; or not sender
- CHAR = <any ASCII character> ; ( 0-177, 0.-127.)
- comment = "(" *(ctext / quoted-pair / comment) ")"
- CR = <ASCII CR, carriage return> ; ( 15, 13.)
- CRLF = CR LF
- ctext = <any CHAR excluding "(", ; => may be folded
- ")", "\" & CR, & including
- linear-white-space>
- CTL = <any ASCII control ; ( 0- 37, 0.- 31.)
- character and DEL> ; ( 177, 127.)
- date = 1*2DIGIT month 2DIGIT ; day month year
- ; e.g. 20 Jun 82
- dates = orig-date ; Original
- [ resent-date ] ; Forwarded
- date-time = [ day "," ] date time ; dd mm yy
- ; hh:mm:ss zzz
- day = "Mon" / "Tue" / "Wed" / "Thu"
- / "Fri" / "Sat" / "Sun"
- delimiters = specials / linear-white-space / comment
- destination = "To" ":" 1#address ; Primary
- / "Resent-To" ":" 1#address
- / "cc" ":" 1#address ; Secondary
- / "Resent-cc" ":" 1#address
- / "bcc" ":" #address ; Blind carbon
- / "Resent-bcc" ":" #address
- DIGIT = <any ASCII decimal digit> ; ( 60- 71, 48.- 57.)
- domain = sub-domain *("." sub-domain)
- domain-literal = "[" *(dtext / quoted-pair) "]"
- domain-ref = atom ; symbolic reference
- dtext = <any CHAR excluding "[", ; => may be folded
- "]", "\" & CR, & including
- linear-white-space>
- extension-field =
- <Any field which is defined in a document
- published as a formal extension to this
- specification; none will have names beginning
- with the string "X-">
-
-
- August 13, 1982 - 44 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- field = field-name ":" [ field-body ] CRLF
- fields = dates ; Creation time,
- source ; author id & one
- 1*destination ; address required
- *optional-field ; others optional
- field-body = field-body-contents
- [CRLF LWSP-char field-body]
- field-body-contents =
- <the ASCII characters making up the field-body, as
- defined in the following sections, and consisting
- of combinations of atom, quoted-string, and
- specials tokens, or else consisting of texts>
- field-name = 1*<any CHAR, excluding CTLs, SPACE, and ":">
- group = phrase ":" [#mailbox] ";"
- hour = 2DIGIT ":" 2DIGIT [":" 2DIGIT]
- ; 00:00:00 - 23:59:59
- HTAB = <ASCII HT, horizontal-tab> ; ( 11, 9.)
- LF = <ASCII LF, linefeed> ; ( 12, 10.)
- linear-white-space = 1*([CRLF] LWSP-char) ; semantics = SPACE
- ; CRLF => folding
- local-part = word *("." word) ; uninterpreted
- ; case-preserved
- LWSP-char = SPACE / HTAB ; semantics = SPACE
- mailbox = addr-spec ; simple address
- / phrase route-addr ; name & addr-spec
- message = fields *( CRLF *text ) ; Everything after
- ; first null line
- ; is message body
- month = "Jan" / "Feb" / "Mar" / "Apr"
- / "May" / "Jun" / "Jul" / "Aug"
- / "Sep" / "Oct" / "Nov" / "Dec"
- msg-id = "<" addr-spec ">" ; Unique message id
- optional-field =
- / "Message-ID" ":" msg-id
- / "Resent-Message-ID" ":" msg-id
- / "In-Reply-To" ":" *(phrase / msg-id)
- / "References" ":" *(phrase / msg-id)
- / "Keywords" ":" #phrase
- / "Subject" ":" *text
- / "Comments" ":" *text
- / "Encrypted" ":" 1#2word
- / extension-field ; To be defined
- / user-defined-field ; May be pre-empted
- orig-date = "Date" ":" date-time
- originator = authentic ; authenticated addr
- [ "Reply-To" ":" 1#address] )
- phrase = 1*word ; Sequence of words
-
-
-
-
- August 13, 1982 - 45 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- qtext = <any CHAR excepting <">, ; => may be folded
- "\" & CR, and including
- linear-white-space>
- quoted-pair = "\" CHAR ; may quote any char
- quoted-string = <"> *(qtext/quoted-pair) <">; Regular qtext or
- ; quoted chars.
- received = "Received" ":" ; one per relay
- ["from" domain] ; sending host
- ["by" domain] ; receiving host
- ["via" atom] ; physical path
- *("with" atom) ; link/mail protocol
- ["id" msg-id] ; receiver msg id
- ["for" addr-spec] ; initial form
- ";" date-time ; time received
-
- resent = resent-authentic
- [ "Resent-Reply-To" ":" 1#address] )
- resent-authentic =
- = "Resent-From" ":" mailbox
- / ( "Resent-Sender" ":" mailbox
- "Resent-From" ":" 1#mailbox )
- resent-date = "Resent-Date" ":" date-time
- return = "Return-path" ":" route-addr ; return address
- route = 1#("@" domain) ":" ; path-relative
- route-addr = "<" [route] addr-spec ">"
- source = [ trace ] ; net traversals
- originator ; original mail
- [ resent ] ; forwarded
- SPACE = <ASCII SP, space> ; ( 40, 32.)
- specials = "(" / ")" / "<" / ">" / "@" ; Must be in quoted-
- / "," / ";" / ":" / "\" / <"> ; string, to use
- / "." / "[" / "]" ; within a word.
- sub-domain = domain-ref / domain-literal
- text = <any CHAR, including bare ; => atoms, specials,
- CR & bare LF, but NOT ; comments and
- including CRLF> ; quoted-strings are
- ; NOT recognized.
- time = hour zone ; ANSI and Military
- trace = return ; path to sender
- 1*received ; receipt tags
- user-defined-field =
- <Any field which has not been defined
- in this specification or published as an
- extension to this specification; names for
- such fields must be unique and may be
- pre-empted by published extensions>
- word = atom / quoted-string
-
-
-
-
- August 13, 1982 - 46 - RFC #822
-
-
-
- Standard for ARPA Internet Text Messages
-
-
- zone = "UT" / "GMT" ; Universal Time
- ; North American : UT
- / "EST" / "EDT" ; Eastern: - 5/ - 4
- / "CST" / "CDT" ; Central: - 6/ - 5
- / "MST" / "MDT" ; Mountain: - 7/ - 6
- / "PST" / "PDT" ; Pacific: - 8/ - 7
- / 1ALPHA ; Military: Z = UT;
- <"> = <ASCII quote mark> ; ( 42, 34.)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- August 13, 1982 - 47 - RFC #822
diff --git a/spec/mail/body_spec.rb b/spec/mail/body_spec.rb
index 78e4002..e4c9b7a 100644
--- a/spec/mail/body_spec.rb
+++ b/spec/mail/body_spec.rb
@@ -118,7 +118,6 @@ describe Mail::Body do
end
describe "splitting up a multipart document" do
-
it "should store the boundary passed in" do
multipart_body = "this is some text\r\n\r\n------=_Part_2192_32400445\r\nContent-Type: text/plain; charset=ISO-8859-1\r\n\r\nThis is a plain text\r\n\r\n------=_Part_2192_32400445\r\nContent-Type: text/html\r\n\r\n<p>This is HTML</p>\r\n------=_Part_2192_32400445--\r\n"
body = Mail::Body.new(multipart_body)
@@ -201,6 +200,12 @@ describe Mail::Body do
new_body.preamble.should eq "this is some text"
end
+ it "should split if boundary is not set" do
+ multipart_body = "\n\n--\nDate: Thu, 01 Aug 2013 15:14:20 +0100\nMime-Version: 1.0\nContent-Type: text/plain\nContent-Transfer-Encoding: 7bit\nContent-Disposition: attachment;\n filename=\"\"\nContent-ID: <51fa6d3cac796_d84e3fe5a58349e025683 at local.mail>\n\n\n\n----"
+ body = Mail::Body.new(multipart_body)
+ doing { body.split!(nil) }.should_not raise_error
+ end
+
end
describe "detecting non ascii" do
@@ -331,6 +336,28 @@ describe Mail::Body do
body.parts[0].parts[2].content_type.should eq "text/html"
end
+ it "should maintain the relative order of the parts with the same content-type as they are added" do
+ body = Mail::Body.new('');
+ body << Mail::Part.new("content-type: text/html\r\nsubject: HTML_1")
+ body << Mail::Part.new("content-type: image/jpeg\r\nsubject: JPGEG_1\r\n\r\nsdkjskjdksjdkjsd")
+ body << Mail::Part.new("content-type: text/plain\r\nsubject: Plain Text_1")
+ body << Mail::Part.new("content-type: text/enriched\r\nsubject: Enriched_1")
+ body << Mail::Part.new("content-type: text/html\r\nsubject: HTML_2")
+ body << Mail::Part.new("content-type: text/plain\r\nsubject: Plain Text_2")
+ body << Mail::Part.new("content-type: image/jpeg\r\nsubject: JPGEG_2\r\n\r\nsdkjskjdksjdkjsd")
+ body << Mail::Part.new("content-type: text/enriched\r\nsubject: Enriched_2")
+ body.parts.length.should eq 8
+ body.should be_multipart
+ body.sort_parts!
+ body.parts[0].subject.should eq "Plain Text_1"
+ body.parts[1].subject.should eq "Plain Text_2"
+ body.parts[2].subject.should eq "Enriched_1"
+ body.parts[3].subject.should eq "Enriched_2"
+ body.parts[4].subject.should eq "HTML_1"
+ body.parts[5].subject.should eq "HTML_2"
+ body.parts[6].subject.should eq "JPGEG_1"
+ body.parts[7].subject.should eq "JPGEG_2"
+ end
end
describe "matching" do
diff --git a/spec/mail/elements/address_list_spec.rb b/spec/mail/elements/address_list_spec.rb
index b42a2e7..9a6c2d2 100644
--- a/spec/mail/elements/address_list_spec.rb
+++ b/spec/mail/elements/address_list_spec.rb
@@ -85,34 +85,14 @@ describe Mail::AddressList do
end
describe "functionality" do
- it "should give back a list of address nodes" do
- list = Mail::AddressList.new('mikel at me.com, bob at you.com')
- list.address_nodes.length.should eq 2
- end
-
- it "should make each node a class of SyntaxNode" do
- list = Mail::AddressList.new('mikel at me.com, bob at you.com')
- list.address_nodes.each { |n| n.class.should eq Treetop::Runtime::SyntaxNode }
- end
-
- it "should give a block of address nodes with groups" do
- list = Mail::AddressList.new('sam at me.com, my_group: mikel at me.com, bob at you.com;')
- list.address_nodes.length.should eq 2
- end
-
- it "should give all the recipients when asked" do
- list = Mail::AddressList.new('sam at me.com, my_group: mikel at me.com, bob at you.com;')
- list.individual_recipients.length.should eq 1
- end
-
it "should give all the groups when asked" do
list = Mail::AddressList.new('sam at me.com, my_group: mikel at me.com, bob at you.com;')
- list.group_recipients.length.should eq 1
+ list.addresses_grouped_by_group.length.should eq 1
end
it "should ask the group for all its addresses" do
list = Mail::AddressList.new('sam at me.com, my_group: mikel at me.com, bob at you.com;')
- list.group_recipients.first.group_list.addresses.length.should eq 2
+ list.addresses_grouped_by_group.values.first.length.should eq 2
end
it "should give all the addresses when asked" do
diff --git a/spec/mail/elements/address_spec.rb b/spec/mail/elements/address_spec.rb
index c29d033..dcd1c80 100644
--- a/spec/mail/elements/address_spec.rb
+++ b/spec/mail/elements/address_spec.rb
@@ -124,6 +124,13 @@ describe Mail::Address do
a.comments.should eq result
end
+ it "should handle nested comments" do
+ parse_text = "bob at example.com (hello (nested) yeah)"
+ result = ["hello \(nested\) yeah"]
+ a = Mail::Address.new(parse_text)
+ a.comments.should eq result
+ end
+
it "should give back the raw value" do
parse_text = "Mikel (first name) Lindsaar (author) <test at lindsaar.net>"
result = "Mikel (first name) Lindsaar (author) <test at lindsaar.net>"
diff --git a/spec/mail/encodings_spec.rb b/spec/mail/encodings_spec.rb
index dc50c8d..5ec0647 100644
--- a/spec/mail/encodings_spec.rb
+++ b/spec/mail/encodings_spec.rb
@@ -154,6 +154,18 @@ describe Mail::Encodings do
Mail::Encodings.value_decode(string).should == string
end
+ it "should collapse adjacent words" do
+ string = "=?utf-8?B?0L3QvtCy0YvQuSDRgdC+0YLRgNGD0LTQvdC40Log4oCUINC00L7RgNC+0YQ=?=\n =?utf-8?B?0LXQtdCy?="
+ result = "новый сотрудник — дорофеев"
+ Mail::Encodings.value_decode(string).should == result
+ end
+
+ it "should parse adjacent words with no space" do
+ string = "=?utf-8?B?0L3QvtCy0YvQuSDRgdC+0YLRgNGD0LTQvdC40Log4oCUINC00L7RgNC+0YQ=?==?utf-8?B?0LXQtdCy?="
+ result = "новый сотрудник — дорофеев"
+ Mail::Encodings.value_decode(string).should == result
+ end
+
if '1.9'.respond_to?(:force_encoding)
it "should decode 8bit encoded string" do
string = "=?8bit?Q?ALPH=C3=89E?="
@@ -633,6 +645,11 @@ describe Mail::Encodings do
b.should eq "simple – dash – "
end
+ it "should recognize iso646-us" do
+ decoded = Mail::Encodings.value_decode "[kj] =?ISO646-US?Q?Re:_[kj]_[KJ]_Money_is_not_our_god_should_?=\r\n =?ISO646-US?Q?be_played_on_US_Tour...+_Elys=3Fe_Montmartre?="
+ decoded.should == "[kj] Re: [kj] [KJ] Money is not our god should be played on US Tour...+ Elys?e Montmartre"
+ end
+
it "should unquote multiple strings in the middle of the text" do
a = "=?Shift_JIS?Q?=93=FA=96{=8C=EA=?= <a at example.com>, =?Shift_JIS?Q?=93=FA=96{=8C=EA=?= <b at example.com>"
b = Mail::Encodings.unquote_and_convert_to(a, 'utf-8')
@@ -651,6 +668,12 @@ describe Mail::Encodings do
b.should eq "Der Kunde ist König"
end
+ it "should handle utf_8" do
+ a = 'Der Kunde ist K=?utf_8?B?w7Y=?=nig'
+ b = Mail::Encodings.unquote_and_convert_to(a, 'utf-8')
+ b.should eq "Der Kunde ist König"
+ end
+
end
end
diff --git a/spec/mail/example_emails_spec.rb b/spec/mail/example_emails_spec.rb
index a076e6b..ad10449 100644
--- a/spec/mail/example_emails_spec.rb
+++ b/spec/mail/example_emails_spec.rb
@@ -185,6 +185,7 @@ describe "Test emails" do
# (but not within) the identifier in the "Message-ID:" field.
it "should handle the rfc whitespace test email" do
+ pending "fixed in pr#487"
mail = Mail.read(fixture('emails', 'rfc2822', 'example10.eml'))
mail.from.should eq ["pete(his account)@silly.test"]
mail.to.should eq ["c at public.example", "joe at example.org", "jdoe at one.test"]
diff --git a/spec/mail/fields/common/common_field_spec.rb b/spec/mail/fields/common/common_field_spec.rb
index 7a2d8c2..8b3cbc5 100644
--- a/spec/mail/fields/common/common_field_spec.rb
+++ b/spec/mail/fields/common/common_field_spec.rb
@@ -69,4 +69,8 @@ describe Mail::CommonField do
end
+ it "does not strip out content that looks identitcal to the field name" do
+ field = Mail::SubjectField.new("Subject: Subject: for your approval")
+ field.decoded.should == "Subject: for your approval"
+ end
end
diff --git a/spec/mail/fields/content_type_field_spec.rb b/spec/mail/fields/content_type_field_spec.rb
index 0976a78..276a6b7 100644
--- a/spec/mail/fields/content_type_field_spec.rb
+++ b/spec/mail/fields/content_type_field_spec.rb
@@ -738,6 +738,7 @@ describe Mail::ContentTypeField do
end
it "should just ignore illegal params like audio/x-midi;\r\n\sname=Part .exe" do
+ pending "fixed in pr #481"
c = Mail::ContentTypeField.new("audio/x-midi;\r\n\sname=Part .exe")
c.string.should eq 'audio/x-midi'
c.parameters['name'].should eq nil
diff --git a/spec/mail/fields/unstructured_field_spec.rb b/spec/mail/fields/unstructured_field_spec.rb
index d0de4e0..f31da8a 100644
--- a/spec/mail/fields/unstructured_field_spec.rb
+++ b/spec/mail/fields/unstructured_field_spec.rb
@@ -178,6 +178,12 @@ describe Mail::UnstructuredField do
$KCODE = @original if RUBY_VERSION < '1.9'
end
+ it "should fold properly with continuous spaces around the linebreak" do
+ @field = Mail::UnstructuredField.new("Subject", "This is a header that has continuous spaces around line break point, which should be folded properly")
+ result = "Subject: This is a header that has continuous spaces around line break point,\s\r\n\s\s\s\swhich should be folded properly\r\n"
+ @field.encoded.should eq result
+ end
+
end
describe "encoding non QP safe chars" do
diff --git a/spec/mail/header_spec.rb b/spec/mail/header_spec.rb
index 78f5c27..52d00d5 100644
--- a/spec/mail/header_spec.rb
+++ b/spec/mail/header_spec.rb
@@ -15,6 +15,17 @@ describe Mail::Header do
end
+ describe "copying" do
+
+ it "should instantiate with a string passed in" do
+ header = Mail::Header.new("To: Mikel\r\nFrom: bob\r\n")
+ copy = header.dup
+ copy.to_a.should == header.to_a
+ copy[:to].should == header[:to]
+ end
+
+ end
+
describe "instance methods" do
it "should save away the raw source of the header that it is passed" do
@@ -52,6 +63,12 @@ describe Mail::Header do
header['content-type'] = 'text/plain; charset=utf-8'
header.charset.should eq 'utf-8'
end
+
+ it "should not unset previously set charset if content-type is set without charset" do
+ header = Mail::Header.new(nil, 'utf-8')
+ header['content-type'] = 'text/plain'
+ header.charset.should eq 'utf-8'
+ end
it "shouldn't die when queried for a charset and the content-type header is invalid" do
header = Mail::Header.new
@@ -461,10 +478,10 @@ HERE
header = Mail::Header.new("Content-Transfer-Encoding: vl at d\r\nReply-To: a b b")
header.errors.should_not be_blank
header.errors.size.should eq 2
- header.errors[0][0].should eq 'Content-Transfer-Encoding'
- header.errors[0][1].should eq 'vl at d'
- header.errors[1][0].should eq 'Reply-To'
- header.errors[1][1].should eq 'a b b'
+ header.errors[0][0].should eq 'Reply-To'
+ header.errors[0][1].should eq 'a b b'
+ header.errors[1][0].should eq 'Content-Transfer-Encoding'
+ header.errors[1][1].should eq 'vl at d'
end
end
diff --git a/spec/mail/message_spec.rb b/spec/mail/message_spec.rb
index 5df7dd5..4030141 100644
--- a/spec/mail/message_spec.rb
+++ b/spec/mail/message_spec.rb
@@ -109,7 +109,7 @@ describe Mail::Message do
it "should raise a warning (and keep parsing) on having an incorrectly formatted header" do
STDERR.should_receive(:puts).with("WARNING: Could not parse (and so ignoring) 'quite Delivered-To: xxx at xxx.xxx'")
- Mail.read(fixture('emails', 'plain_emails', 'raw_email_incorrect_header.eml'))
+ Mail.read(fixture('emails', 'plain_emails', 'raw_email_incorrect_header.eml')).to_s
end
it "should read in an email message and basically parse it" do
@@ -339,9 +339,12 @@ describe Mail::Message do
end
it "should parse non-UTF8 sources" do
- mail = Mail.read(fixture('emails', 'multi_charset', 'japanese_shiftjis.eml'))
+ raw_message = File.read(fixture('emails', 'multi_charset', 'japanese_shiftjis.eml'))
+ original_encoding = raw_message.encoding if raw_message.respond_to?(:encoding)
+ mail = Mail.new(raw_message)
mail.to.should eq ["raasdnil at gmail.com"]
mail.decoded.should eq "すみません。\n\n"
+ raw_message.encoding.should eq original_encoding if raw_message.respond_to?(:encoding)
end
end
@@ -904,6 +907,143 @@ describe Mail::Message do
end
+ describe "making a copy of a message with dup" do
+ def message_should_have_default_values(message)
+ message.bcc.should eq nil
+ message.cc.should eq nil
+ message.comments.should eq nil
+ message.date.should eq nil
+ message.from.should eq nil
+ message.in_reply_to.should eq nil
+ message.keywords.should eq nil
+ message.message_id.should eq nil
+ message.received.should eq nil
+ message.references.should eq nil
+ message.reply_to.should eq nil
+ message.resent_bcc.should eq nil
+ message.resent_cc.should eq nil
+ message.resent_date.should eq nil
+ message.resent_from.should eq nil
+ message.resent_message_id.should eq nil
+ message.resent_sender.should eq nil
+ message.resent_to.should eq nil
+ message.sender.should eq nil
+ message.subject.should eq nil
+ message.to.should eq nil
+ message.content_type.should eq nil
+ message.content_transfer_encoding.should eq nil
+ message.content_description.should eq nil
+ message.content_disposition.should eq nil
+ message.content_id.should eq nil
+ message.mime_version.should eq nil
+ message.body.to_s.should eq ''
+ end
+
+ it "its headers should not be changed when you change the headers of the original" do
+ message = Mail.new
+ message_copy = message.dup
+ message_should_have_default_values message
+ message_should_have_default_values message_copy
+
+ message[:bcc] = 'mikel at bcc.lindsaar.net'
+ message[:cc] = 'mikel at cc.lindsaar.net'
+ message[:comments] = 'this is a comment'
+ message[:date] = '12 Aug 2009 00:00:01 GMT'
+ message[:from] = 'mikel at from.lindsaar.net'
+ message[:in_reply_to] = '<1234 at in_reply_to.lindsaar.net>'
+ message[:keywords] = 'test, "of the new mail", system'
+ message[:message_id] = '<1234 at message_id.lindsaar.net>'
+ message[:received] = 'from machine.example by x.y.test; 12 Aug 2009 00:00:02 GMT'
+ message[:references] = '<1234 at references.lindsaar.net>'
+ message[:reply_to] = 'mikel at reply-to.lindsaar.net'
+ message[:resent_bcc] = 'mikel at resent-bcc.lindsaar.net'
+ message[:resent_cc] = 'mikel at resent-cc.lindsaar.net'
+ message[:resent_date] = '12 Aug 2009 00:00:03 GMT'
+ message[:resent_from] = 'mikel at resent-from.lindsaar.net'
+ message[:resent_message_id] = '<1234 at resent_message_id.lindsaar.net>'
+ message[:resent_sender] = 'mikel at resent-sender.lindsaar.net'
+ message[:resent_to] = 'mikel at resent-to.lindsaar.net'
+ message[:sender] = 'mikel at sender.lindsaar.net'
+ message[:subject] = 'Hello there Mikel'
+ message[:to] = 'mikel at to.lindsaar.net'
+ message[:content_type] = 'text/plain; charset=UTF-8'
+ message[:content_transfer_encoding] = '7bit'
+ message[:content_description] = 'This is a test'
+ message[:content_disposition] = 'attachment; filename=File'
+ message[:content_id] = '<1234 at message_id.lindsaar.net>'
+ message[:mime_version]= '1.0'
+ message[:body] = 'This is a body of text'
+
+ message_should_have_default_values message_copy
+ end
+
+ def message_headers_should_match(message, other)
+ message.bcc.should eq other.bcc
+ message.cc.should eq other.cc
+ message.comments.should eq other.comments
+ message.date.should eq other.date
+ message.from.should eq other.from
+ message.in_reply_to.should eq other.in_reply_to
+ message.keywords.should eq other.keywords
+ message.message_id.should eq other.message_id
+ message.received.should eq other.received
+ message.references.should eq other.references
+ message.reply_to.should eq other.reply_to
+ message.resent_bcc.should eq other.resent_bcc
+ message.resent_cc.should eq other.resent_cc
+ message.resent_date.should eq other.resent_date
+ message.resent_from.should eq other.resent_from
+ message.resent_message_id.should eq other.resent_message_id
+ message.resent_sender.should eq other.resent_sender
+ message.resent_to.should eq other.resent_to
+ message.sender.should eq other.sender
+ message.subject.should eq other.subject
+ message.to.should eq other.to
+ message.content_type.should eq other.content_type
+ message.content_transfer_encoding.should eq other.content_transfer_encoding
+ message.content_description.should eq other.content_description
+ message.content_disposition.should eq other.content_disposition
+ message.content_id.should eq other.content_id
+ message.mime_version.should eq other.mime_version
+ message.body.to_s.should eq other.body.to_s
+ end
+
+ it "its headers should be copies of the headers of the original" do
+ message = Mail.new
+ message[:bcc] = 'mikel at bcc.lindsaar.net'
+ message[:cc] = 'mikel at cc.lindsaar.net'
+ message[:comments] = 'this is a comment'
+ message[:date] = '12 Aug 2009 00:00:01 GMT'
+ message[:from] = 'mikel at from.lindsaar.net'
+ message[:in_reply_to] = '<1234 at in_reply_to.lindsaar.net>'
+ message[:keywords] = 'test, "of the new mail", system'
+ message[:message_id] = '<1234 at message_id.lindsaar.net>'
+ message[:received] = 'from machine.example by x.y.test; 12 Aug 2009 00:00:02 GMT'
+ message[:references] = '<1234 at references.lindsaar.net>'
+ message[:reply_to] = 'mikel at reply-to.lindsaar.net'
+ message[:resent_bcc] = 'mikel at resent-bcc.lindsaar.net'
+ message[:resent_cc] = 'mikel at resent-cc.lindsaar.net'
+ message[:resent_date] = '12 Aug 2009 00:00:03 GMT'
+ message[:resent_from] = 'mikel at resent-from.lindsaar.net'
+ message[:resent_message_id] = '<1234 at resent_message_id.lindsaar.net>'
+ message[:resent_sender] = 'mikel at resent-sender.lindsaar.net'
+ message[:resent_to] = 'mikel at resent-to.lindsaar.net'
+ message[:sender] = 'mikel at sender.lindsaar.net'
+ message[:subject] = 'Hello there Mikel'
+ message[:to] = 'mikel at to.lindsaar.net'
+ message[:content_type] = 'text/plain; charset=UTF-8'
+ message[:content_transfer_encoding] = '7bit'
+ message[:content_description] = 'This is a test'
+ message[:content_disposition] = 'attachment; filename=File'
+ message[:content_id] = '<1234 at message_id.lindsaar.net>'
+ message[:mime_version]= '1.0'
+ message[:body] = 'This is a body of text'
+
+ message_copy = message.dup
+ message_headers_should_match message_copy, message
+ end
+ end
+
describe "handling missing required fields:" do
describe "every email" do
@@ -1340,44 +1480,34 @@ describe Mail::Message do
m1 = Mail.new("To: mikel at test.lindsaar.net\r\nSubject: Yo!\r\n\r\nHello there")
m2 = Mail.new("To: mikel at test.lindsaar.net\r\nSubject: Yo!\r\n\r\nHello there")
m1.should eq m2
+ # confirm there are no side-effects in the comparison
+ m1.message_id.should be_nil
+ m2.message_id.should be_nil
end
it "should ignore the message id value if self has a nil message id" do
m1 = Mail.new("To: mikel at test.lindsaar.net\r\nSubject: Yo!\r\n\r\nHello there")
m2 = Mail.new("To: mikel at test.lindsaar.net\r\nMessage-ID: <1234 at test.lindsaar.net>\r\nSubject: Yo!\r\n\r\nHello there")
m1.should eq m2
+ # confirm there are no side-effects in the comparison
+ m1.message_id.should be_nil
+ m2.message_id.should eq '1234 at test.lindsaar.net'
end
it "should ignore the message id value if other has a nil message id" do
m1 = Mail.new("To: mikel at test.lindsaar.net\r\nMessage-ID: <1234 at test.lindsaar.net>\r\nSubject: Yo!\r\n\r\nHello there")
m2 = Mail.new("To: mikel at test.lindsaar.net\r\nSubject: Yo!\r\n\r\nHello there")
m1.should eq m2
+ # confirm there are no side-effects in the comparison
+ m1.message_id.should eq '1234 at test.lindsaar.net'
+ m2.message_id.should be_nil
end
it "should not be == if both emails have different Message IDs" do
m1 = Mail.new("To: mikel at test.lindsaar.net\r\nMessage-ID: <4321 at test.lindsaar.net>\r\nSubject: Yo!\r\n\r\nHello there")
m2 = Mail.new("To: mikel at test.lindsaar.net\r\nMessage-ID: <1234 at test.lindsaar.net>\r\nSubject: Yo!\r\n\r\nHello there")
m1.should_not eq m2
- end
-
- it "should preserve the message id of self if set" do
- m1 = Mail.new("To: mikel at test.lindsaar.net\r\nMessage-ID: <1234 at test.lindsaar.net>\r\nSubject: Yo!\r\n\r\nHello there")
- m2 = Mail.new("To: mikel at test.lindsaar.net\r\nSubject: Yo!\r\n\r\nHello there")
- (m1 == m2).should be_true # confirm the side-effects of the comparison
- m1.message_id.should eq '1234 at test.lindsaar.net'
- end
-
- it "should preserve the message id of other if set" do
- m1 = Mail.new("To: mikel at test.lindsaar.net\r\nSubject: Yo!\r\n\r\nHello there")
- m2 = Mail.new("To: mikel at test.lindsaar.net\r\nMessage-ID: <1234 at test.lindsaar.net>\r\nSubject: Yo!\r\n\r\nHello there")
- (m1 == m2).should be_true # confirm the side-effects of the comparison
- m2.message_id.should eq '1234 at test.lindsaar.net'
- end
-
- it "should preserve the message id of both if set" do
- m1 = Mail.new("To: mikel at test.lindsaar.net\r\nMessage-ID: <4321 at test.lindsaar.net>\r\nSubject: Yo!\r\n\r\nHello there")
- m2 = Mail.new("To: mikel at test.lindsaar.net\r\nMessage-ID: <1234 at test.lindsaar.net>\r\nSubject: Yo!\r\n\r\nHello there")
- (m1 == m2).should be_false # confirm the side-effects of the comparison
+ # confirm there are no side-effects in the comparison
m1.message_id.should eq '4321 at test.lindsaar.net'
m2.message_id.should eq '1234 at test.lindsaar.net'
end
@@ -1527,6 +1657,15 @@ describe Mail::Message do
mail.deliver
end
+ it "should allow observers to be unregistered" do
+ mail = Mail.new(:from => 'bob at example.com', :to => 'bobette at example.com')
+ mail.delivery_method :test
+ Mail.register_observer(ObserverAgent)
+ Mail.unregister_observer(ObserverAgent)
+ ObserverAgent.should_not_receive(:delivered_email).with(mail)
+ mail.deliver
+ end
+
it "should inform observers that the mail was sent, even if a delivery agent is used" do
mail = Mail.new
mail.delivery_handler = DeliveryAgent
@@ -1568,6 +1707,18 @@ describe Mail::Message do
mail.to.should eq ['bob at example.com']
end
+ it "should allow interceptors to be unregistered" do
+ mail = Mail.new(:from => 'bob at example.com', :to => 'bobette at example.com')
+ mail.to = 'fred at example.com'
+ mail.delivery_method :test
+ Mail.register_interceptor(InterceptorAgent)
+ InterceptorAgent.intercept = true
+ Mail.unregister_interceptor(InterceptorAgent)
+ mail.deliver
+ InterceptorAgent.intercept = false
+ mail.to.should eq ['fred at example.com']
+ end
+
end
describe "error handling" do
@@ -1575,10 +1726,10 @@ describe Mail::Message do
mail = Mail.new("Content-Transfer-Encoding: vl at d\r\nReply-To: a b b\r\n")
mail.errors.should_not be_blank
mail.errors.size.should eq 2
- mail.errors[0][0].should eq 'Content-Transfer-Encoding'
- mail.errors[0][1].should eq 'vl at d'
- mail.errors[1][0].should eq 'Reply-To'
- mail.errors[1][1].should eq 'a b b'
+ mail.errors[0][0].should eq 'Reply-To'
+ mail.errors[0][1].should eq 'a b b'
+ mail.errors[1][0].should eq 'Content-Transfer-Encoding'
+ mail.errors[1][1].should eq 'vl at d'
end
end
diff --git a/spec/mail/network/retriever_methods/imap_spec.rb b/spec/mail/network/retriever_methods/imap_spec.rb
index 6115d3b..c06a3f7 100644
--- a/spec/mail/network/retriever_methods/imap_spec.rb
+++ b/spec/mail/network/retriever_methods/imap_spec.rb
@@ -80,6 +80,11 @@ describe "IMAP Retriever" do
MockIMAP.mailbox.should eq 'SOME-RANDOM-MAILBOX'
end
+ it "should handle the :uid option" do
+ messages = Mail.find(:uid => 1)
+
+ messages[0].raw_source.should eq MockIMAP.examples.map { |m| m.attr['RFC822'] }[1]
+ end
it "should find the last 10 messages by default" do
messages = Mail.find
diff --git a/spec/mail/network_spec.rb b/spec/mail/network_spec.rb
index c44de9c..841ac8d 100644
--- a/spec/mail/network_spec.rb
+++ b/spec/mail/network_spec.rb
@@ -305,16 +305,24 @@ describe "Mail" do
it "should pass on delivery errors if raised" do
delivery_agent = MyDeliveryMethod.new
@message.stub!(:delivery_method).and_return(delivery_agent)
- delivery_agent.stub!(:deliver!).and_raise(Exception)
- doing { @message.deliver }.should raise_error(Exception)
+ delivery_agent.stub!(:deliver!).and_raise(StandardError)
+ doing { @message.deliver }.should raise_error(StandardError)
end
it "should not pass on delivery errors if raised raise_delivery_errors is set to false" do
delivery_agent = MyDeliveryMethod.new
@message.stub!(:delivery_method).and_return(delivery_agent)
@message.raise_delivery_errors = false
+ delivery_agent.stub!(:deliver!).and_raise(StandardError)
+ doing { @message.deliver }.should_not raise_error(StandardError)
+ end
+
+ it "should pass through Exceptions even when raise_delivery_errors is set to false" do
+ delivery_agent = MyDeliveryMethod.new
+ @message.stub!(:delivery_method).and_return(delivery_agent)
+ @message.raise_delivery_errors = false
delivery_agent.stub!(:deliver!).and_raise(Exception)
- doing { @message.deliver }.should_not raise_error(Exception)
+ doing { @message.deliver }.should raise_error(Exception)
end
end
diff --git a/spec/mail/parsers/address_lists_parser_spec.rb b/spec/mail/parsers/address_lists_parser_spec.rb
index c06e810..c5be6d6 100644
--- a/spec/mail/parsers/address_lists_parser_spec.rb
+++ b/spec/mail/parsers/address_lists_parser_spec.rb
@@ -4,12 +4,31 @@ require 'spec_helper'
describe "AddressListsParser" do
it "should parse an address" do
text = 'Mikel Lindsaar <test at lindsaar.net>, Friends: test2 at lindsaar.net, Ada <test3 at lindsaar.net>;'
- a = Mail::AddressListsParser.new
+ a = Mail::Parsers::AddressListsParser.new
a.parse(text).should_not be_nil
end
+
it "should parse an address list separated by semicolons" do
text = 'Mikel Lindsaar <test at lindsaar.net>; Friends: test2 at lindsaar.net; Ada <test3 at lindsaar.net>;'
- a = Mail::AddressListsParser.new
+ a = Mail::Parsers::AddressListsParser.new
a.parse(text).should_not be_nil
end
+
+ context "parsing an address with a space at the end" do
+ it "only finds a single address" do
+ text = 'Mikel Lindsaar <test at lindsaar.net> '
+ a = Mail::Parsers::AddressListsParser.new
+ a.parse(text).addresses.size.should eq 1
+ end
+ end
+
+ context "parsing an address which begins with a comment" do
+ it "extracts local string correctly" do
+ text = '(xxxx xxxxxx xxxx)ababab at example.com'
+
+ a = Mail::Parsers::AddressListsParser.new
+ a.parse(text).addresses.size.should eq 1
+ a.parse(text).addresses.first.local.should eq 'ababab'
+ end
+ end
end
diff --git a/spec/mail/parsers/content_transfer_encoding_parser_spec.rb b/spec/mail/parsers/content_transfer_encoding_parser_spec.rb
index a29229d..0d2527d 100644
--- a/spec/mail/parsers/content_transfer_encoding_parser_spec.rb
+++ b/spec/mail/parsers/content_transfer_encoding_parser_spec.rb
@@ -5,57 +5,57 @@ describe "ContentTransferEncodingParser" do
it "should work" do
text = "quoted-printable"
- a = Mail::ContentTransferEncodingParser.new
- a.parse(text).should_not be_nil
- a.parse(text).encoding.text_value.should eq 'quoted-printable'
+ a = Mail::Parsers::ContentTransferEncodingParser.new
+ a.parse(text).error.should be_nil
+ a.parse(text).encoding.should eq 'quoted-printable'
end
describe "trailing semi colons" do
it "should parse" do
text = "quoted-printable;"
- a = Mail::ContentTransferEncodingParser.new
- a.parse(text).should_not be_nil
- a.parse(text).encoding.text_value.should eq 'quoted-printable'
+ a = Mail::Parsers::ContentTransferEncodingParser.new
+ a.parse(text).error.should be_nil
+ a.parse(text).encoding.should eq 'quoted-printable'
end
it "should parse with pre white space" do
text = 'quoted-printable ;'
- a = Mail::ContentTransferEncodingParser.new
- a.parse(text).should_not be_nil
- a.parse(text).encoding.text_value.should eq 'quoted-printable'
+ a = Mail::Parsers::ContentTransferEncodingParser.new
+ a.parse(text).error.should be_nil
+ a.parse(text).encoding.should eq 'quoted-printable'
end
it "should parse with trailing white space" do
text = 'quoted-printable; '
- a = Mail::ContentTransferEncodingParser.new
- a.parse(text).should_not be_nil
- a.parse(text).encoding.text_value.should eq 'quoted-printable'
+ a = Mail::Parsers::ContentTransferEncodingParser.new
+ a.parse(text).error.should be_nil
+ a.parse(text).encoding.should eq 'quoted-printable'
end
it "should parse with pre and trailing white space" do
text = 'quoted-printable ; '
- a = Mail::ContentTransferEncodingParser.new
- a.parse(text).should_not be_nil
- a.parse(text).encoding.text_value.should eq 'quoted-printable'
+ a = Mail::Parsers::ContentTransferEncodingParser.new
+ a.parse(text).error.should be_nil
+ a.parse(text).encoding.should eq 'quoted-printable'
end
end
describe "x-token values" do
it "should work" do
text = 'x-my-token'
- a = Mail::ContentTransferEncodingParser.new
- a.parse(text).should_not be_nil
- a.parse(text).encoding.text_value.should eq 'x-my-token'
+ a = Mail::Parsers::ContentTransferEncodingParser.new
+ a.parse(text).error.should be_nil
+ a.parse(text).encoding.should eq 'x-my-token'
end
end
describe "wild content-transfer-encoding" do
%w(7bits 8bits 7-bit 8-bit).each do |mechanism|
it "should parse #{mechanism} variant" do
- a = Mail::ContentTransferEncodingParser.new
- a.parse(mechanism).should_not be_nil
- a.parse(mechanism).encoding.text_value.should eq mechanism
+ a = Mail::Parsers::ContentTransferEncodingParser.new
+ a.parse(mechanism).error.should be_nil
+ a.parse(mechanism).encoding.should eq mechanism
end
end
end
diff --git a/spec/mail/parts_list_spec.rb b/spec/mail/parts_list_spec.rb
index 8a943d9..6d10fd4 100644
--- a/spec/mail/parts_list_spec.rb
+++ b/spec/mail/parts_list_spec.rb
@@ -17,4 +17,21 @@ describe "PartsList" do
p << 'text/html'
p.sort!(order)
end
-end
+
+ it "should not fail if we do not have a content_type" do
+ p = Mail::PartsList.new
+ order = ['text/plain', 'text/html']
+
+ no_content_type_part = Mail::Part.new
+ plain_text_part = Mail::Part.new
+ html_text_part = Mail::Part.new
+
+ no_content_type_part.content_type = nil
+ html_text_part.content_type = 'text/html'
+
+ p << no_content_type_part
+ p << plain_text_part
+ p << html_text_part
+ p.sort!(order).should eq [plain_text_part, html_text_part, no_content_type_part]
+ end
+end
\ No newline at end of file
diff --git a/spec/mail/utilities_spec.rb b/spec/mail/utilities_spec.rb
index 873345b..16eb383 100644
--- a/spec/mail/utilities_spec.rb
+++ b/spec/mail/utilities_spec.rb
@@ -83,6 +83,32 @@ describe "Utilities Module" do
end
+ if RUBY_VERSION >= '1.9'
+ describe "quoting phrases" do
+ describe "given a non-unsafe string" do
+ it "should not change the encoding" do
+ input_str = "blargh"
+ input_str_encoding = input_str.encoding
+
+ quote_phrase(input_str)
+
+ input_str.encoding.should eq input_str_encoding
+ end
+ end
+
+ describe "given an unsafe string" do
+ it "should not change the encoding" do
+ input_str = "Bjørn"
+ input_str_encoding = input_str.encoding
+
+ quote_phrase(input_str)
+
+ input_str.encoding.should eq input_str_encoding
+ end
+ end
+ end
+ end
+
describe "escaping parenthesies" do
it "should escape parens" do
test = 'This is not (escaped)'
diff --git a/spec/matchers_spec.rb b/spec/matchers_spec.rb
index dce53f1..d100308 100644
--- a/spec/matchers_spec.rb
+++ b/spec/matchers_spec.rb
@@ -7,6 +7,8 @@ describe "have_sent_email" do
Mail.deliver do
from 'phil at example.com'
to ['bob at example.com', 'fred at example.com']
+ cc ['dad at example.com', 'mom at example.com']
+ bcc ['alice at example.com', 'sue at example.com']
subject 'The facts you requested'
body 'Here are the facts you requested. One-onethousand, two-onethousand.'
end
@@ -71,6 +73,32 @@ describe "have_sent_email" do
end
end
+ context "with #cc" do
+ context "and a matching recipient" do
+ it { should have_sent_email.cc('mom at example.com') }
+ it { should have_sent_email.cc('dad at example.com') }
+ it { should have_sent_email.cc('mom at example.com').cc('dad at example.com') }
+ it { should have_sent_email.cc(['mom at example.com', 'dad at example.com']) }
+ end
+
+ context "and a non-matching recipient" do
+ it { should_not have_sent_email.cc('granny at example.com') }
+ end
+ end
+
+ context "with #bcc" do
+ context "and a matching recipient" do
+ it { should have_sent_email.bcc('alice at example.com') }
+ it { should have_sent_email.bcc('sue at example.com') }
+ it { should have_sent_email.bcc('alice at example.com').bcc('sue at example.com') }
+ it { should have_sent_email.bcc(['alice at example.com', 'sue at example.com']) }
+ end
+
+ context "and a non-matching recipient" do
+ it { should_not have_sent_email.bcc('mario at example.com') }
+ end
+ end
+
context "with #subject" do
context "and a matching subject" do
it { should have_sent_email.with_subject('The facts you requested') }
diff --git a/lib/tasks/corpus.rake b/tasks/corpus.rake
similarity index 97%
rename from lib/tasks/corpus.rake
rename to tasks/corpus.rake
index 7a8b418..39f80df 100644
--- a/lib/tasks/corpus.rake
+++ b/tasks/corpus.rake
@@ -1,7 +1,7 @@
namespace :corpus do
task :load_mail do
- require File.expand_path('../../../spec/environment')
+ require File.expand_path('../../spec/environment', __FILE__)
require 'mail'
end
diff --git a/tasks/ragel.rake b/tasks/ragel.rake
new file mode 100644
index 0000000..23f21ee
--- /dev/null
+++ b/tasks/ragel.rake
@@ -0,0 +1,54 @@
+require 'erb'
+
+MAIL_ROOT = File.expand_path("../..", __FILE__)
+require "#{MAIL_ROOT}/lib/mail/parsers/ragel/parser_info"
+
+namespace :ragel do
+ # Ruby Parsers
+ RB_DIR = "#{MAIL_ROOT}/lib/mail/parsers/ragel/ruby"
+ RB_RAGEL_TEMPLATE = "#{RB_DIR}/parser.rb.rl.erb"
+ def generate_rb_ragel_file(parser_name)
+ parser_name_cc = parser_name.gsub('parser','machine').split('_').map{|e| e.capitalize}.join + "Machine"
+ ragel_rb_source_template = ERB.new(IO.read(RB_RAGEL_TEMPLATE))
+ ragel_rb_source_template.result(binding)
+ end
+
+ RB_GEN_DIR = "#{RB_DIR}/machines"
+
+ directory RB_GEN_DIR
+
+ RB_ACTIONS = "#{RB_GEN_DIR}/rb_actions.rl"
+ file RB_ACTIONS do
+ actions = Mail::Parsers::Ragel::ACTIONS.each_with_index.map do |action,idx|
+ "action #{action} { actions.push(#{idx}, p) }"
+ end.join("\n")
+ actions_rl = "%%{\nmachine rb_actions;\n#{actions}\n}%%"
+ File.open(RB_ACTIONS,"w+") { |f| f.write actions_rl }
+ end
+
+ RB_RAGEL_PARSERS = []
+ Mail::Parsers::Ragel::FIELD_PARSERS.each do |p|
+ path = "#{RB_GEN_DIR}/#{p}_machine.rb.rl"
+ RB_RAGEL_PARSERS << path
+ file path do
+ File.open(path, "w+") { |f| f.write(generate_rb_ragel_file(p)) }
+ end
+ end
+ RB_RAGEL_FILES = [RB_GEN_DIR, RB_ACTIONS] + RB_RAGEL_PARSERS
+
+ task :generate_ragel_files => RB_RAGEL_FILES
+
+ RB_PARSERS = []
+ RB_RAGEL_PARSERS.each do |ragel_path|
+ path = ragel_path.gsub(".rl", "")
+ RB_PARSERS << path
+ file path do
+ `ragel -sR -F1 -o #{path} #{ragel_path}`
+ end
+ end
+
+ task :generate_ruby_parsers => RB_PARSERS
+
+ desc "Generate ruby parsers from ragel files"
+ task :generate => [:generate_ragel_files, :generate_ruby_parsers]
+end
diff --git a/test.rb b/test.rb
index c378edc..13ee382 100644
--- a/test.rb
+++ b/test.rb
@@ -1,6 +1,10 @@
require 'rubygems'
require 'mail'
-require 'ruby-debug'
+begin
+ require 'ruby-debug'
+rescue LoadError
+ STDERR.puts "Continuing without ruby-debug"
+end
smtp = { :address => 'mail.fiendz.org', :port => 587, :domain => 'fiendz.org', :user_name => 'test at fiendz.org', :password => 'foobar', :enable_starttls_auto => true, :openssl_verify_mode => 'none' }
Mail.defaults { delivery_method :smtp, smtp }
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ruby-extras/ruby-mail.git
More information about the Pkg-ruby-extras-commits
mailing list