[DRE-commits] [atig] 01/03: Imported Upstream version 0.4.5
Youhei SASAKI
uwabami-guest at moszumanska.debian.org
Fri Jun 27 09:23:57 UTC 2014
This is an automated email from the git hooks/post-receive script.
uwabami-guest pushed a commit to branch master
in repository atig.
commit b8270bd371d21abe4abaffe5fc814e49b9cde75b
Author: Youhei SASAKI <uwabami at gfd-dennou.org>
Date: Wed Jun 4 17:59:57 2014 +0900
Imported Upstream version 0.4.5
---
.travis.yml | 7 +
Gemfile | 2 +-
Gemfile.lock | 58 +-
README.mkdn | 9 +-
Rakefile | 10 +-
atig.gemspec | 13 +-
checksums.yaml.gz | Bin 0 -> 270 bytes
docs/OMakefile | 32 -
docs/OMakeroot | 45 -
docs/changelog.rst | 115 +-
docs/conf.py | 6 +-
docs/graphics.graffle | 1995 --------------------------
docs/index.rst | 6 +-
docs/options.rst | 19 +-
docs/quickstart.rst | 2 +-
lib/atig.rb | 2 -
lib/atig/agent.rb | 2 +-
lib/atig/agent/dm.rb | 1 +
lib/atig/agent/following.rb | 6 +-
lib/atig/agent/full_list.rb | 4 +-
lib/atig/agent/list.rb | 20 +-
lib/atig/agent/list_status.rb | 5 +-
lib/atig/agent/mention.rb | 7 +-
lib/atig/agent/noretweets.rb | 24 +
lib/atig/agent/other_list.rb | 18 -
lib/atig/agent/own_list.rb | 18 -
lib/atig/agent/timeline.rb | 14 +-
lib/atig/agent/user_stream.rb | 25 +-
lib/atig/basic_twitter.rb | 0
lib/atig/bitly.rb | 1 -
lib/atig/channel/list.rb | 5 +-
lib/atig/channel/timeline.rb | 6 +-
lib/atig/command/autofix.rb | 1 +
lib/atig/command/command.rb | 4 +-
lib/atig/command/destroy.rb | 2 +-
lib/atig/command/dm.rb | 2 +-
lib/atig/command/favorite.rb | 2 +-
lib/atig/command/status.rb | 14 +-
lib/atig/db/db.rb | 8 +-
lib/atig/db/sql.rb | 1 -
lib/atig/db/statuses.rb | 1 -
lib/atig/gateway.rb | 1 +
lib/atig/gateway/channel.rb | 1 +
lib/atig/gateway/session.rb | 62 +-
lib/atig/http.rb | 3 +-
lib/atig/ifilter/expand_url.rb | 62 +-
lib/atig/ifilter/sanitize.rb | 1 +
lib/atig/monkey.rb | 1 -
lib/atig/oauth.rb | 5 +-
lib/atig/ofilter/short_url.rb | 4 -
lib/atig/option.rb | 6 +-
lib/atig/optparse.rb | 6 +
lib/atig/search.rb | 3 +-
lib/atig/stream.rb | 50 +-
lib/atig/twitter.rb | 16 +-
lib/atig/unu.rb | 27 -
lib/atig/update_checker.rb | 17 +-
lib/atig/url_escape.rb | 2 +-
lib/atig/version.rb | 2 +-
metadata.yml | 103 +-
requirements.txt | 5 +
spec/command/autofix_spec.rb | 1 -
spec/command/destroy_spec.rb | 7 +-
spec/command/dm_spec.rb | 3 +-
spec/command/favorite_spec.rb | 13 +-
spec/command/limit_spec.rb | 7 +-
spec/command/location_spec.rb | 1 -
spec/command/name_spec.rb | 1 -
spec/command/option_spec.rb | 33 +-
spec/command/refresh_spec.rb | 1 -
spec/command/reply_spec.rb | 3 +-
spec/command/retweet_spec.rb | 9 +-
spec/command/spam_spec.rb | 1 -
spec/command/status_spec.rb | 23 +-
spec/command/thread_spec.rb | 7 +-
spec/command/time_spec.rb | 7 +-
spec/command/uptime_spec.rb | 1 -
spec/command/user_info_spec.rb | 9 +-
spec/command/user_spec.rb | 1 -
spec/command/version_spec.rb | 15 +-
spec/command/whois_spec.rb | 29 +-
{lib/atig/command => spec}/command_helper.rb | 8 +-
spec/db/followings_spec.rb | 8 +
spec/db/lists_spec.rb | 7 +-
spec/db/sized_uniq_array_spec.rb | 4 +-
spec/db/statuses_spec.rb | 4 +
spec/ifilter/expand_url_spec.rb | 56 +-
spec/ifilter/sid_spec.rb | 4 +-
spec/ifilter/tid_spec.rb | 4 +-
spec/ofilter/escape_url_spec.rb | 4 +-
spec/ofilter/short_url_spec.rb | 62 +-
spec/option_spec.rb | 2 +-
spec/spec_helper.rb | 31 +-
spec/update_checker_spec.rb | 22 +-
94 files changed, 703 insertions(+), 2574 deletions(-)
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..832662b
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,7 @@
+language: ruby
+rvm:
+ - 1.9.3
+ - 2.0.0
+ - 2.1.0
+
+script: bundle exec rake spec
diff --git a/Gemfile b/Gemfile
index a1b93f3..fa75df1 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,3 +1,3 @@
-source :rubygems
+source 'https://rubygems.org'
gemspec
diff --git a/Gemfile.lock b/Gemfile.lock
index d97380b..258c15f 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,34 +1,58 @@
PATH
remote: .
specs:
- atig (0.3.6)
- json
+ atig (0.4.4)
net-irc
oauth
- rake
sqlite3 (>= 1.3.2)
+ twitter-text (~> 1.7.0)
GEM
- remote: http://rubygems.org/
+ remote: https://rubygems.org/
specs:
- diff-lcs (1.1.3)
- json (1.7.3)
+ coveralls (0.7.0)
+ multi_json (~> 1.3)
+ rest-client
+ simplecov (>= 0.7)
+ term-ansicolor
+ thor
+ diff-lcs (1.2.5)
+ docile (1.1.2)
+ mime-types (2.0)
+ multi_json (1.8.4)
net-irc (0.0.9)
- oauth (0.4.6)
- rake (0.9.2.2)
- rspec (2.10.0)
- rspec-core (~> 2.10.0)
- rspec-expectations (~> 2.10.0)
- rspec-mocks (~> 2.10.0)
- rspec-core (2.10.0)
- rspec-expectations (2.10.0)
- diff-lcs (~> 1.1.3)
- rspec-mocks (2.10.1)
- sqlite3 (1.3.6)
+ oauth (0.4.7)
+ rest-client (1.6.7)
+ mime-types (>= 1.16)
+ rspec (2.14.1)
+ rspec-core (~> 2.14.0)
+ rspec-expectations (~> 2.14.0)
+ rspec-mocks (~> 2.14.0)
+ rspec-core (2.14.7)
+ rspec-expectations (2.14.4)
+ diff-lcs (>= 1.1.3, < 2.0)
+ rspec-mocks (2.14.4)
+ simplecov (0.8.2)
+ docile (~> 1.1.0)
+ multi_json
+ simplecov-html (~> 0.8.0)
+ simplecov-html (0.8.0)
+ sqlite3 (1.3.8)
+ term-ansicolor (1.2.2)
+ tins (~> 0.8)
+ thor (0.18.1)
+ tins (0.13.1)
+ twitter-text (1.7.0)
+ unf (~> 0.1.0)
+ unf (0.1.3)
+ unf_ext
+ unf_ext (0.0.6)
PLATFORMS
ruby
DEPENDENCIES
atig!
+ bundler
+ coveralls
rspec
diff --git a/README.mkdn b/README.mkdn
index 443542e..e83839c 100644
--- a/README.mkdn
+++ b/README.mkdn
@@ -10,9 +10,8 @@ Atig.rb is forked from cho45's tig.rb. We improve some features of tig.rb.
PREREQUISITES
-------------
-* Ruby 1.8 or 1.9
+* Ruby 1.9.3 or later
* sqlite3-ruby
-* json(when use Ruby 1.8)
* rspec(for unit test)
* rake(for unit test)
@@ -21,9 +20,9 @@ HOW TO USE
You type:
- $ cd atig
- $ ruby atig.rb -d
- I, [2010-04-05T07:22:07.861527 #62002] INFO -- : Host: localhost Port:16668
+ $ cd atig
+ $ bin/atig -d
+ I, [2010-04-05T07:22:07.861527 #62002] INFO -- : Host: localhost Port:16668
and access localhost:16668 by Irc client.
diff --git a/Rakefile b/Rakefile
index 3aa3141..97c068c 100644
--- a/Rakefile
+++ b/Rakefile
@@ -1,5 +1,4 @@
# -*- mode:ruby -*-
-require 'rubygems'
require 'rake'
require 'rake/clean'
require 'rspec/core/rake_task'
@@ -10,11 +9,18 @@ CLEAN.include(
)
CLOBBER.include(
- "pkg"
+ "pkg",
+ "coverage"
)
RSpec::Core::RakeTask.new do |t|
t.pattern = 'spec/**/*_spec.rb'
end
+desc "building document with sphinx"
+task :docs do
+ build_dir = "docs/_build"
+ `LC_CTYPE=C sphinx-build -b html -d #{build_dir}/doctrees -D latex_paper_size=a4 docs #{build_dir}/html`
+end
+
task :default => [:spec, :clean]
diff --git a/atig.gemspec b/atig.gemspec
index 073b86b..72e2cb3 100644
--- a/atig.gemspec
+++ b/atig.gemspec
@@ -2,8 +2,8 @@
require File.expand_path('../lib/atig/version', __FILE__)
Gem::Specification.new do |gem|
- gem.authors = ["SHIBATA Hiroshi"]
- gem.email = ["shibata.hiroshi at gmail.com"]
+ gem.authors = ["MIZUNO Hiroki", "SHIBATA Hiroshi", ]
+ gem.email = ["mzp at ocaml.jp", "shibata.hiroshi at gmail.com"]
gem.description = %q{Atig.rb is Twitter Irc Gateway.}
gem.summary = %q{Atig.rb is forked from cho45's tig.rb. We improve some features of tig.rb.}
gem.homepage = "https://github.com/mzp/atig"
@@ -15,11 +15,14 @@ Gem::Specification.new do |gem|
gem.require_paths = ["lib"]
gem.version = Atig::VERSION
+ gem.required_ruby_version = Gem::Requirement.new(">= 1.9.3")
+
gem.add_dependency 'sqlite3', ['>= 1.3.2']
gem.add_dependency 'net-irc', ['>= 0']
gem.add_dependency 'oauth', ['>= 0']
+ gem.add_dependency 'twitter-text', ['~> 1.7.0']
- gem.add_dependency 'rake', ['>= 0'] unless defined? Rake
- gem.add_dependency 'json', ['>= 0'] unless defined? JSON
- gem.add_development_dependency 'rspec', ['>= 0']
+ gem.add_development_dependency 'bundler'
+ gem.add_development_dependency 'rspec'
+ gem.add_development_dependency 'coveralls'
end
diff --git a/checksums.yaml.gz b/checksums.yaml.gz
new file mode 100644
index 0000000..6cf44aa
Binary files /dev/null and b/checksums.yaml.gz differ
diff --git a/docs/OMakefile b/docs/OMakefile
deleted file mode 100644
index 7795425..0000000
--- a/docs/OMakefile
+++ /dev/null
@@ -1,32 +0,0 @@
-# OMakefile for Sphinx documentation
-#
-
-# You can set these variables from the command line.
-SPHINXOPTS =
-SPHINXBUILD = sphinx-build
-PAPER =
-BUILDDIR = _build
-
-# Internal variables.
-PAPEROPT_a4 = -D latex_paper_size=a4
-ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_a4) $(SPHINXOPTS) .
-
-SRCS[] =
- index
- config
- options
- tiarra
- commandline_options
- commands
- quickstart
- feature
- irc
- changelog
- tig
-
-.PHONY : clean
-.DEFAULT: $(addsuffix .rst, $(SRCS))
- $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
-
-clean:
- rm -rf $(BUILDDIR)/html/* *~
\ No newline at end of file
diff --git a/docs/OMakeroot b/docs/OMakeroot
deleted file mode 100644
index 35c219d..0000000
--- a/docs/OMakeroot
+++ /dev/null
@@ -1,45 +0,0 @@
-########################################################################
-# Permission is hereby granted, free of charge, to any person
-# obtaining a copy of this file, to deal in the File without
-# restriction, including without limitation the rights to use,
-# copy, modify, merge, publish, distribute, sublicense, and/or
-# sell copies of the File, and to permit persons to whom the
-# File is furnished to do so, subject to the following condition:
-#
-# THE FILE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE FILE OR
-# THE USE OR OTHER DEALINGS IN THE FILE.
-
-########################################################################
-# The standard OMakeroot file.
-# You will not normally need to modify this file.
-# By default, your changes should be placed in the
-# OMakefile in this directory.
-#
-# If you decide to modify this file, note that it uses exactly
-# the same syntax as the OMakefile.
-#
-
-#
-# Include the standard installed configuration files.
-# Any of these can be deleted if you are not using them,
-# but you probably want to keep the Common file.
-#
-open build/C
-open build/OCaml
-open build/LaTeX
-
-#
-# The command-line variables are defined *after* the
-# standard configuration has been loaded.
-#
-DefineCommandVars()
-
-#
-# Include the OMakefile in this directory.
-#
-.SUBDIRS: .
diff --git a/docs/changelog.rst b/docs/changelog.rst
index ab749c6..ecccbc8 100644
--- a/docs/changelog.rst
+++ b/docs/changelog.rst
@@ -1,6 +1,110 @@
更新履歴
==============
+v0.4.4(2013-12-29)
+------------------------------
+http://github.com/mzp/atig/tree/v0.4.4
+
+機能変更
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ - サポート対象を Ruby 1.9.3 以降にしました
+ - follower 取得時の1回の取得数を100件に拡張しました
+
+ v0.4.3(2013-10-18)
+------------------------------
+http://github.com/mzp/atig/tree/v0.4.3
+
+不具合修正
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ - 短縮 URL の展開が動かない問題を修正しました
+
+v0.4.2(2013-10-13)
+------------------------------
+http://github.com/mzp/atig/tree/v0.4.2
+
+機能変更
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ - タイムラインの取得間隔を 1 分にしました
+
+v0.4.1(2013-08-02)
+------------------------------
+http://github.com/mzp/atig/tree/v0.4.1
+
+不具合修正
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ - '&' が置換されない問題を修正しました
+ - reply が取得できない不具合を修正しました
+ - list の追加・削除 API が 1.0 のままだった問題を修正しました
+
+v0.4.0(2013-06-12)
+------------------------------
+http://github.com/mzp/atig/tree/v0.4.0
+
+機能変更
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ - Twitter API 1.1に対応しました
+
+v0.3.12(2013-04-02)
+------------------------------
+http://github.com/mzp/atig/tree/v0.3.12
+
+機能追加
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ - v0.3.10-11 で --tmpdir オプションが動作していない不具合を直しました
+
+v0.3.11(2013-04-02)
+------------------------------
+http://github.com/mzp/atig/tree/v0.3.11
+
+機能追加
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ - v0.3.10 で起動できない不具合を直しました
+
+ v0.3.10(2013-04-02)
+------------------------------
+http://github.com/mzp/atig/tree/v0.3.10
+
+機能追加
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ - 一時ファイルの作成先を指定することができる --tmpdir オプションを追加しました
+
+v0.3.9(2013-03-01)
+------------------------------
+http://github.com/mzp/atig/tree/v0.3.9
+
+バグ修正
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ - Ruby 2.0 以降で動かした場合に Twitter のレスポンスを取得出来ない不具合を修正しました
+
+v0.3.8(2013-02-03)
+------------------------------
+http://github.com/mzp/atig/tree/v0.3.8
+
+機能変更
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ - atig を rubygems からインストールしている場合はバージョンアップのチェックを行わないようにしました
+
+v0.3.7(2013-01-27)
+------------------------------
+http://github.com/mzp/atig/tree/v0.3.7
+
+機能追加
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ - Twitter の Userstream に対応しました
+
+バグ修正
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ - Ruby 2.0.0(r38955) で動かない問題を直しました
+ - github の API の変更によりバージョンチェックが動かない問題を直しました
+
+ v0.3.6(2012-05-14)
+------------------------------
+http://github.com/mzp/atig/tree/v0.3.6
+
+機能変更
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ - Ruby 2.0.0 以降で iconv ライブラリが削除されることに伴う UTF7 サポートの終了
+
v0.3.5(2012-05-07)
------------------------------
http://github.com/mzp/atig/tree/v0.3.5
@@ -96,8 +200,6 @@ http://github.com/mzp/atig/tree/v0.3.0
バグ修正
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-
v0.2.1(2010-04-17)
------------------------------
http://github.com/mzp/atig/tree/v0.2.1
@@ -108,9 +210,9 @@ http://github.com/mzp/atig/tree/v0.2.1
- :doc:`irc`: `/topic` が `/me autofix` のエイリアスになりました。
- 最新の発言を削除した場合、トピック(topic)をひとつ前に戻すようにした
-v0.2(2010-04-11)
+v0.2.0(2010-04-11)
------------------------------
-http://github.com/mzp/atig/tree/v0.2
+http://github.com/mzp/atig/tree/v0.2.0
機能追加
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -123,10 +225,9 @@ http://github.com/mzp/atig/tree/v0.2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- followingの取得時にSSL Verified Errorが発生する不具合を修正
-v0.1
+v0.1.0(2010-04-11)
------------------------------
-http://github.com/mzp/atig/tree/v0.1
+http://github.com/mzp/atig/tree/v0.1.0
- 最初のリリース
-
diff --git a/docs/conf.py b/docs/conf.py
index a291f84..9f06013 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -38,16 +38,16 @@ master_doc = 'index'
# General information about the project.
project = u'atig.rb'
-copyright = u'2010, mzp'
+copyright = u'2010-2013, mzp'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
-version = '0.3'
+version = '0.4'
# The full version, including alpha/beta/rc tags.
-release = '0.3.2'
+release = '0.4.3'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
diff --git a/docs/graphics.graffle b/docs/graphics.graffle
deleted file mode 100644
index 772ad0f..0000000
--- a/docs/graphics.graffle
+++ /dev/null
@@ -1,1995 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>ActiveLayerIndex</key>
- <integer>0</integer>
- <key>ApplicationVersion</key>
- <array>
- <string>com.omnigroup.OmniGrafflePro</string>
- <string>138.12.0.121252</string>
- </array>
- <key>AutoAdjust</key>
- <true/>
- <key>BackgroundGraphic</key>
- <dict>
- <key>Bounds</key>
- <string>{{0, 0}, {559.28, 782.89}}</string>
- <key>Class</key>
- <string>SolidGraphic</string>
- <key>ID</key>
- <integer>2</integer>
- <key>Style</key>
- <dict>
- <key>shadow</key>
- <dict>
- <key>Draws</key>
- <string>NO</string>
- </dict>
- <key>stroke</key>
- <dict>
- <key>Draws</key>
- <string>NO</string>
- </dict>
- </dict>
- </dict>
- <key>CanvasOrigin</key>
- <string>{0, 0}</string>
- <key>ColumnAlign</key>
- <integer>1</integer>
- <key>ColumnSpacing</key>
- <real>36</real>
- <key>CreationDate</key>
- <string>2010-03-18 20:50:16 +0900</string>
- <key>Creator</key>
- <string>mzp</string>
- <key>DisplayScale</key>
- <string>1 0/72 in = 1 0/72 in</string>
- <key>GraphDocumentVersion</key>
- <integer>6</integer>
- <key>GraphicsList</key>
- <array>
- <dict>
- <key>Class</key>
- <string>LineGraphic</string>
- <key>Head</key>
- <dict>
- <key>ID</key>
- <integer>6</integer>
- <key>Info</key>
- <integer>7</integer>
- </dict>
- <key>ID</key>
- <integer>75</integer>
- <key>Points</key>
- <array>
- <string>{204.96, 193.047}</string>
- <string>{204.875, 165.995}</string>
- </array>
- <key>Style</key>
- <dict>
- <key>stroke</key>
- <dict>
- <key>HeadArrow</key>
- <string>FilledArrow</string>
- <key>LineType</key>
- <integer>1</integer>
- <key>TailArrow</key>
- <string>0</string>
- </dict>
- </dict>
- <key>Tail</key>
- <dict>
- <key>ID</key>
- <integer>58</integer>
- </dict>
- </dict>
- <dict>
- <key>Class</key>
- <string>LineGraphic</string>
- <key>Head</key>
- <dict>
- <key>ID</key>
- <integer>8</integer>
- </dict>
- <key>ID</key>
- <integer>74</integer>
- <key>Points</key>
- <array>
- <string>{180.298, 297.273}</string>
- <string>{126.535, 270.181}</string>
- </array>
- <key>Style</key>
- <dict>
- <key>stroke</key>
- <dict>
- <key>HeadArrow</key>
- <string>FilledArrow</string>
- <key>LineType</key>
- <integer>1</integer>
- <key>TailArrow</key>
- <string>0</string>
- </dict>
- </dict>
- <key>Tail</key>
- <dict>
- <key>ID</key>
- <integer>55</integer>
- </dict>
- </dict>
- <dict>
- <key>Class</key>
- <string>LineGraphic</string>
- <key>Head</key>
- <dict>
- <key>ID</key>
- <integer>58</integer>
- </dict>
- <key>ID</key>
- <integer>73</integer>
- <key>Points</key>
- <array>
- <string>{205, 296.998}</string>
- <string>{205, 218.492}</string>
- </array>
- <key>Style</key>
- <dict>
- <key>stroke</key>
- <dict>
- <key>HeadArrow</key>
- <string>FilledArrow</string>
- <key>LineType</key>
- <integer>1</integer>
- <key>TailArrow</key>
- <string>0</string>
- </dict>
- </dict>
- <key>Tail</key>
- <dict>
- <key>ID</key>
- <integer>55</integer>
- </dict>
- </dict>
- <dict>
- <key>Class</key>
- <string>LineGraphic</string>
- <key>Head</key>
- <dict>
- <key>ID</key>
- <integer>55</integer>
- </dict>
- <key>ID</key>
- <integer>72</integer>
- <key>Points</key>
- <array>
- <string>{204.627, 400.948}</string>
- <string>{204.948, 322.443}</string>
- </array>
- <key>Style</key>
- <dict>
- <key>stroke</key>
- <dict>
- <key>HeadArrow</key>
- <string>FilledArrow</string>
- <key>LineType</key>
- <integer>1</integer>
- <key>TailArrow</key>
- <string>0</string>
- </dict>
- </dict>
- <key>Tail</key>
- <dict>
- <key>ID</key>
- <integer>9</integer>
- <key>Info</key>
- <integer>3</integer>
- </dict>
- </dict>
- <dict>
- <key>Class</key>
- <string>LineGraphic</string>
- <key>Head</key>
- <dict>
- <key>ID</key>
- <integer>9</integer>
- <key>Info</key>
- <integer>1</integer>
- </dict>
- <key>ID</key>
- <integer>67</integer>
- <key>Points</key>
- <array>
- <string>{101.593, 372.469}</string>
- <string>{102.361, 400.948}</string>
- </array>
- <key>Style</key>
- <dict>
- <key>stroke</key>
- <dict>
- <key>HeadArrow</key>
- <string>FilledArrow</string>
- <key>LineType</key>
- <integer>1</integer>
- <key>TailArrow</key>
- <string>0</string>
- </dict>
- </dict>
- <key>Tail</key>
- <dict>
- <key>ID</key>
- <integer>57</integer>
- </dict>
- </dict>
- <dict>
- <key>Class</key>
- <string>LineGraphic</string>
- <key>Head</key>
- <dict>
- <key>ID</key>
- <integer>57</integer>
- </dict>
- <key>ID</key>
- <integer>66</integer>
- <key>Points</key>
- <array>
- <string>{101.436, 322.434}</string>
- <string>{101.311, 347.025}</string>
- </array>
- <key>Style</key>
- <dict>
- <key>stroke</key>
- <dict>
- <key>HeadArrow</key>
- <string>FilledArrow</string>
- <key>LineType</key>
- <integer>1</integer>
- <key>TailArrow</key>
- <string>0</string>
- </dict>
- </dict>
- <key>Tail</key>
- <dict>
- <key>ID</key>
- <integer>56</integer>
- </dict>
- </dict>
- <dict>
- <key>Class</key>
- <string>LineGraphic</string>
- <key>Head</key>
- <dict>
- <key>ID</key>
- <integer>8</integer>
- </dict>
- <key>ID</key>
- <integer>65</integer>
- <key>Points</key>
- <array>
- <string>{101.623, 296.989}</string>
- <string>{101.88, 270.454}</string>
- </array>
- <key>Style</key>
- <dict>
- <key>stroke</key>
- <dict>
- <key>HeadArrow</key>
- <string>FilledArrow</string>
- <key>LineType</key>
- <integer>1</integer>
- <key>TailArrow</key>
- <string>0</string>
- </dict>
- </dict>
- <key>Tail</key>
- <dict>
- <key>ID</key>
- <integer>56</integer>
- </dict>
- </dict>
- <dict>
- <key>Class</key>
- <string>LineGraphic</string>
- <key>Head</key>
- <dict>
- <key>ID</key>
- <integer>8</integer>
- </dict>
- <key>ID</key>
- <integer>63</integer>
- <key>Points</key>
- <array>
- <string>{102.19, 218.475}</string>
- <string>{102.063, 245.009}</string>
- </array>
- <key>Style</key>
- <dict>
- <key>stroke</key>
- <dict>
- <key>HeadArrow</key>
- <string>FilledArrow</string>
- <key>LineType</key>
- <integer>1</integer>
- <key>TailArrow</key>
- <string>0</string>
- </dict>
- </dict>
- <key>Tail</key>
- <dict>
- <key>ID</key>
- <integer>59</integer>
- </dict>
- </dict>
- <dict>
- <key>Class</key>
- <string>LineGraphic</string>
- <key>Head</key>
- <dict>
- <key>ID</key>
- <integer>59</integer>
- </dict>
- <key>ID</key>
- <integer>62</integer>
- <key>Points</key>
- <array>
- <string>{102.625, 165.995}</string>
- <string>{102.37, 193.03}</string>
- </array>
- <key>Style</key>
- <dict>
- <key>stroke</key>
- <dict>
- <key>HeadArrow</key>
- <string>FilledArrow</string>
- <key>LineType</key>
- <integer>1</integer>
- <key>TailArrow</key>
- <string>FilledArrow</string>
- </dict>
- </dict>
- <key>Tail</key>
- <dict>
- <key>ID</key>
- <integer>6</integer>
- <key>Info</key>
- <integer>9</integer>
- </dict>
- </dict>
- <dict>
- <key>Class</key>
- <string>LineGraphic</string>
- <key>Head</key>
- <dict>
- <key>ID</key>
- <integer>5</integer>
- </dict>
- <key>ID</key>
- <integer>61</integer>
- <key>Points</key>
- <array>
- <string>{153.75, 141.55}</string>
- <string>{153.75, 111.497}</string>
- </array>
- <key>Style</key>
- <dict>
- <key>stroke</key>
- <dict>
- <key>HeadArrow</key>
- <string>FilledArrow</string>
- <key>LineType</key>
- <integer>1</integer>
- <key>TailArrow</key>
- <string>0</string>
- </dict>
- </dict>
- <key>Tail</key>
- <dict>
- <key>ID</key>
- <integer>6</integer>
- </dict>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{51.25, 193.53}, {102, 24.445}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>ID</key>
- <integer>59</integer>
- <key>Shape</key>
- <string>Rectangle</string>
- <key>Text</key>
- <dict>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf250
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs24 \cf0 Agent}</string>
- </dict>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{157, 193.547}, {96, 24.445}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>ID</key>
- <integer>58</integer>
- <key>Shape</key>
- <string>Rectangle</string>
- <key>Text</key>
- <dict>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf250
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs24 \cf0 OFilter}</string>
- </dict>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{51.5, 347.525}, {99.5, 24.445}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>ID</key>
- <integer>57</integer>
- <key>Shape</key>
- <string>Rectangle</string>
- <key>Text</key>
- <dict>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf250
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs24 \cf0 IFilter}</string>
- </dict>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{50.5, 297.489}, {102, 24.445}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>ID</key>
- <integer>56</integer>
- <key>Shape</key>
- <string>Rectangle</string>
- <key>Text</key>
- <dict>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf250
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs24 \cf0 Channel}</string>
- </dict>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{157, 297.498}, {96, 24.445}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>ID</key>
- <integer>55</integer>
- <key>Shape</key>
- <string>Rectangle</string>
- <key>Text</key>
- <dict>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf250
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs24 \cf0 Command}</string>
- </dict>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{105.75, 15}, {96, 41}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>ID</key>
- <integer>11</integer>
- <key>Shape</key>
- <string>Circle</string>
- <key>Style</key>
- <dict/>
- <key>Text</key>
- <dict>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf250
-{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs24 \cf0 Twitter}</string>
- </dict>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{105.75, 459.464}, {96, 41}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>ID</key>
- <integer>10</integer>
- <key>Shape</key>
- <string>Circle</string>
- <key>Style</key>
- <dict/>
- <key>Text</key>
- <dict>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf250
-{\fonttbl\f0\fnil\fcharset128 HiraKakuProN-W3;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs24 \cf0 \'83\'86\'81\'5b\'83\'55}</string>
- </dict>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{51.25, 401.448}, {204.5, 24.445}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>ID</key>
- <integer>9</integer>
- <key>Magnets</key>
- <array>
- <string>{-0.596285, -1.19257}</string>
- <string>{1.58946e-07, -1.33333}</string>
- <string>{0.596285, -1.19257}</string>
- <string>{1.19257, -0.596285}</string>
- <string>{1.33333, 0}</string>
- <string>{1.19257, 0.596281}</string>
- <string>{0.596285, 1.19257}</string>
- <string>{1.58946e-07, 1.33333}</string>
- <string>{-0.596285, 1.19257}</string>
- <string>{-1.19257, 0.596281}</string>
- <string>{-1.33333, 0}</string>
- <string>{-1.19257, -0.596285}</string>
- </array>
- <key>Shape</key>
- <string>Rectangle</string>
- <key>Text</key>
- <dict>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf250
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs24 \cf0 Gateway}</string>
- </dict>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{50.5, 245.509}, {103, 24.445}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>ID</key>
- <integer>8</integer>
- <key>Shape</key>
- <string>Rectangle</string>
- <key>Text</key>
- <dict>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf250
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs24 \cf0 DB}</string>
- </dict>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{51.5, 141.55}, {204.5, 24.445}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>ID</key>
- <integer>6</integer>
- <key>Magnets</key>
- <array>
- <string>{-0.596284, -1.19257}</string>
- <string>{1.58946e-07, -1.33333}</string>
- <string>{0.596284, -1.19257}</string>
- <string>{1.19257, -0.596286}</string>
- <string>{1.33333, 0}</string>
- <string>{1.19257, 0.596285}</string>
- <string>{0.596285, 1.19257}</string>
- <string>{1.58946e-07, 1.33333}</string>
- <string>{-0.25, 0.5}</string>
- <string>{-1.19257, 0.596285}</string>
- <string>{-1.33333, 0}</string>
- <string>{-1.19257, -0.596286}</string>
- </array>
- <key>Shape</key>
- <string>Rectangle</string>
- <key>Text</key>
- <dict>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf250
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs24 \cf0 Scheduler}</string>
- </dict>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{51.5, 86.5525}, {204.5, 24.445}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>ID</key>
- <integer>5</integer>
- <key>Shape</key>
- <string>Rectangle</string>
- <key>Text</key>
- <dict>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg932\cocoartf1038\cocoasubrtf250
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
-
-\f0\fs24 \cf0 Twitter}</string>
- </dict>
- </dict>
- </array>
- <key>GridInfo</key>
- <dict/>
- <key>GuidesLocked</key>
- <string>NO</string>
- <key>GuidesVisible</key>
- <string>YES</string>
- <key>HPages</key>
- <integer>1</integer>
- <key>ImageCounter</key>
- <integer>1</integer>
- <key>KeepToScale</key>
- <false/>
- <key>Layers</key>
- <array>
- <dict>
- <key>Lock</key>
- <string>NO</string>
- <key>Name</key>
- <string>レイヤー 1</string>
- <key>Print</key>
- <string>YES</string>
- <key>View</key>
- <string>YES</string>
- </dict>
- </array>
- <key>LayoutInfo</key>
- <dict>
- <key>Animate</key>
- <string>NO</string>
- <key>circoMinDist</key>
- <real>18</real>
- <key>circoSeparation</key>
- <real>0.0</real>
- <key>layoutEngine</key>
- <string>dot</string>
- <key>neatoSeparation</key>
- <real>0.0</real>
- <key>twopiSeparation</key>
- <real>0.0</real>
- </dict>
- <key>LinksVisible</key>
- <string>NO</string>
- <key>MagnetsVisible</key>
- <string>NO</string>
- <key>MasterSheets</key>
- <array/>
- <key>ModificationDate</key>
- <string>2010-03-19 07:05:00 +0900</string>
- <key>Modifier</key>
- <string>mzp</string>
- <key>NotesVisible</key>
- <string>NO</string>
- <key>Orientation</key>
- <integer>2</integer>
- <key>OriginVisible</key>
- <string>NO</string>
- <key>PageBreaks</key>
- <string>YES</string>
- <key>PrintInfo</key>
- <dict>
- <key>NSBottomMargin</key>
- <array>
- <string>float</string>
- <string>41</string>
- </array>
- <key>NSLeftMargin</key>
- <array>
- <string>float</string>
- <string>18</string>
- </array>
- <key>NSPaperName</key>
- <array>
- <string>string</string>
- <string>A4</string>
- </array>
- <key>NSPaperSize</key>
- <array>
- <string>size</string>
- <string>{595.28, 841.89}</string>
- </array>
- <key>NSRightMargin</key>
- <array>
- <string>float</string>
- <string>18</string>
- </array>
- <key>NSTopMargin</key>
- <array>
- <string>float</string>
- <string>18</string>
- </array>
- </dict>
- <key>PrintOnePage</key>
- <false/>
- <key>QuickLookPreview</key>
- <data>
- JVBERi0xLjMKJcTl8uXrp/Og0MTGCjUgMCBvYmoKPDwgL0xlbmd0aCA2IDAgUiAvRmls
- dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGVmUtvHMcRx+/zKfpIHTTq9wMIAsR0
- HFiXxCaBHIIcmM0qokBKMUXHyLfPr3qmZ3p39qFgQXBZ6nr/q7qq9Yv6Sf2iNJ8QtUrZ
- qZe9+qv6rN7dfjVq91WZ+vm6U2/1GJQeoy4lB69CKKPNcNgxF5iGD+rdX/Yvu/2/X399
- eFIvj4i1NlXRPikv3DHE0fsU1O5Zvfvx2ajvv1T1m3PajD5oMxydMxYL+CDPFeT5kkZf
- dJrl2dPyYHLejCGYtBFochUYnSp+xDAb0xhc9LNE1ySa44PJ2FnY5gzWGR+V92EM2hLE
- 6qxfRFl/6IScM83XsB6z7ViNnSthJHTNsricmy2btQZfCJ2Ns3GntCKOkNSDSTd5s953
- P++fHl4f/7O//fL05eXxef/68rgbSGYggComO2pto7La86f1ZNOXIJD5AEze8/NpAs7t
- XTVeq7tbcGDqH2/lFwgT06q4HEmK9eWEuDtwAQKtIFAr0NcJMcFJqmL2o7VBpH13r8wU
- rbf8fmvSGJPJWXl1T+x/MKPGhPsP6ub+jbr/pP54X1G3WHVSoMZTbdX97lC0HoG/BnrH
- on97fH3dv6zypX6Gvn6mCGKb1sH0LgP0KYKdj1MptkAZga8vx4EaiPu3BMpSqXaquqNI
- WawxKRCp4TBSf1M3d7uPb6TorbrZty//bF9+bV+e2pflzMub4e/q/v0U5U0XCdIHgnGj
- 9oE60W5C0dkYVLAIj63lVFzPkyRuFyNABoMNo425livun85rHp3zJZptXr//7jCnIHJY
- eiI5le4S0mh0TP9PUmHz0uU8HberJml613wC/uiMZXS2UCAV/uTpFFytoxJScpv83vzp
- 4XX/28N/N75RKPKh4kymjIoxyoHZ4Ghkz1hKA3fRDU7Tfy19slGULVSzj2HlszlD0Vkh
- K+ax+ACAM7l0HHL8W/DUwUQYjClj1twkPRcB0tER10V2oyz6F75m5YC2JtyR+uBSWfWv
- lI13O3rYcQUK+pY44NzoI9LWOHATObqyk444RUZ5upqvLjYNnqsF3wHgagcXA7K6OCyE
- FofGJdFrXjfZw0pp+pc4LFZ2caDU0EYGlzw0yrD1bne5oqbm6zQVPN+TRz0FtGSr7NRQ
- 7ChoovX+Tru9/f2F7ntBYhy547YCbfHa/aMTumk2i3MpGvo2DWdN3ZDwpOTaVOfUJdqs
- JrRrypPDTe1dD+HEtScj0AKzYaW05PV8LXmr9IXSLGjJGxY7u+SlJLVt0NeKaKU0iHV8
- V0BscRGHXBcJykvcZoxaQUy4CA3NtmlgrCCAkQlqtSNkMYxRZym4ldIi0fgOYDxLX2G8
- WNAioRY7u0gYWwPvVwsaZYVxx3fxYphgnDytbW6h/QRhufYMzW0DYu3CJRCfk8d9FzRN
- YisvZNLxwEgQph8f+e1WHVtMg2IPnHVIRhVkyhA2Xxvb3ItvBg5bJ2V6V8dx7fK0MubQ
- X2wqdZw8qnNmh5j4bK5MZofbNhV8aV+enx+mr8PN50Zjmrg2KVRPIwjjIm+enh6W1kFB
- XOUiOWa5CAdKcnY25zZSnrlS7eiC5irbTIC3Hx8+f94zELUR8/QI6A3JcwzeRVaYy05J
- +urc6ASollI7YLo6KuCWDBqMATbYcnlWoMMcT4E3P/7w+LSZag+2QgFX4GKkfWDcAsck
- pp2HoykUhE/EYOX4FjiGlEbrpsUQOJ6ZergtNsn58xlPjme56otlzTqGz2lnpgGwusOQ
- csB0PTm27mHikqcyp0Gu70ImUGElArXtdP6Hf7UqWgbvpa5e+7o6OdJM3W9ZK6RH1J3K
- 0D5dYVV4akNAfQOQnbtuYW1TYviMmt1LGHVdxuhIQoHRsOTLerZSPjbxcebj8vmAwPf8
- fDo9c83m0DerOYuezsBZT0dZ9JiZD/uk6ttmehyK2hwZxAKzo2IN4iHDB2wj9YxLDgxk
- Nxrgpp6GKge6y6QqFDPmxO4iZ2Uo5D4NVGb2JhIBvkEK7DlCK0xDTwrbZu6h4z4fhWZb
- 1WfQZ2jhvb5qW8h+6PRVmgb+vT7VcTcvok5WRfCF+Rap0lWcyWbgH/DYiQTxDGJUQtMJ
- hib1mPtkaXC5WyABm+FNhcjmTs8U7RhF5qJHMlAsb0oHehr3N+bSZN4jrMlM5XTLKZcG
- Fco68bb4LpcYxzsWL0lZ3pCmXHIWGt02Jx6FamyFRM6hFfnSrBPuoeO+nsuqz3owpRmt
- On3VNuvSlMtJn9B04aWg18d1sXBfQXYdrqJlu2R5Ypir+szI+wuzNEuXCzXLEyKAc6Tz
- BMP7nuc5AERkOUpLk8UkpmCxjTgIkYYvNLMgYst9MRbVsqrP8p7kgq8IbPqqbRa0dPoq
- LS/ImPU17m9CBqs2a7pyltKmsiX4tLrIkOcckKcDo/BuoFkI3WqaLvQsD25y1stZ1mge
- IXKUhiABquyVVADYlKcjZmy7GItVnUM0ZkyYndVV0xwryqJuqCRwcaiuY74Ci6owFGcG
- R/B9pCDEP971CmuOo9HQEcS/1iocDwC0wRJY5CfIAl7LSVjY1cU01ofCLj8Id+YZpCH2
- kPVaHIACqkSYZ1c+UMWjG++tnapqKH3qQNXMipUHMeCGl9urvT5KY5UHl8jbtNdIlheY
- iUQX4GHFYYivWBMxcpQ90yrKYowhiWUWiNSzzN0jd5okw9IkVxrXiARhw4yiLgxnLKvq
- HINhNaNTV01zFWqLukoLgers1HXMB6HgJtyGgtYoHaLMDxsyyjFg0Ye5eumPExLYBSqd
- Wa92dYGpFdRwlv8KIJwy/0kYZCc8oA1i2Ja7i8NpsyY5llWs2rHq621b9HX2dvo67kuB
- mJ552PlKZuljf6C11IZJD3ZJ1qeEhy6Ih1UOwbGOgZl3+7HQMYmGcZ6CCGlgORhjDoJN
- 4xiFLP1UzrF1z1V7gvt8NKptjcMm2R2YLFZ92JaonNq/Fn1yjm39UN/QcV+KRqsQmWeZ
- 07XM6RJ9CkFzY8+DUgFyIkXoOZs2TdSTUh6crIODvLq08uB9VWjGdPUB7zBPIvCej0Oz
- SnRNM4FEYSrF2SquZ4dVU22gq1qaiVYrjkNesf6n/wGiTI7aCmVuZHN0cmVhbQplbmRv
- YmoKNiAwIG9iagoyMzA0CmVuZG9iagozIDAgb2JqCjw8IC9UeXBlIC9QYWdlIC9QYXJl
- bnQgNCAwIFIgL1Jlc291cmNlcyA3IDAgUiAvQ29udGVudHMgNSAwIFIgL01lZGlhQm94
- IFswIDAgNTYwIDc4M10KPj4KZW5kb2JqCjcgMCBvYmoKPDwgL1Byb2NTZXQgWyAvUERG
- IC9UZXh0IC9JbWFnZUIgL0ltYWdlQyAvSW1hZ2VJIF0gL0NvbG9yU3BhY2UgPDwgL0Nz
- MiAyMSAwIFIKL0NzMSA4IDAgUiA+PiAvRm9udCA8PCAvRjEuMCAyMiAwIFIgL0YyLjEg
- MjMgMCBSID4+IC9YT2JqZWN0IDw8IC9JbTMgMTMgMCBSCi9JbTYgMTkgMCBSIC9JbTIg
- MTEgMCBSIC9JbTEgOSAwIFIgL0ltNCAxNSAwIFIgL0ltNSAxNyAwIFIgPj4gPj4KZW5k
- b2JqCjEzIDAgb2JqCjw8IC9MZW5ndGggMTQgMCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0
- eXBlIC9JbWFnZSAvV2lkdGggMjM2IC9IZWlnaHQgMTI2IC9JbnRlcnBvbGF0ZQp0cnVl
- IC9Db2xvclNwYWNlIDI1IDAgUiAvSW50ZW50IC9QZXJjZXB0dWFsIC9TTWFzayAyNiAw
- IFIgL0JpdHNQZXJDb21wb25lbnQKOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJl
- YW0KeAHt0AENAAAAwqD3T20PBxEoDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
- YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
- DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
- AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
- YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
- DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
- AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
- YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
- HgYGXIcAAQplbmRzdHJlYW0KZW5kb2JqCjE0IDAgb2JqCjQxMgplbmRvYmoKMTkgMCBv
- YmoKPDwgL0xlbmd0aCAyMCAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdl
- IC9XaWR0aCAyNDQgL0hlaWdodCA5NCAvSW50ZXJwb2xhdGUKdHJ1ZSAvQ29sb3JTcGFj
- ZSAyNSAwIFIgL0ludGVudCAvUGVyY2VwdHVhbCAvU01hc2sgMjggMCBSIC9CaXRzUGVy
- Q29tcG9uZW50CjggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB7dABDQAA
- AMKg909tDjeIQGHAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
- BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
- gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
- MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
- BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
- gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
- MGDgb2AM1wABCmVuZHN0cmVhbQplbmRvYmoKMjAgMCBvYmoKMzIzCmVuZG9iagoxMSAw
- IG9iago8PCAvTGVuZ3RoIDEyIDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1h
- Z2UgL1dpZHRoIDI1MCAvSGVpZ2h0IDk0IC9JbnRlcnBvbGF0ZQp0cnVlIC9Db2xvclNw
- YWNlIDI1IDAgUiAvSW50ZW50IC9QZXJjZXB0dWFsIC9TTWFzayAzMCAwIFIgL0JpdHNQ
- ZXJDb21wb25lbnQKOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHt0DEB
- AAAAwqD1T20IX4hAYcCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
- AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
- YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
- DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
- AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
- YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
- DBgwYMCAAQMGDBgw8A4ME3MAAQplbmRzdHJlYW0KZW5kb2JqCjEyIDAgb2JqCjMzMQpl
- bmRvYmoKOSAwIG9iago8PCAvTGVuZ3RoIDEwIDAgUiAvVHlwZSAvWE9iamVjdCAvU3Vi
- dHlwZSAvSW1hZ2UgL1dpZHRoIDQ1NCAvSGVpZ2h0IDk0IC9JbnRlcnBvbGF0ZQp0cnVl
- IC9Db2xvclNwYWNlIDI1IDAgUiAvSW50ZW50IC9QZXJjZXB0dWFsIC9TTWFzayAzMiAw
- IFIgL0JpdHNQZXJDb21wb25lbnQKOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJl
- YW0KeAHt0DEBAAAAwqD1T20Hb4hAYcCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
- AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
- YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
- DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
- AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
- YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
- DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
- AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
- YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
- DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
- AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
- YMCAAQMGDBgwYMCAAQMGDBj4Bwb0KwABCmVuZHN0cmVhbQplbmRvYmoKMTAgMCBvYmoK
- NTgyCmVuZG9iagoxNSAwIG9iago8PCAvTGVuZ3RoIDE2IDAgUiAvVHlwZSAvWE9iamVj
- dCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDIzNiAvSGVpZ2h0IDk0IC9JbnRlcnBvbGF0
- ZQp0cnVlIC9Db2xvclNwYWNlIDI1IDAgUiAvSW50ZW50IC9QZXJjZXB0dWFsIC9TTWFz
- ayAzNCAwIFIgL0JpdHNQZXJDb21wb25lbnQKOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+
- PgpzdHJlYW0KeAHt0IEAAAAAw6D5Ux/khVBhwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
- GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
- AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
- wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
- GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
- AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
- wIABAwYMGDDwODAEBwABCmVuZHN0cmVhbQplbmRvYmoKMTYgMCBvYmoKMzEyCmVuZG9i
- agoxNyAwIG9iago8PCAvTGVuZ3RoIDE4IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlw
- ZSAvSW1hZ2UgL1dpZHRoIDI0OCAvSGVpZ2h0IDk0IC9JbnRlcnBvbGF0ZQp0cnVlIC9D
- b2xvclNwYWNlIDI1IDAgUiAvSW50ZW50IC9QZXJjZXB0dWFsIC9TTWFzayAzNiAwIFIg
- L0JpdHNQZXJDb21wb25lbnQKOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0K
- eAHt0DEBAAAAwqD1T+1vBohAYcCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
- DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
- AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
- YMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMG
- DBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCA
- AQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgwYMCAAQMGDBgw
- YMCAAQMGDBgwYMCAAQMGDPzAABE/AAEKZW5kc3RyZWFtCmVuZG9iagoxOCAwIG9iagoz
- MjkKZW5kb2JqCjM0IDAgb2JqCjw8IC9MZW5ndGggMzUgMCBSIC9UeXBlIC9YT2JqZWN0
- IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMjM2IC9IZWlnaHQgOTQgL0NvbG9yU3BhY2UK
- L0RldmljZUdyYXkgL0ludGVycG9sYXRlIHRydWUgL0JpdHNQZXJDb21wb25lbnQgOCAv
- RmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHtnPs7W9kax7V1F5FULkQISVyS
- IEIIcUk0biHqTjouEw1GTDQYGXlQl1EyUpeoGpdxH5fBKK2pTqftc/61864dpkWo89PZ
- +5x8f+EXz7M++11r7W2t7/d1c3PJ9QRcT8D1BFxPAJ9P4A5B9R89TWC8+1n3CKPPY74L
- CLdAdnACn7u7ByHl7g6DR9hfw8VIHZieXl7eDvkQQmeD9fLyhBIB8Fdoz0g9PDwB08fX
- 18/Pj0Qi+RNEMFQYsK+vj7c34r2ZFqHeg5kLoIBJ8ieTAygUKoFEoQSQyf5A7Au4Dtpr
- JjKGCjVFpP7kACr1fiCNRqczGExCiMGg02m0wPtUagDZH9FCbWEiO4dFVUVFRaQU4GQw
- g4JZrBA2O5QQYrNDWKzgICYDeCkYLZQWwTrZkDFUWKh+JCAFUKAM5YSHR3B5BBE3Ijyc
- EwrEgAu0JD+0bJ3D3kFr1csHikoNZASxgJPLi4yKjhEIhEIR7iUUCgQx0VGRPC7wsoIY
- gVQorY8X2qGuFhbKCqjefv4BVBqTFRrO5UcJhLFxYrFEIkkkgGCYYnFcrFAQxeeGh7KY
- NGqAP1TWw93JLIaywrbki6GGcLiRMaI4sSQpOUWWJgel41xojGmylOQkiThOFBPJ5YRg
- sL6wQTkp7B0oq7cviUylBYVweNGieIlUlpaeqVBmq1SqHNwLBpmtVGSmp8mkknhRNI8T
- EkSjkkm+3lDYy5PYUVY/QGWGhPMFcRJparoiOyevQF2kKX5IABVritQFeTnZivRUqSRO
- wA9HlSX7OSssYoUZTAFUDl8gTpJlKFX5hcUl5RVV1VpCqLqqorykuDBfpcyQJYkFfDSN
- Kf5Q2CuTGKawp7cf+T6DxeEJ4qVyRY5aU1apra1v0D3W65twL73+sa6hvlZbWaZR5yjk
- 0ngBj8Ni3EeFvTKJ79yF9w2UNSiUGx2XJFfmFZVWParX6VsM3xvbn5hwryftxu8NLXpd
- /aOq0qI8pTwpLpobGgSFhffO5QWLpjCsVgYrPFIkkSnyNOXausZmg9HU1W3usRBAPebu
- LpPR0NxYpy3X5ClkElFkOIuBVixM4oufThhrQCAzlBsTL83IAdQGvaG902zpezowNEwA
- DQ087bOYO9sN+gaAzcmQxsdwQ5mBAU5ZPX1IFFowhy+SpCrVpdqGpjaT2fJ0aGTUOm4j
- gMatoyNDTy1mU1tTg7ZUrUyViPicYBqF5ON5pa7unj7+aApHxUnTVcVVdfq2DnPf0DOr
- bXLa/oIAsk9P2qzPhvrMHW36uqpiVbo0LgpNYn8f2JwuzWF3L1/yfSabGyOWZeWXPWps
- NZn7hsdsUzMv5xYWFnGvhYW5lzNTtrHhPrOptfFRWX6WTBzDZTPvk329nLD6kWG58oSS
- tOzCyvpmI6BaJ+wv55eWV9fWca+11eWl+Zf2CSvAGpvrKwuz0yRCHixYsp8TVtiGacFh
- kbFJMIW1OkOnZXBsYmZucWV9c2t7B/fa3tpcX1mcm5kYG7R0GnRamMRJsZFhwTTYiK/U
- FV45ATS0XJMz80q+0RvN/SM2+9zS6sb27t7+Ae61v7e7vbG6NGe3jfSbjfpvSvIyk9GC
- paGN+PJ6BVYKsEaLZYqC8voWk2XIOvVycXVzZ//g8OgY9zo6PNjf2VxdfDllHbKYWurL
- CxQycTSwUpyykih0VgRsTUp1RYOhq3fENjO/AqiHx69PCKDXx4cAuzI/Yxvp7TI0VKiV
- sDlFsOgUkrO6kqj0EK4gIS27qErX1t0/Ojm7tL69d3h88vb0He51+vbk+HBve31pdnK0
- v7tNV1WUnZYg4IbQqdewMthcgUSu0lQ/NpoHrFNzy5u7fxydvH33ngB69/bk6I/dzeW5
- KeuA2fi4WqOSSwRcNuN6VnjlAGuNvr1naHx6fnVr7/A1oH74iHt9eP/u7evDva3V+enx
- oZ52fQ1iFfK+ylqs1T+xDNtmFta2949OTgH1E+718cP705Oj/e21hRnbsOWJHl4617HC
- v3TeJCqDjdXVCeu/cK5PN7NeOIW5c88DPofhs0mUmJ7zUNtkgrq+WFzfOTg+eff+4yec
- k8LwPn18/+7k+GBnffEF1NXUpH2Yk54ogg8n+CD2uOdiddXVNYfx9ARc69W1N7neOa73
- K572pPOxuPYm197k2ptce9P5foCnn6696f9+b3L7yrnE/9IZzLWsr96c/vU37k/WYIB/
- /3X65tWtzpsusGLniIM/E/Uc8efB250jovPhB5rqxn/Ohw+IdD588M/5cGO15sHN58MX
- z/0nZpfW4ID4+M2fpwTQn2/g3H9rbWl24jbn/n5f3Oe0dvX+ZLPPL2/s7B0eEeM+5+hw
- b2djed5u+6m3q/WL+xynd1eOe7r4lKyCsroWU8+gdXIW7um29w4OXx3hXq8OD/a24Z5u
- dtI62GNqqSsryEqJv/6e7uz+Veq4f+2G+9dpdP+6tfv7PgH0++4Wun+dhvvXbsf9K2aY
- cHr/6g736oFBjnt1TY3O0GEZGH1un1tYXtv4bWsb99r6bWNteWHO/nx0wNJh0MF1Dnav
- HgQegqv36u5en/0SauSX6O4dHns+PfvL4q8rq2u41+rKr4u/zE4/Hxvu7UZ+CfWNfgnw
- wVDPfDB5pVod5oMZtU3aZ+fmFwig+blZ+6RtFPPB6LSleWc+GKpTHwzyN9HP/E0a8DcZ
- TObewRHr+MTUtH0G97JPT02MW0cGe80mA/ibYApjy5Xu1N90z9Mb+dbC+ELwrRWU1IBF
- z9Rt6RscfjZGBOPauHXs2fBgn6UbUBtqSgrAtybkgw0GLARXfWvIe3nuR0xXFSE/Yqux
- o7unt39gkACGxKHBgf7enu4OYyvyIxZBWW/wI8I/OpjPlBMpBJ9prqasplbX1Go0df5g
- /pEARtOeH80/dJqMrU262poyTS74TIWRYCDGfKZ3L3l+MP8wTGLkH45NlCtzC0sqtXU6
- ffN3yEBMAIF9+Ltmva5OW1lSmKuUJ8Y6/MMkJ/7hM184uC/DeOCqTctSFWhKKqof1TZ8
- i4zh+Ndj3bcNtY+qK0o0BaqsNJjBvDBHWZ35wpHfn0QJZIIJPiY+UZauUOWpNSVl5ZVV
- 1TU1eHf819RUV1WWl5Vo1HkqRbosEVA5LGYgBQU5rvj93bB4jiPHAbCxCVKZPFOpys1X
- FxZpNMW4l0ZTVKjOz1UpM+UyaUIsoH6R47hoqXVzQ/kcSJhhoRUOL0oYJ0lKSZVnZEFA
- 5wGEX3CvBxDPycqQp6YkSeKEUeeoKGV22e6PWLHcFQojMVlhEfxoYaxYkihNlslSseQV
- SjbhWWmpMlmyNFEijhVG8yPCUMgMRZGuyV058nQO2FBOBD8qRiCKjReLEyCqRgAliMXx
- sSJBTBQ/AtKDGOp1eTpUWCw8CLCB9CAWOyw8gsePwoKSAkIIYpJRfF5EeBibFUSHnCQK
- hTrPSQIrzGIs6guZZhqdGcxih4ZhAVhCJGC5WPw1LJTNCmbSISRJhmjzV8K+AOuD0r7U
- QMB1BJsh2UwEhThizQAaSEVJX58bUN3OovlYXp1EBtx/AusMQug8rk4hAymWV0etCJzn
- 1c9hUTrfx9GHgFiNCLA2BFgfAmi7cNZ14RpUeO/AmsW6LqD+EtBgAto1YB0moHMDEYQN
- F7WXuEV/Cfi8cNCiJhMenp8bh5y15CDCD2gbgvUNwdqkXFvUsw+ps8Y3qB8MIRvCwLDP
- 28FccJde/k78jIsmM4EFBbsN6Jf86E+Ipi/H7/rd9QRcT8D1BFxPwPUE/ltP4N/BQHbl
- CmVuZHN0cmVhbQplbmRvYmoKMzUgMCBvYmoKMjgyNgplbmRvYmoKMzAgMCBvYmoKPDwg
- L0xlbmd0aCAzMSAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0
- aCAyNTAgL0hlaWdodCA5NCAvQ29sb3JTcGFjZQovRGV2aWNlR3JheSAvSW50ZXJwb2xh
- dGUgdHJ1ZSAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+
- CnN0cmVhbQp4Ae2c6Tub2RvHtbWFiKSyECEksSRBhBCiJRpFiFpqSccy0WDERNN2ZOSi
- tYySkVqiGMuobSyDUVpTptP2mn/td58n6VQJNS+P3/N9075xXedz7vuc5+Sc7317eZEi
- Z4CcAXIGyBn4/5mBK5dC/yleQHz1s65hqs8EVwHoAhPgogZab2+fSyBvb0BBk/A1eILb
- Be3r5+fvEgVDuYfu5+cL4QP8r7C7uX18fAGaEhAQGBhIpVKDsBQMHIYfEEDx90f057Mj
- 8GuQ44AN0NQgGi2YTmdgKzo9mEYLAv4AgHexn5HyBDjEG3EH0YIZjOshTCaLxWZzMBSb
- zWIxmSHXGYxgWhBih7hDyntGRxFHAUfcdKBmc0LDuNxwHi8CQ/F44VxuWCiHDfR0gh3C
- jtA9bPIEOCzwQCpwAzYwR/CjoqIFQiwliI6K4kcAP8ADOzUQLXfP6FfQGvejQMAZIexQ
- LlALhDGxcfFisUQixUwSiVgcHxcbIxQAPTeUHcKAsFP80D53OugQcgD3DwwKZjA53Igo
- gShWLElIlMnkcnkKdoJBy2SJCRJxrEgQFcHlMBnBQRB1H28P+Q4hh80tgAAP5wti4qWJ
- MnlqWroyUwXKwkpoxJnK9LRUuSxRGh8j4IcT6AGwzXkI+hUIuX8AlcZghobzhXHSJLlC
- mZl1M0edq9Fo8jATDDlXnXMzK1OpkCdJ44T88FAmg0YN8Iegn0x3V8gDAZwTHiUSJ8oV
- GVk5uXn5hdpiXckd7FSiK9YW5ufl5mRlKOSJYlEUijot0FPQETnkOh3A+SKxLFV5Q60p
- KCoprbhbVa3HUNVVdytKS4oKNOobylSZWIQSnh4EQT+V7pDsvv6BtOtsLl8oTlKocvK0
- uvJKfW19g+G+0diEmYzG+4aG+lp9ZblOm5ejUiSJhXwu+zoK+ql0v3IVvmgQ8tAIQVxi
- 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
- WLy83DWKqFSPw42MFsVJEmTyFEWaUplBVCmiuj98lJmhVKYpUuSyBEmcKDoSlWeiQr0z
- ahRddaku9Ah+tCg2XixNSJLJkqHIEzsly2RJCVJxfKwoGmpyCfCz6lJR0ImSXEAPYYVy
- eZFR0UJRLFGMLMZQUIocKxJGR0XyuKEsqEVGZdiea5GBHDY5ovAe+g0wWZwwLi8ikihA
- x7ACXUCUn0dG8LhhHBYUItOg7cBXSu8BnYJq7xkhAO9qOgBdB/BTuKvlAGCHMFDdPeUc
- cC93gw2izwSVBvD/NppgY6hPbSboNOAm+kyg9iKe+0x8Qkc9Niiu3iI4NxchWosQvUWg
- sYq7r8oZ4PBlg7VO9FVB/WSgoQw0ZCE6ykBvFvxEDB61k7lAPxk40bjYUVMZH9/PTYTc
- DXnw+wdaCBE9hIgGSmcG3H2oc7fLQn2jLkHjKID41DbqC4fzyRPsZ3iU9pdGEMyLYB+f
- DfQneOs4Dfl/cgbIGSBngJwBcgYu7wz8DzWXhe0KZW5kc3RyZWFtCmVuZG9iagozMSAw
- IG9iagoyODI2CmVuZG9iagozNiAwIG9iago8PCAvTGVuZ3RoIDM3IDAgUiAvVHlwZSAv
- WE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDI0OCAvSGVpZ2h0IDk0IC9Db2xv
- clNwYWNlCi9EZXZpY2VHcmF5IC9JbnRlcnBvbGF0ZSB0cnVlIC9CaXRzUGVyQ29tcG9u
- ZW50IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB7ZzrV1LZG8e7eEMR
- IbkooiAgCqiIYiiaYJiJYuSdJnUwtJEGIx0ZWWpexpSRvGDmeBmvjZdRx7ScbJpqzb/2
- e/bBLiqWv5e7db5v6o1rnc9+9t7nsPf3+5w7R4ocAXIEyBEgR+DbHoHz34D+rwoB74VP
- uoilPj3/BcA5A76PGVgDAgKxV0AAgKAh+Bo6Qe1DDgoODvGJgp0OHzw4OAhKB/BfIT+k
- DgwMAmRKaGhYWBiVSg3HUPDY8PChoZSQEMT+ZXKEfRFmN0ADMjWcRoug0xmYik6PoNHC
- gT4U0H3kp0x2AhtqjajDaREMxqVIJpPFYrM52InNZrGYzMhLDEYELRyRQ81hsvsHR9VG
- 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
- IC9MZW5ndGggMjcgMCBSIC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lk
- dGggMjM2IC9IZWlnaHQgMTI2IC9Db2xvclNwYWNlCi9EZXZpY2VHcmF5IC9JbnRlcnBv
- bGF0ZSB0cnVlIC9CaXRzUGVyQ29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUg
- Pj4Kc3RyZWFtCngB7Z35P1tp+8en80yfrlq1U4pSSymCCql9rb1olEYJSlGKFA2KUltj
- rdp3aq2u0850vs/3mdf8a8/nus9JRCSV6VCtuH4gOefIOe/z+VzXfZKc+/LTT4dxeAYO
- z8DhGTg8A4ZyBo5oiYPDzuB+1ivYpj8gOR03D/gvxC8UR3UGW03b8X9Cf/0DQG9CMkKG
- 92/EsWPHjusMrKRt2MbgVjJ/x8g4NKYLQdJhEyDhnThx4uTJk6e4OK0R/GJsgM1oa8Km
- v1Yhf28a85g8JSAZIgM8fdrI6AzF2bNnjRHntgQtwQq2gZHR6dNAJ2piZshK4u8EmFOT
- w+QpSUSGCDxCMzExNTWjMDc3t1APPDdnK0xNTUxoS4CfOQNoYlYRbwLvZxKrOMmyEPME
- RwkRwQhCorOwtLS0srK2tqE4j7BVBT1ji62traywmQWRM2pjQlYSHyNT81m8T0WLgULP
- TczTcCujBCMQGeB5Wzs7uwsX7B0oHB0vUjixoEeOjo5shf2FC9jMFuTAJmgzM+isJCaJ
- CZjjPfKNazQvqBonYUJLU6K0gohgJEDAOTk5X7rk4uLi6urm5r4t3NxcXbHy0iVnJyew
- OzjYX+CYrYjYFMQkMWdpjpcK4Dfj3SIo2daI1CRMS0tQMkhHIALQFXSXPTw9Pa94eXl7
- e/v4+Ai2hI8Plnp7eV3BJh6X3d3dwH0J0I4MGSpbWjJgKMzxflN51UCRn6hBZ86A08zM
- ApjQ0h5KOjm7uLgR4hXwAc7Xz9//akCAUCgMDAwMCgoS8YGHWIDFAQFX/f39fAUCkAMb
- 0G4uLs6MmDS2trQgSxufOYMMhp2/kZs5UrLu8eMnUWvhWxNyrTXUBCZHCUhvb4EAhOAL
- FImuBYeEhIaGhYeHR0RERkZGqQJPIiKwOCw0NCQk+JpIBPAAUAsE3t5A5oghsZ0t8ZqD
- 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
- qt4jBV009qxHigYt8hZ9m/5e75tH+ve+eVT793rfoI/Tbva+ASyXtry2aFN1gHsabaVF
- +zE9elWhH5e2XlX3tfWquq+9V1X6/vSqUqM1gB5kSlp6/6O7txx6IbLecugRqFdvuVtf
- 7i13je8t5/2te8up0+LKkWuOaLylZyB6zF2m9o/UM1CoZ8/AJDQN1NozUMj3DPS8zPWU
- 43skKpvo7UuLxIPaC5K0ZUX5Z647rc4en5eoj6n2Hp/o66ne4xNNPrX3+HSlDpCs5eW+
- 9fjUxGXtEv9R71Zq3vq99m5ltJy6VKlULZYPaE9eDlfdzXxL6Z16LTtu67WsbLb8Pfda
- VsflslclMPU6PXA9tDV5ydAYfFGx9O6NjgbhP0xvdB4XdsY7XbzX5Tr7f6nnPTV7V48f
- q+e9klcJrCQ+qP/LQMVLwExiTmTYGkH/f+KA/Y+KTWC64lAiQ2ayNoJxa/3BVtN2lAgI
- +mv1V/tBHtNh80JzHLp/sk1/ECw9DpPhaPzQ488ONzk8A4dn4PAMHJ6BA3IG/gdhGPNm
- CmVuZHN0cmVhbQplbmRvYmoKMjcgMCBvYmoKNTQ0NwplbmRvYmoKMjggMCBvYmoKPDwg
- L0xlbmd0aCAyOSAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0
- aCAyNDQgL0hlaWdodCA5NCAvQ29sb3JTcGFjZQovRGV2aWNlR3JheSAvSW50ZXJwb2xh
- dGUgdHJ1ZSAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+
- CnN0cmVhbQp4Ae2c+Tfb2RvHu9hCRFJZiBCSWJIgQgihRGMLUUst6VgmGoyYaOjIyEEt
- o2SklijGMop2LINRWlOm0/bMv/Z97id0k9Dvb3PnfN6/9BxOz7mv+zz33o97389z5Qop
- cgbIGSBngJyB/8YMXMVb/18QgPXaR13HTR+Hfg1IvgbdxQucXl7eOMvLCxgQ/qXYBLEL
- 18fX188lCk46HbOvrw9EDMAvoz4l9vb2AVyKv39AQACVSg3ESzBiGLe/P8XPD3FfQo2Q
- r0NGAzDgUgNptCA6nYGf6PQgGi0QyP0B20XtKcEJZIgxIg6kBTEYN4KZTBaLzebgJDab
- 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
- ZW5kb2JqCjMyIDAgb2JqCjw8IC9MZW5ndGggMzMgMCBSIC9UeXBlIC9YT2JqZWN0IC9T
- dWJ0eXBlIC9JbWFnZSAvV2lkdGggNDU0IC9IZWlnaHQgOTQgL0NvbG9yU3BhY2UKL0Rl
- dmljZUdyYXkgL0ludGVycG9sYXRlIHRydWUgL0JpdHNQZXJDb21wb25lbnQgOCAvRmls
- dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHtnelXk9cWxlGQMYREMkAYAkkYEoYY
- iIZBIRhEAqEIMsQKNBq0xKJRS0oWKEMRUiJDKFKGIqAFLFAEpWJtdd1/7e7zBluVJNgP
- dx2y7n4++urK6/PLPudNcvZ+AgJQ6AA6gA6gA+gAOoAOoAPogL84cAR1uBz4d28cuPej
- /ygQRduBf2AcBTafA9NNEO47KOgY6jA5EBQEVAjQA0EyDN0Ag0NCQt0KQ9F0YI9CSEgw
- vKcA5UEc9xgeOxYMAMPCwyMiIlgsViSKrgPAAEiEh4eFhhKSB3AkEANhHQWEAJAVyWZH
- cThcFH0HOJwoNjsSWIYDSDdHb8sqAxHqkDCMZEdxucejeTw+XyAQomg6IBDw+Txe9HEu
- N4odSThCPcKy6gUjqURSiIQhBwgKhDGxIlFcfHwCiqYD8fFxIlFsjFAAJDkMRyhHgtHT
- wyoDETbECBYwBITAL0GclJQskaLoOiBJTkoSJwBLAAkcWRFke/SC8QjZE0PCoBC50YIY
- ERCUSFNS09LlcoUiA0XLAYVCLk9PS02RSoCkKEYQzYVyDAshzzgeihFKESCGRkRGcXlC
- UUKSRJYqV2RmKZUqlSoHRc8B8F+pzMpUyFNlkqQEkZDHjYqEajwW5GlNhVKEB5twBmKc
- WJKSnpGlVOWePKXJLwAVoug4QMzP15w6matSZmWkp0jEcQzGcHjE8VSMR6AUQ8NZbC4v
- Jk4sTcvIVqk1+YVnirUlOp2uFEXLAXC/RFt8pjBfo1ZlZ6RJxXExPC6bFR4KxbhvSXWX
- YgRAFMYlyeRZKnVeYXFJaVm5vtJQ9QWKngNVhkp9eVlpSXFhnlqVJZclkWpkR3gsRkIR
- 1lMOQBTL5MpczWmt7nxFVXXtxfoGI4qmAw31F2urqyrO67SnNblKuYwsqpxIKMb9Syos
- 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
- dOzQoZuXosCsS9cgqSAIPHXo+83s6iiEb3k73/v9/X7fe0RtnabvOylBVHNDlSulp25O
- TYuDHylFHdROWKYV+OlicYyx67mSv7vX1mfS2LLex7V2+/Y9tZVlYCHqLba3EPohkWYA
- H5mfKGWAs8Adlq/YPgE8WA6sGvAjogMPmrkw09GcdKWyLZFT5qIoKq9iO0mu+/m5xr6L
- tYmD/lyPZtaOvbPqqtFM1LT3RKG8D65EGc9fVPZsNRSnDeOcSEMaKfKu1d8rTMcRkSsQ
- SgZSNWS5n2pOnXXgdRi7XbqT4/j2EKU+yWCoibXpspkdhX0AdirL7BDwBejxsmIP54F7
- Yf9bUcOTwCdhP2SHedatH/YXrlPge4Q9NeDOFK7F8dqKH14tAUP3VCNojHNNxNPXOXOk
- iO8x1BmY90Y5pgsxd5aqEzeAO2EfWapmCrFd+67qJe57AnfT4zvRmzkLXKAcSXKxFdkU
- 0DwJWBR9i7BJDjw+zh5V4HeomMAcuYnczSj3HtURG2ejUoFWeo1Xxk/jufHF+GVsGM+A
- fqx213t8/+njFXXXtj48+Y163DmuvZ0bVWFWcWUL3f/HMoSP2Sc5psHToVlYa9h25A+a
- zEywDCjEfwU+l/qSE1Xc1e7tuEUSzFA+LGwluktUbinU6j2DSqwcK9gAdnCSxCxaHLhT
- a7o5eHfYInpt+U1XsuuG/vr2evva8h5tyqgpKBPNs0RmlLFbo+TdeNv9ZpERnzg6vue9
- ilrJ/klFED+FOVoq8hRV9FZQ1sRvZw5+G7Z+XD+l5/VB/TwJPa2f0a/ooxG+DHRJz8Jz
- UR+jSfCwaSHiEqCKgzPUTlRjjQPiKfHytFtkkf0PQBn9ZgplbmRzdHJlYW0KZW5kb2Jq
- CjM5IDAgb2JqCjcwNAplbmRvYmoKMjEgMCBvYmoKWyAvSUNDQmFzZWQgMzggMCBSIF0K
- ZW5kb2JqCjQwIDAgb2JqCjw8IC9MZW5ndGggNDEgMCBSIC9OIDMgL0FsdGVybmF0ZSAv
- RGV2aWNlUkdCIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ae1aZ1AVTZfu
- uZkbSJecwyVnJOckGUFyzjlLEFBABUSSgiAiSQkGBCWIKCCSFQRFkKACIqCgKAYElCg7
- +Na339ZW7a/df2tPzfTTPad7puZMTZ85zwOAUIlHeHgwAgAQEhoVYWmgw2Pv4MiDnQQQ
- vOEABfB6eEWGa1tYmMIm/0P5OQHbwmVUYn8un7WuT+SOzamRc/fa8reEr/wPg/7VTRcB
- XxAAyALuYPD7B3vvY89/cOw+jokKj4Jtsvaxl78HfB4qg7F4hLWlLoyfAoAj+v3BVK/2
- secfTPd+H3t4RPgBwPodtufx8PCDMRvtP9hzH0vv46NefvD8bPA9YOhDvQNC4S74GhgN
- b59ILwAEr8I23t6RXiEACOFgbBgSEgafF4LtgbBXeAQ8Vmj/Pin7zw6u4eLHBIBKPgDY
- tn/3BcH3f7sdNjP7dx9FDgDm2wDc+C9jVy3/PE+I6Xmk7wHZP9NBRB0A0DN7e6uC8Jy5
- AOye39vbrtjb260EADkNQGewV3TE0T+2ALVfoQEe0AAGwAq4AD8QBhJAFigCVaAFDgJj
- YA6sgQNwBV7AH4SACBAD4sEpkAoyQQ7IB0XgCrgKboJacAfcB22gCzwGg2AYjINJMAsW
- wCfwHayDbQiCsBARoodYIC5IABKDZCAlSAM6CJlAlpAD5A75QiFQNBQPJUMZUC5UCJVD
- VVA91Ax1Qv3QMPQKmoWWoBVoC4FAEBAMCA6EAEISoYjQQhgjrBDOCF9EOCIOkYw4iyhA
- lCNqEE2IDsQAYgzxFvEJsYbYQ+KRjEgepBhSEamDNEM6IH2Q4ch4ZBryArIMeQvZgnyE
- fIGcQX5GbqBQKDoUF0ocpYzSR1mjPFBhqHhUBuoS6jrqLqobNYJ6i/qK2kET0GxoYbQi
- 2gBti/ZBR6FT0HnoSnQjugc9in6HXsUgMQwYCkYecxBji/HDxGLSMUWYGsxDzBBmFvMD
- i8QyYoWwylhTrCs2HJuMvYitwj7ADmHnsGs4HI4dJ4XTwdniAnGJuFzcdVwrbgj3DveL
- ikjFS6VAZULlThVNlUFVRtVENUg1S/UTT8Tz4ZXx5ngffDw+F38T34l/if9KQBM4CXIE
- E4IX4Tghj1BD6CFMEVaJRCKFqE60JYYSzxDLia3EUeIXEobEQ1IhWZNCSWmkClIb6SVp
- hZpILUStQ+1CHUudR11HPUC9SIOg4aJRobGliaA5R1ND00/znhai5aJVpbWnPUqbR9tA
- O0S7TIenE6bTp/OmS6Yrp+uke0v3m56TXo3eif4YfRF9C/1r+k0yK1mZ7EA+Ri4iPyBP
- kXcYOBk0GNwYTjFUMPQyLDBiGUUYTRhDGHMY7zCOM/5iYmNSZ3JnSma6wTTA9JWZnlme
- 2YE5gbmC+THzJxYaFjkWB5YElkqWfpYvrGRWJVZX1hTWatZh1p9snGy6bIFsOWz32WbY
- MewS7Nbs8eyV7IPsqxzsHLocwRwXOB5yLHJScypyunNmcDZyvuHCcElzOXKlcNVyveJG
- cktw23Mnc9dyv+ZB8UjzOPGc4WnkmeHF8yryevFm87bxLvEx8unwhfOV8g3wbfAL8Fvx
- n+Kv439DIVJUKAGUAspjyroARcBaIFmgUWBekF5QRzBCsFJwVAgpJCfkI3RRqE9oQ1hU
- 2En4rHC78HcRPhEbkTMiLSLLotyilqKnRZtFP4txiVmKpYq1in0V5xO3Fc8Q7xBfkxCR
- cJXIk+iX2JU8IBkgeVlyTIogpS0VI1Ur9V6aXdpSOl26S3pDRlrGT+aKzEtZGllD2ZOy
- zbIrB0QPeB0oOTAuRyNnKJck1yb3U15aPlD+mvxbBTYFG4UchUFFjKKOYqJii+K6koxS
- iFK10qIyv7K7cqnypAqzirVKrspzVZKqiWq6ap8aRk1PLVmtWx1S11I/od6h/ltDQyNR
- o13jt6am5gnNTi2gpa2VpNWrjdY20E7THtAh6hzSOa8zqsuka69brDujx6vno1elt3xQ
- +mDUweaDO/pa+qf1BwyoDawMCg1mDPkNAwzrDNeNVI1OGfUZUxvbGBcbz5uImhwxaTYF
- poamOaavzHjM/M0azLYO6RzKOjRuzmXuZ95gvm1x0CLb4vVhyuHQwy2WKEtzyyLLBSsZ
- q3irfmsGa3fr29abNvo2uTZvbcVtj9n22THYedrV2/22N7Uvsl9yUHJIdRh3pDhGOfY4
- kZ28nO44I52tnCud11z0XPJdFl0VXdNdJ93E3RLdht353KPc+zxYPYI9OjzpPX08W7yI
- Xu5ed71x3s7eDT5oH0efOl+Ur4NvnR/Kz9Gv3h/j7+x/J4AqwC3gXiAp0DuwLYgcFBTU
- E8weHBk8GMIfEh8yHioZeiZ0NkwlLC/sS7hBeHn49hHbI/URhAjfiK5IjsjYyNEoqajM
- qA/RutFl0TtHHY7eiyHHhMcMxYrFpsd+iDsYV3kMccz9WMdxruMJx6fj1eKL47cTnBIe
- JLInxidOn1A/cfnE3kn3k92n+E+dPvUhySipJpk6OTx5NEUhpTBl57T76Z5UodTM1G9n
- rM80p3GmnUpbTDdNb8hgyojPmM80zKzNYsg6njV/1vBs3Tnmc4nnFrLNsptyOHNO53w9
- b3u+I1c493zuVp533rMLihfK8wn50fmzF40vNhXwFGQW/LrkeWmoUKXwehF9UWLR52K7
- 4t4SmZIrpcTSuNIPl20u91yRuVJWRlOWULZc7lQ+WKFSUV3JVplRuXU18OrUNdNrbdcl
- r1+5QXsj6cZalU/Vq5vGN9uqpaorahhr0mq2b4Xdenfb9vZgrWZtY51wXWk9Xf2Z+p2G
- Iw0f7rjcGW00auy4q3D3dhOlqfge/b30+9D9uPsrzQHNcy2OLS9aTVp7H2g8uN8m3Vb9
- kPLwcjtre14HdUd6J6rzROdW19Gule6Q7qUe3575Xrfe6UcOjyYeWz0e6TvU97TfuP/J
- E4MnjwcODvQO6g52P9V52vVM+1nXkM5Q93Pd5z3DesOPRwxG+l8Yv3g6emh0eMxqbGLc
- fnxqwnVi/qXPy6VXIa9WXke/3po8MYWcSpumns57w/rm8gxlpvqtzNv7sxqzj+ZM50bn
- Hefn3wW++/H+2AJiIXORvFjyQeBD3Uelj91LpksTn9w/ffoc/XlvOeML05fyr+Jfm7/p
- fRv+7vx9aSX6B+JH9irHavWa4tqjdav1uZ9hP3//ytpg36jeVN58suWw9XE7dge3U7gr
- stv62+T39F7o31jgbyzwNxb4Gwv8jQX+xgJ/Y4G/scDfvMDfvMDfvMDfvMDfvMDfvMDf
- vMD/37xAuEeEx59YAAkfEb6+APy4AQDJAQDyMAAE5P/2/D88yj/RBkDCpNA+sYSEeQgK
- 0IV5hkqwALMEsdAwQgFRg5RAtqHsUHvoVswJrDlOgooFT0egIVJIGtQ+NAW0w/Qs5ECG
- diZe5nSWTbYw9k+cYVyrPPF8eP4iAWHBB8ImIjNiIeJbkiekkTJJshty/vIjijJKKcrP
- VRnUrNWzNHo0t7RldAJ0K/Xm9LkNHA3zjAZNgKmCmf+hEvOhw5ClvFW49X1brJ2nfbMj
- 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
- EL1PkKa7zO6rYqGcTvYOkL2d9H5Os94+wiHCCxmtP0a4jZ71jNU/4mHhpObEhj0cGDX0
- +GAVtxqp+DXCFF8QTSeiVHHZLg3xmK79VvJKgnCQOMpkYYBzWkhP10xu+LqHBX0m1xOv
- 4ndWUeF5jxNn3tTd70XaAq8wDh0MGgyaDUhQEEUEYZiwUECGPBoxNLJyPyOrBhuTezJ1
- JGq7dGJEsUF7Ntw9t1Gk3Tz+KCJxlEO1CJL8Qf4qr8lP5Xn5y1yw2Fb3lK2bmrry4DvF
- 5Zm5Gh7X08jjc01efJXUdpNXR5aseXq8muwaP+xXlzHmgjWPxHOw+/EtX5XMlymMFMXj
- VfPqS4R1WjE3359sfzs94i7PLrXWc62JizdWm5dn/WpI++6qvJPmVflPXvXx/GfNxGPi
- KTEmdornIYmXxS7xkthLqwviYG3HCJ2VhinSbZH6JNVgYJq89S9dP1t4vUZ/DPVRlBnM
- 0lSJ93/CKmQ0nbkOb/qP28f8F+T3iuefKAIvbODImbptU3HvEKFlpW5zrgIXv9F98LZu
- a6N+OPwEWDyrFq1SNZ8gvAEcdod6HugpmNOWls05Uocsn5O66cpiUsxQ20NSUtcl12VL
- FrOZVWLpdtiZ0x1uHKE5QvfEp0plk/qv8RGw/bBS+fmsUtl+ThrWgZf6b8C8/UUKZW5k
- c3RyZWFtCmVuZG9iago0MyAwIG9iago3MzcKZW5kb2JqCjggMCBvYmoKWyAvSUNDQmFz
- ZWQgNDIgMCBSIF0KZW5kb2JqCjQgMCBvYmoKPDwgL1R5cGUgL1BhZ2VzIC9NZWRpYUJv
- eCBbMCAwIDYxMiA3OTJdIC9Db3VudCAxIC9LaWRzIFsgMyAwIFIgXSA+PgplbmRvYmoK
- NDQgMCBvYmoKPDwgL1R5cGUgL0NhdGFsb2cgL091dGxpbmVzIDIgMCBSIC9QYWdlcyA0
- IDAgUiAvVmVyc2lvbiAvMS40ID4+CmVuZG9iagoyIDAgb2JqCjw8IC9MYXN0IDQ1IDAg
- UiAvRmlyc3QgNDYgMCBSID4+CmVuZG9iago0NiAwIG9iago8PCAvUGFyZW50IDQ3IDAg
- UiAvQ291bnQgMCAvRGVzdCBbIDMgMCBSIC9YWVogMCA3ODMgMCBdIC9UaXRsZSAo/v8w
- rTDjMPMw0DC5XDAwMCBcMDAwMSkKPj4KZW5kb2JqCjQ3IDAgb2JqCjw8ID4+CmVuZG9i
- ago0NSAwIG9iago8PCAvUGFyZW50IDQ3IDAgUiAvQ291bnQgMCAvRGVzdCBbIDMgMCBS
- IC9YWVogMCA3ODMgMCBdIC9UaXRsZSAo/v8wrTDjMPMw0DC5XDAwMCBcMDAwMSkKPj4K
- ZW5kb2JqCjQ4IDAgb2JqCjw8IC9MZW5ndGggNDkgMCBSIC9MZW5ndGgxIDExODY4IC9G
- aWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Ab1aeXxU1fW/9+2zZvZ9zWRmMpms
- E7IH8ghJCEtCIIgJEkiAQIiggBDEn9CoIBIQBWRRrIoLq5ghpDJAoRSjiLUKVlGpbbWC
- 2tbU9vfDtj9gZn7nvQkx5Nf24x9+Om/O3d99537vueece99btnR5K1KgTkSiuukti+ch
- 8ZdeihDhmrOoZXEir3VB3DWnY5kQw49ORYhcOG/x/EWJPPcEQlL7/IUrB+7XXkbI+Elb
- a8vcRD26AXF+GxQk8ngExClti5bdm8hreiFeuPDuOQP12pchX7io5d6B56NPIO+6q2VR
- a6J9ugnilMV337MskQ+ehrhh8dLWgfa4Afh7F2EotaK7kQTdiVhEIBVcTQixX0ntiIJa
- oR5+c9NlW2cllX6L1JyYn1XzmBi/4f7pxX+03vDLNnP/CwWSm+2FmAnEAgjJMdT3yzYP
- 1oj3QWCNoPpgBI0DKgPKAwoGR5tQJ96DHgd6DohEC/AGtBJoPdCTQNRgaj/kjuENPRTH
- H8crkQWP52WUc6rO7DRJZc73Ipjpfcb5senzE9gMs/cZNvcokGS0FD+Hn0VzkRO/hLz4
- PlSNUvFTRwILnc1QtR8tBuoEIsUQ4/09jpDzFE5HXgrDPT7koPCrzi9zMpxXciIE7nGe
- 8UcoiH7ugByf5Dxtf8b5M/t85ymgg4mqAwFo8apzv32hc6sjgp/qcW6xRzDcszkRLbfD
- ra86FwW2O+fmiPUTt0eIgz3OIqifxsuc+YVuZ579sjPLH+Ew5DPsE51pOb90psCN0MwF
- nXp5tdNm3+oshiqHvdJfDHQCH8C7UBre1eMd7zwOSRjukXGBwu0R/F9HqlNzvBF8H59f
- nbo9UO33BiY6vYEqvx/S095k17B3sKPZEBtkU1kf62atrI7TcCpOyck5KcdxbAS/3FPm
- ZE7gg6gMYDl4hGM4OoJfgULqBD4kFh46ylEcwSFOF4l/CsKLkS6CD/aqhBQkXmXEFBPB
- h44kig7xTkpIUWKFihDSEECICMwRaDwK40cjDFpr6CgzlWlGqYuqKv5V0CzW3AyD//pn
- wvbw9gn1DeED9sZwSEjE7Y03m5tuJv5lvGw5VLWWB4MTpqw80rG4fV5lq6ey2VPZCtQc
- 3tDRZgp3zna5DrcvFipcYdLXPHtOmxC3tIYXe1orwu2eCtfhDvG+YdXzhOoOT8VhNK9y
- asPheXxrRU8H31HpaaloPDK7fGnTLc9aP/ispeX/5FnlQmdLhWfNFu8b9qwmoXq28Kwm
- 4VlNwrNm87PFZwmDr1xQX37PMpBOV+WCCa5wan143OTpDWFXS2NFBO+BworliD6NVPRJ
- lEp3IguVhZwIxT8GuiTEsdviX9BnkSq2KP5XsgQm9ZhARKysFJ1Gj6JdqBsxaB+kU9FM
- tBOdw+2wtmegXnQRO1Am6F4KRdBE9DaOxy+geehFaL8MnUHb0GEkh3sWIT3UbsLe+H2Q
- 5yE9G62JP49SUCF6GJ1ERdDrJtQf3x8/ArVT0G3oADoI9/8Ce4jDlDb+Svwy4tBk6HMN
- 1FyIT4x3Iw1KR+WoDkrXoFPYS16KtyETKgHunkbPot3o5+hr/CDujbfFO+Ln45+BqJqQ
- DdXDtQr34s/Iburh+NPxP8ZjgEQqSoOnNqOt6AXovxuu06BaK/GdeBneircRPPEg0Uut
- pY2xKOAQQGPhqgat/AggcAz1of9G/4u/IUykilxGvh7Pi/8PkqEJMEphJK2oA651cG2C
- MZ3ADM7GY3AdXoWfwNvwr4g04jaigVhB3Et8QdaSM8iV5K+oe6geeiO9k5HFvo2fiJ+N
- f4CMyI7uQEvRahjdGXQeXUXXMAl92bAXl+ByPBOuTryLOIZ342NEHT6NzxMH8O/w5/gb
- fJ2gCTmhJ4LEMmIrcZA4Q7xDLiC3kU+SvyO/pUbRBL2bvsJ42V/HZsfWx96Jl8Q/i/8D
- VCyH3DAz5agWzUItMNrFaAT6EYziEFzdMGt96HV0Trw+xzbUj/4BKCCswRYcwjVw1eJJ
- eB5egJ/Bx+E6JfLyNwImgpAQasJI2Ih6YjaxiOgkPiA6SSuZRo4np5PdcL1JXiSvk9cp
- mtJSemosNQ5tpBZRT8G1h9pH9VDv0kX0KLqWnkZ30uvpjeQc+gJ9kVnNbGJ6mG+Yv4Ba
- nMjezW6E2TkHMvtzkOXvfhROAe5D6C40B1fg2Wg7zMZu3IK6QLrm4kcAr8UoNd5EribH
- EtkgDafQf4G0PoVWofXkDLQ7/hF5AH0IkrIQuuxEe6lyZKd3wOw8iLJBigYuPpAWSPX7
- vCmeZLcLVL7NajGbjAa9TqtRqxRymVTCsQxNkQRG6ZWeqmZX2Nccpnye6uoMIe9pgYKW
- IQXNsJRd4apb24Rdwn0tUHVLSx5azhvWkk+05AdbYpWrFJVmpLsqPa7wLys8rgiePrkB
- 0o9WeBpd4X4xXSOmHxfTCki73XCDq9LUVuEK42ZXZbiqo62rsrkiIx0f4wEOaUa6oDh4
- JBM6DqMxLatAwaIxQovKsMVTURk2eyANdaS3smVuuG5yQ2WF1e1uhDIomtIAz8hIXxAG
- PtEG+VzP3A0RHs1uFlItMxrCZEtjmGgW+lIHw0ZPRdh43xXTd9mbqcqNQyrDhLeqpbWr
- Ksw3bwBwhWyzkGvZCLkJ9S7olljb2BDGaweYEHhsB04FdhM2wdvc7gpLPOWetq72ZgAX
- TWnosfAWUfmGUV1Dj5k3i5mM9GOm1SVuGP2xjNEZo4W4xG1anYi/fChR/t5pITat7vsU
- 4glTBgHAAgKeccBn2DVHfIgHmC0UgtZC8FwLASf4NWIY5gLgZ0yYAJkhvWHaO64l3Fl/
- k422igRzze0VPRKzRTRC5Y3QvrlLVQwzBe1VHlfXt2Ctmz39X99a0jJQwnhV3yKhUpjo
- QVkJ45ab6Q7BWHph1G0mT5swvx3inELeY6ocUgB5ARqB57AODHhdgzvsaoQC8CbTJ0SQ
- pK7hMMabGiM4vjaCKuzHwEclZ82E6nRB1BZUwPMhk5EOBWluSGWmu6rgyVWCrLi6XF3j
- 5na5qlxtIEyUV4yhorWrMQsQrG8AnNBUeCLfaB1MtjY2FkM/WUI/cAs072qEHtoHeoBY
- LMqKQqPsdDCmpK+uYXJDuLPCGuYrGmEWQHxP1zWET4PkNjZCq5xBToHjVQtMAzyHgOec
- NKjPTfQCvksndNHY1SX0Wd/gcYdPd3VZu4T1lshHMBpewA8URJDQRIA8gjvr4F6IPG6r
- OAdujxvYahQwHQEifVOiwGf/9wjnD/INdxYAt/kiwoU/EMJF3wfh4u+FcMkgp7cgXAo8
- lwgIj/zPITzqFoTL/j3C/CDfwORo4JYXES7/gRAe830QrvheCFcOcnoLwlXAc6WA8Nj/
- HMLVtyA87t8jPH6Qb2ByAnA7XkR44g+EcM33Qbj2eyE8aZDTWxCuA54nCQhP/s8hPOUW
- hOv/PcJTB/kGJm8DbqeKCE/7gRC+/fsg3PC9EG4c5PQWhKcDz40CwncMIsxbw2ioHu4c
- pnbRD66YZwyBHDwlWoPK6WnIAbQD9l3TgV6iPkfdTBGaQxShcxDXQV0zlLmpe9AU2HiX
- QFwIVA00EmgNPivSeuYAWiPkgUqIA2g93G+EdCf0qYH79PC4m+dEcti93A/50eDXC5t3
- EvZtwAyUwpES0M1f4hBJOC+S3iz6f7EMSuRwcqOEOAlOpdRiCw3SIp34TIQMUGKEXRdC
- ZiCLWI9gD3Ea/O73iXyiDfZLqeQeain1HN1Of800sMnsW5yFq+bauS8k5ZLjUiStkx6Q
- Ncj+DLyWI0Sdh/0rCZyWJc6muCxwIIA4VQSh80BCHtLkJxFEASFIs5+g4+LYpgWPQy80
- mhbMzslVu9V+oHJqU+TG7+mT18ZEqJrrcM4BvTsAkJHwHALGLkOX+Lpq3IDbMPkIuYPa
- Kd0vjUgiUiZVihHLMJjgJBIIpIil8UZMUi6dVOrVQJmOpr0aaCCT0aRESjE0lhGYRISD
- 5SK4kZeA689IpCQNuX28RqEwGi30M/gZqVmu2O3eOBNONsy1V0010ai5trK14ouqChMq
- M5aWldZES6Ol6qIyrNYUFcFfXZS1LjO4SjUBPBTqtDVM9TWuyzQNFJBQQPY1BgfarlOV
- lrJAOdm4qQk1YRnW5mIP6SY9mNz0u/61nxH6S9uiJ559m3icmE6sj64g51wbgyOxahH1
- HYALBSkpzG4qepAvnK6Yrm4n2hXt6vuIFW52nKJaTdg5ZxLl1AKGfs5hJGQOP0flWBck
- 5XgsaRK9N9VgDqRF8Kwj7o55MMTaq8J4alV/q+m/2o/KomX9mqKsaJEwtpzsMSt5jclC
- c2Yv42NNVBDTFi6IURDDcccDD8AIcKggP2+E3+dxq4ckSbdL2GexDGtIxAFM9K2uumt5
- +YOxH+NDR2tzHpu4Krb8NWIFJhbxkwI1SwrnNK6N/Ta6lazzFDz2eMgWK4pObx8z67li
- Z/Q6rX3qjhUbGrP8wfzm/ZvueRmkYnr8Er2EvoLsICmH+RIrvQNvp0kndlIP4nX0ei1d
- z5EP29VqPVNsJ+XFeomDcDjMZA5RospRW1ySHLPZ6drtbk8AUNM/MHwYOSor6xchUPWL
- wy9GNqNX61N6rT6ZQRJCCp0qhDXqJBVrgxyNyBDGBEVKTfIQStJAwFmYEKYwBMKZEFaV
- qkqDwUQoFDzQhJs4bPRkYk8yUqs0uQBgQS7DMm6X36dWFeS7PZQDj1Cfcb/e83Hs279+
- 88k9Ix1nLFu6Yx/G0StXXj6Ox6bSV2KXTmzaE3s39nosFvvZ/sbNX/345K5f4pdx5fnf
- w/oh0EsgJ3NAThSw8ufzznXq7RoixMkcSQRyGDkuR2uxKLxKs9ly0d2xXhSCmqiIgSAA
- UXHgPmxQe/U+hqVZiiVZgqUZqYqD0RogkGhkIczqYAcPQwwG04RxeYWRwJWnIkAaRBFQ
- 61gCpv586+hl40ssSR//Nfbsm0Q9ztq7rWFX7OFo9wG9/+7GDfVjsRpnXt9Jaz88E7vw
- x5OxHhgDhvMBRB2AMUhQEW9iHRQlIR2gLyUccye2yEjOi8xSWQTffsS97ZOBIYhifBmm
- sFQU4pxsrVvvVgvk6Sav33ibuBDNOkuf7I2Vd0fnCjjNiX8snLugZORBF/hRVuZhvJYg
- 7dhJP4zX21510TyXROkNpGqRYbWBSDKoFdTDySq1Q6vR6NniZFLPKYotEg/h8ZAOTQRP
- 4FUklUOWqLxai1ea4zCnwAHy/CPu9sUJBgfkLKrqh9WVEDVR1kCdiEVFTQMqRZyBdKsb
- yW1elw975VYpSJYbAgZRIUyQNCWzK0JI4mRDmCYggIm4KWyimAlyhowG7aCguUMpWnce
- IOEHYfPcFDY/+cWOX+e8nvL7l9+O/eELTJ3FNBkbQaztzG6tfeit2PWf/vLNUzjTTX9e
- d0/s091bY+/ELsSuxY5+iYmXbvz55N3B8fvfx0vxkkvnCXHOzsHEbYE5I5FReFNxHKYR
- ocwgnEsKZoHIys7R5qo9586dE9Q9tKqLf0B/BfgnwfsVG+ri09eBwTyLXyPe5M5JmTGc
- vjiJtBazEhths8k0OaTFYcqRme2Oj4Yt3ZtoJtZsCFkUAJrES/sMSlMIbKEmhC0cpFQM
- pIxyfQhrCQjMUmsIqSkIBMzEBSuCB293jAa1iiUGFqXGjTR5KiSsWJ3GTVK7TmzZ2xfb
- Fjt05tATp+B40vqn2F//dDn26d+xXklfufZa7Hzs6KU4+vQjPB6nvY9V157HK7+Fo8LS
- 2NnYu1djh+mZIHvN8Q+ov8HYs+DMKsbPDCT5PT5fvjLPPdY323efckWK5E7OpDR6iUZl
- m/JAMilVFienJEtJymZ6WJeVFbQV60iqOCjJJqRKTp2S7EzNzlabvMZxnDfVEnJ61eOQ
- N8ucE3rO3T6wxEHBf6foNGqwXUBDFJ5aYyzKjOY2LRHFryY1U+1EHOEjfBlexmvxkeko
- iDIyxYhOAztg1zqDyKo3BbHZhDOoIJL4ZUHsleFMSLMBCBwaG1QaIBARVqlEIRUwFrSi
- 8HvggQfACoKZEBShYEmysM/vyxuRkhui9B5IepIZvc5ocApt9DpKkNwCjB3siDnXFs/o
- mTDx+bOvTd6INde/xGNOJOXccSn81PSS8+9sm7wx9uM/xf68axdJ1OBLq2q3uEY9d29u
- yJuRnjfj6Bux333bUXbPE7MXhlzZWckl8/uuvrdxw58pcKcwnLciCuQT/JURvAUzDsQS
- FCcB3wBdJ0gvTV1nzJzgHNSqrtZchZV7VXQOBKUDdhTMuqBt1O486lxM/VZMTZ/svvbf
- tBKUmeDXTIl/Ip6kJsEZeSn6DV+Ylo2lKplVbvPnVqsWSNpVbBGnkUtIa4hNkdhVcntJ
- kMgMlBwtIUpCaV6NiqU5mz/ZaIvgLt5jtDtZvz1TRtjzZKVsaalNxwbS9qVYRlkDtvFJ
- /kLzyFE/xTtgQMfwdjSggRIicDnaN7hkyvpBWQpT3wRKKbM/s1/QQWpjwvqn5hfokxE2
- e3F+khuZHKCSDC6dG7uTUQHhRha70Q0DhmBA/3w3pU0p4pSOxEqchEHl6LFgG0bAfIJb
- 4BmFc0Mwn2odNIJHKMEa+n1+IYK5zy/QYuXS2lmN291toUWzc+px7yi9/KH7Hi1xS/fR
- f3/hZMdyo1fuUKel+5rSDJKCd+7fdvL4jq53p6eP27NZb2OUClvWfLyQSzdlzKifmFb/
- xq7q6p3RHbZkklwrZ8o9fHX7Tx7Z9qIWXxZsAJy0k+epWvCNrWgvn7XXjHea9nEHTOR4
- Tr1LR5I6xm5hFXadzMparUaVX4NJP6G22KV+o9kGrx/ZI+6lq77T76U1/UVFgvkZsrDE
- 9TQCmTmvXC/1IaVW5Uv4EGbIgQ/hFn0ImUHhAx8CAomJ8Qk+hPuf+BDCcmlChoQHAbAm
- EMwVoCNAR+WyxMXPjd2qpatfHp/9yJbFD5m7HX858d41rHnfRtWGP5zz0L5Fz+3+ZP2K
- D17HuV/Aa4JiGjAojF8i++kz4Gvb0Qo+VKAcq7xduZfab6W9nI5IsqsQZ7ezWilhN8ro
- TG2mKqDWWJwyv8XscK5zLy0fOvzoZbDA/YIbpQbPWBy6xWSTSBHGJhmMzQYBMhM+JLVy
- Phgg/EUloBFEQRQQRg/q16gGS5EnDAvljdDk/m3L7lW799z3yH7cVZ898tDzZS/ffSR2
- 7Zvf4llffXjuF6+df4soGOGYQNivjdo2pwFnXPsjvh3WW3X8EmWBNxc2eMvlxXJ+5Q7u
- ScteJ0kriSRap1dqkvQ6Xs7ruIAFT5C9Sp7Fb5BnrR9xH0suOj/yfGX8yiM7qz6rIWZw
- tDsl6SmDPaWIYVmD225jpXaDzMvusO21HbV9aKO8hiSvjTZL5axa6U+y+2mLPyWT9ZvN
- Pv/77j1NCYCil0X9+35U3DWIm4espkE5uekFiJBVIQ9Fk/BaCNMU4wTPUKPSqnQqipF7
- k60pPuRCdh922CVG1odkeqUPK5QeixuKaAg4E8iVQgVBwrAlXFBYm2nBtAfwkia0BPYe
- oE9hBbodsBIFF1SJYV0yolOKcgUdDIqXxUTvxcJ8jerGN/TjOx6dmq07zE7KmbJy9JQ3
- Y3/Ept9jpyx1/KH799HYQ42987bJC8c//8LrTfljSzZn1tlU2APvxghcHvMtr3rwSBcW
- Pr6AORkZKyG/gjlxogx4a3mUr8nXjePGSRq4Rskj8v3Wffb9/j3BY1YZz5GG5ICyT5oM
- ao5iAnazVGOXJmWymZm0jcw0ZGYEaEu2XOlXjPL5beas7CGCeLW/SEA6evnbQUdLkMiE
- kyXim+5JtThk6hSvyudx+Hwo1QKBWqZ0oySlXOG1J/uw3xqA9SgH4z+g3AZsliitgoTm
- 5YKDy7iTff7cAQMmarAUNSxDJCo6cXWC2sPE/TNz8/aULo6dO/S18qjCP/Khd3kfmb9z
- 1Sux65g9jite/NGpKu/W+89MSo9doMpHecasuxF6u+PSrpeq/aVbpv1mSt3fsR0rcGZs
- 9+meWU/95GT3nDVEBuCJ4c0rEteuAdXz6SCdnJE1cn7Kr13OLuc4rYLQwumD2s6werlU
- EZBaTFgfQAaz0QRffxxxz06s3cE9ICorFVduERb2f6gJ/DXQ2wll7VELOz2wx2rPml4+
- 9/YH/1CfccyRs27xq730megnk91FLzQ+E51MvNBR0PDUxeibwnwTAn+4RPQJWZTP29gr
- FDDNkFLBpIJ8BFgSFKPkwHec9EVL+wZtalkN+HSC06jO1XvWHIUflXb9In3ybXHs66Fv
- 4ZyARAEeRklKaegU+kSkmaKHdAkbXGEHD0st0dn63l7RAx3Aj/FSY5EPreVLWI5VMklG
- zqg0Jvk5PyzlavM02XyZ3OOVWuwes5SgjF633WhXMCxirDYvqZWmwjPVAfhwA/dYAsL3
- KjzoukwvCI/ZnxrBiqEgX1Zd7b8aHWAGzhLAaeiHzYBR3G/fRFw/gLjxppUE4AdwHzID
- PfyIxiWdtekppc+3flSbduLOmvYnj1oCi+ft7aWydk5KGVmWUjWt/umpm6IFxFd31m3a
- E91MnFgUmvDMu8LMiPNC9sM6NIPlm8nnHGXOMgTF6Bi/roNZxtI6OaEzqew0DNMkk1pY
- iwXJAxKLDWeaAmZktoILcov4JFRbwu7BuPrBtRwQIQxCpB8yFEGGQNcoMcgRXnNw4oG2
- y3XpR+3Zq/nA+MIMay/eC/zPnPLs7c8LsjS7dK7CUJ63ZEH0XWAWZrok/jHlBnsth72t
- GT3O5+7ktqueNLxE7eP2qPYbItyb3IfUFeUfdPJijrGbWLldIzOzZrOe8CdZrBK/3myx
- RrAErPaAVk44xYMWO6Ee4PjOJ9NKQIOqCR9mjZCiFZCS6uQ+hFUQcAYw0qQSAsHpEYMg
- GOcUjXgeInithlwNbPEJN1gw0TB/ujZ74vGXtm9/AT7YuBH7+29iN7DmS2YZTtqzfeYT
- N3oOXiYvxb6OXY1FY6/g4A1wnHgalgrIOLEF5FONJvE+P+lTFJBjKUrJqQilRC2R+zlh
- itRSzqLFgl1GZo02gitB6FaLRgdWNkyNIPo1ZX3RPtCHA2c7wtoWp8Vg1GeCmRWW9fqD
- +hfvpE12lVX1yBYQo2P5uwjyFEl0L43uFNaKMf4NIaGnA/JTfqLIlJ5W4ggu472UochI
- Mkqp2gJLAb6ICCC9Up9EOkmCvGGAU4Yb7vkDHlK0qagvSzB0iSWQlfCa+1XRy+LChDWu
- Bmd/0Cf05YEPkLvv1YMHffochUPnHONfPX3zZnp67IOt0cpCrQwTmyTcA/OJ17eKuqYz
- /jn5WxAT4cRzJl8c0b2pIyRaTmfWmnWpzAryQ1CPiFZKEaOQ0iAXJtZkArcrUxqQyywW
- HBCYfe+mJhKPhQT4Bm1IWSk4yqJaxLBTFxkF5S44KgWi7YSNi9qLCy3ZD/20wtt7gPCM
- mL/1Sn0G7qbgRG3KiOZ9039MKK9feGZk2tQnp6wnPoLjWAzf0CB6N5UFHwG6+NVjqQMS
- GBKuYsfJ1pFd3FrpW0Qf+QZ7jntDek4mm8e2c63SBbIOdiXXIV0pW8t2yaRCW2IsuQLd
- S5O3pxpSQRapElxCPYYfoxgJhUkZnBcwcjhh5qQykpUqYZLgNGcXR1J9UkLSJ0N4l9ys
- mA/yYoZNDRx4FhUN/hNHn4mDT2OpsEuYMHklL6cDGhgxCmjkchm9ThWEP3zd1SuBbyqk
- EbyB12rApWUZihYaMqyEk0jhlHUDr9RQFCmTw7DFW/G6mky4d1WfiRZOTLlVqtfFxLpV
- qr7BEuGodMmSJeC0WIlcK4bjUhm4Fh++c+Gt937dGzt34tKvTsR+QWXd6CUn3jhGjr1+
- gRx54zUAFHScPjZO9DUETfEWf1eX/hHTXhPJMkamUFOtadDMZ1eQK9iNup3wBmCnfodh
- h3Ef2mdQVaMJ+rHGc3qqgn6DJtbRe9AevJfeZ6RTUmmT3mgA+6WXy5LsnFJQLAYrAAor
- tduoN3XLHzOAfnnfLaApHB/XXDYlsBwAMqFmAOKQOctUVlpaKqxHgI7X6PXIYFikMRpN
- NMaLQCpMcKgsQCNEHMSAQk72EnD+m3AuQxIswcBuyZ8nOHD5BaNwASBDku6zvodmlz/d
- +bQv4MhKU4WyVPQoZWzZ29iJqaz5sc2xr1+JzetluBcVjNvEPZFC1d7YST4oYCX+4q3w
- rdQ/+1mhEHxosJJ++PYqDb77CqF8VIAqUJX4HdZ48VurSeK3YMIXV7ejBjQdzYC7BAkX
- joHgY1d4Q4Gm1o2eVlERrG5d2NG6bMGcFrGFWA2B8B1uJ9DjQM8BhYFOA50H+hToL0J3
- QCogF1A2EA9UB9QMtBioE+hxoOeAwkCngc4DfQr0l8RACVV84IfgN5jG8E7m1nz5sPyY
- YfmKYfmqYfmxw/JgwG553qRh+fph+anD8gJaQ/mdMyw/d1henMsh45s/rL5tWH7BsLzw
- fdXQ54nfaQ/p765h9XcPyy8dlhe/sx5y//Jh9SuG5VcK+f8DwY4piwplbmRzdHJlYW0K
- ZW5kb2JqCjQ5IDAgb2JqCjc4NjUKZW5kb2JqCjUwIDAgb2JqCjw8IC9UeXBlIC9Gb250
- RGVzY3JpcHRvciAvQXNjZW50IDc3MCAvQ2FwSGVpZ2h0IDczNyAvRGVzY2VudCAtMjMw
- IC9GbGFncyAzMgovRm9udEJCb3ggWy05NTEgLTQ4MSAxNDQ1IDExMjJdIC9Gb250TmFt
- ZSAvVFBBVkREK0hlbHZldGljYSAvSXRhbGljQW5nbGUgMAovU3RlbVYgMCAvTWF4V2lk
- dGggMTUwMCAvWEhlaWdodCA2MzcgL0ZvbnRGaWxlMiA0OCAwIFIgPj4KZW5kb2JqCjUx
- IDAgb2JqClsgNjY3IDY2NyA3MjIgNzIyIDAgNjExIDc3OCAwIDI3OCAwIDAgMCAwIDAg
- Nzc4IDAgMCAwIDY2NyA2MTEgMCAwIDAgMCAwIDAKMCAwIDAgMCAwIDAgNTU2IDAgNTAw
- IDU1NiA1NTYgMCA1NTYgNTU2IDIyMiAwIDAgMjIyIDgzMyA1NTYgNTU2IDAgMCAzMzMg
- MAoyNzggNTU2IDAgNzIyIDAgNTAwIF0KZW5kb2JqCjIyIDAgb2JqCjw8IC9UeXBlIC9G
- b250IC9TdWJ0eXBlIC9UcnVlVHlwZSAvQmFzZUZvbnQgL1RQQVZERCtIZWx2ZXRpY2Eg
- L0ZvbnREZXNjcmlwdG9yCjUwIDAgUiAvV2lkdGhzIDUxIDAgUiAvRmlyc3RDaGFyIDY1
- IC9MYXN0Q2hhciAxMjEgL0VuY29kaW5nIC9NYWNSb21hbkVuY29kaW5nCj4+CmVuZG9i
- ago1NCAwIG9iago8PCAvTGVuZ3RoIDU1IDAgUiAvU3VidHlwZSAvQ0lERm9udFR5cGUw
- QyAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAF1lHlQU0ccx98j5L0Ij3Qk
- Pol5IYlHDxQQ76u2RcETK4pXFSsRwg0J4QjeQElI8hJICAhyF5BwCAEComLBgzoOFpBq
- B5w6taO21Ske0z+6L7zQNtDO1MH2N7M7u5/d/c7+vrvzgyFnJwiGYY+APbsDAvcu2hIj
- F28Xx6UGy6Wf+uxfNrm0kyIovhETUJ4wJXAiMQaJOdtn22fwne/ynX9jesIQNOAJp1do
- pzq2CRN6Qo+/novNH1dg8/jM89gCPpw+kw8nYO/y4YPvQCgMIxhZ0nrroX+E9Khkm1gm
- TlyyUSo7Jo+Jik4RhX4QHuolWrJmzTKfpX5+q0QB4pjEGJlMmigKCZdLJImiHZFRvqKN
- Ul9vUVBKhK/IPz5etHvyZLJotyRZIk+TRPhOZhEVkygVxSSLxKIUuThCkiCWx4mkkf8j
- Ny1t/80Bwfu2Tzdjiu74Txo0nUKOWAFtgrZBIdBe6IBTAaOd8RiCnKbCYSrk4rAd2gFV
- whgcBFucBE69Ts8YFmf8/V7bWC/8qtcW1Mt4ZXuN/7HH1jG+B125H6cH7R70EOXBtC2c
- 6HPMKA/gaMwJr4kbuGM0GwzYZzMnFrbjtnIUDNnnMNk2z7o026bhfIU7aHvACQZ/2oJw
- sBi5Wa9RXRBy/B6hnGBVrEyzi7DzEI7fviS9IVq4CuXcNVxo1PcQwM/+HRKqiVbGC54j
- SovGfJXHpn784g6I6Acf9sOUFZThmrqcdu1ZFuApfH+gcYJe6EU70x/T/i9pJ7Dk/u2a
- y1eE1dXF5RWdgWbuR9KQ8LXEzoM1XXFCmSWzVT3Iyu3HjW2G8nO1rJsNPY23ie72kwmN
- wqb4kihjCIsNsurSKIsCeD91Hx5bPsJ5PWzLx5eOPUU5z3zoJNwQrU84xKMHULFGqgoT
- /ISo2jXmyzwwgH6lNxtaBGxqg+N80rdZCvcHIxw/agXViXOC88XH9QnEoZhMuUSYdurk
- ifR4li6fLDHxOK19q1FDlF722aTmUU2S6vA/mpd4IAzNu1RQU9PI4gRbGzqreojacvWZ
- NiGb4ucMUivvwGDuCAPwbNtwQ6xeEs6ThKNihc4gFX6M5l2o1jcTVnocCTUlVioEisrm
- jC6io9FY1iFMHY5VKJRJ5Jy048azGcKsgpySeh543Y1eqtWqmoQjqCo6TXuYONSGXNRb
- DE0Ctu3slCMw9cSI51XmlRRbAQRecsv7iq2mKpYfoknMjjwd9gmdz9UoVSlZEZp8kswp
- yTmn/FJdsAh0cDMbss3qctYWRHMsW5qR4E1buOqsM+HKlOwWZZWqbAPQc091ZTdrGlmL
- kaKY0tCiyN/pF9zSg6TGKGcNI7llpvrC+jHQyc0tNNWZzIWRhjS96gXdxS2Q5iflpTme
- 7NU9+DH4Fc9tqNLdJ6hRZLBaq24SPkRz4k9o/Qn7A2SzTGdIdBhX9A0Myu8zwM/UKA5c
- 0ctkQd55wVokN1WXHsajWavR4FSdIWrSwOZ63TXiEb0aCdOmq1MFDxF1rbb4Ig+sA32o
- dq02XhOXRbtJtwYG7Qs9kLRcXpNsyiiW3qg8X9RSca/zZl/LQOu9wjt6cIT1BLlWr81p
- nvQ1KlUbTKxAyEckWcXTDZFkbh1rPZKbQmYF8rxQEAlO4y1i85Ha/d31XFlPcqvkCoue
- 7z/JPv+b9SZbJN0s9vMhKmgAnnXNNg+sxOuAqAI4VwFvw8W80oKyiBZudvoZTRRBjyAh
- qTpjrHC94zeYdVcJ8Atykl6QQG9NolGWHUN2JeuM0cJ1jlTNuusE9QK5bp685/eoMjpZ
- u4tgQwxHgfbZSAmx90i3N0pvJ5/50p2a+xZFuO6UaBq18pEN7nQuyWduIhGBC1M9L3wx
- NsPqYnW1YpgVc9NhMx30XNHeSsx9/OSst3bechlwvYVhA2/tzCylLGUgrPRf0X6XUdd+
- DBvF3N5U/Au/5rvVCmVuZHN0cmVhbQplbmRvYmoKNTUgMCBvYmoKMTQ1OAplbmRvYmoK
- NTMgMCBvYmoKPDwgL1R5cGUgL0ZvbnREZXNjcmlwdG9yIC9Bc2NlbnQgMTI2NiAvQ2Fw
- SGVpZ2h0IDExMjUgL0Rlc2NlbnQgLTM3MyAvRmxhZ3MKMzIgL0ZvbnRCQm94IFstNDE4
- IC00MDUgMTI2NCAxMjk4XSAvRm9udE5hbWUgL0RUUkRFVStIaXJhS2FrdVByb04tVzMg
- L0l0YWxpY0FuZ2xlCjAgL1N0ZW1WIDQwIC9BdmdXaWR0aCAxMDAwIC9NYXhXaWR0aCAx
- NjE4IC9TdGVtSCA0MCAvWEhlaWdodCA4NDQgL0ZvbnRGaWxlMwo1NCAwIFIgPj4KZW5k
- b2JqCjU2IDAgb2JqClsgNTMgNTMgNjQ5IDcwIDcwIDU4OCA3NCA3NCAyMzggODMgODMg
- NDMwIDg1IDg1IDM5MiA4OCA4OCA3NzAgXQplbmRvYmoKNTIgMCBvYmoKPDwgL1R5cGUg
- L0ZvbnQgL1N1YnR5cGUgL0NJREZvbnRUeXBlMCAvQmFzZUZvbnQgL0RUUkRFVStIaXJh
- S2FrdVByb04tVzMgL0NJRFN5c3RlbUluZm8KPDwgL1JlZ2lzdHJ5IChBZG9iZSkgL09y
- ZGVyaW5nIChKYXBhbjEpIC9TdXBwbGVtZW50IDYgPj4gL0ZvbnREZXNjcmlwdG9yIDUz
- IDAgUgovVyA1NiAwIFIgL0RXIDEwMDAgPj4KZW5kb2JqCjIzIDAgb2JqCjw8IC9UeXBl
- IC9Gb250IC9TdWJ0eXBlIC9UeXBlMCAvRW5jb2RpbmcgL0lkZW50aXR5LUggL0Jhc2VG
- b250IC9EVFJERVUrSGlyYUtha3VQcm9OLVczCi9EZXNjZW5kYW50Rm9udHMgWyA1MiAw
- IFIgXSA+PgplbmRvYmoKNTcgMCBvYmoKKP7/VFwwMTV58Gcqii1bmikKZW5kb2JqCjU4
- IDAgb2JqCihNYWMgT1MgWCAxMC42LjIgUXVhcnR6IFBERkNvbnRleHQpCmVuZG9iago1
- OSAwIG9iagoobXpwKQplbmRvYmoKNjAgMCBvYmoKKE9tbmlHcmFmZmxlIFByb2Zlc3Np
- b25hbCkKZW5kb2JqCjYxIDAgb2JqCihEOjIwMTAwMzE4MjIwNTAyWjAwJzAwJykKZW5k
- b2JqCjEgMCBvYmoKPDwgL1RpdGxlIDU3IDAgUiAvQXV0aG9yIDU5IDAgUiAvUHJvZHVj
- ZXIgNTggMCBSIC9DcmVhdG9yIDYwIDAgUiAvQ3JlYXRpb25EYXRlCjYxIDAgUiAvTW9k
- RGF0ZSA2MSAwIFIgPj4KZW5kb2JqCnhyZWYKMCA2MgowMDAwMDAwMDAwIDY1NTM1IGYg
- CjAwMDAwNDY3MjAgMDAwMDAgbiAKMDAwMDAzNTQyMyAwMDAwMCBuIAowMDAwMDAyNDIw
- IDAwMDAwIG4gCjAwMDAwMzUyNjAgMDAwMDAgbiAKMDAwMDAwMDAyMiAwMDAwMCBuIAow
- MDAwMDAyNDAwIDAwMDAwIG4gCjAwMDAwMDI1MjQgMDAwMDAgbiAKMDAwMDAzNTIyNCAw
- MDAwMCBuIAowMDAwMDA0NTQ1IDAwMDAwIG4gCjAwMDAwMDUzNDYgMDAwMDAgbiAKMDAw
- MDAwMzk3NCAwMDAwMCBuIAowMDAwMDA0NTI1IDAwMDAwIG4gCjAwMDAwMDI3NTggMDAw
- MDAgbiAKMDAwMDAwMzM5MSAwMDAwMCBuIAowMDAwMDA1MzY2IDAwMDAwIG4gCjAwMDAw
- MDU4OTggMDAwMDAgbiAKMDAwMDAwNTkxOCAwMDAwMCBuIAowMDAwMDA2NDY3IDAwMDAw
- IG4gCjAwMDAwMDM0MTEgMDAwMDAgbiAKMDAwMDAwMzk1NCAwMDAwMCBuIAowMDAwMDI4
- NDI4IDAwMDAwIG4gCjAwMDAwNDQwOTUgMDAwMDAgbiAKMDAwMDA0NjM5MyAwMDAwMCBu
- IAowMDAwMDAwMDAwIDAwMDAwIG4gCjAwMDAwMzQzMjcgMDAwMDAgbiAKMDAwMDAxNTU5
- NSAwMDAwMCBuIAowMDAwMDIxMjM0IDAwMDAwIG4gCjAwMDAwMjEyNTUgMDAwMDAgbiAK
- MDAwMDAyNDI2MiAwMDAwMCBuIAowMDAwMDA5NTI1IDAwMDAwIG4gCjAwMDAwMTI1NDIg
- MDAwMDAgbiAKMDAwMDAyNDI4MyAwMDAwMCBuIAowMDAwMDI3NTc5IDAwMDAwIG4gCjAw
- MDAwMDY0ODcgMDAwMDAgbiAKMDAwMDAwOTUwNCAwMDAwMCBuIAowMDAwMDEyNTYzIDAw
- MDAwIG4gCjAwMDAwMTU1NzQgMDAwMDAgbiAKMDAwMDAyNzYwMCAwMDAwMCBuIAowMDAw
- MDI4NDA4IDAwMDAwIG4gCjAwMDAwMjg0NjUgMDAwMDAgbiAKMDAwMDAzNDMwNiAwMDAw
- MCBuIAowMDAwMDM0MzY0IDAwMDAwIG4gCjAwMDAwMzUyMDQgMDAwMDAgbiAKMDAwMDAz
- NTM0MyAwMDAwMCBuIAowMDAwMDM1NjAwIDAwMDAwIG4gCjAwMDAwMzU0NzEgMDAwMDAg
- biAKMDAwMDAzNTU3OCAwMDAwMCBuIAowMDAwMDM1NzA3IDAwMDAwIG4gCjAwMDAwNDM2
- NjMgMDAwMDAgbiAKMDAwMDA0MzY4NCAwMDAwMCBuIAowMDAwMDQzOTA5IDAwMDAwIG4g
- CjAwMDAwNDYxODggMDAwMDAgbiAKMDAwMDA0NTg0OSAwMDAwMCBuIAowMDAwMDQ0Mjcw
- IDAwMDAwIG4gCjAwMDAwNDU4MjggMDAwMDAgbiAKMDAwMDA0NjEwOCAwMDAwMCBuIAow
- MDAwMDQ2NTI3IDAwMDAwIG4gCjAwMDAwNDY1NjEgMDAwMDAgbiAKMDAwMDA0NjYxMyAw
- MDAwMCBuIAowMDAwMDQ2NjM1IDAwMDAwIG4gCjAwMDAwNDY2NzggMDAwMDAgbiAKdHJh
- aWxlcgo8PCAvU2l6ZSA2MiAvUm9vdCA0NCAwIFIgL0luZm8gMSAwIFIgL0lEIFsgPDM2
- ZjFjMjU4NjQxNzcwZWI4OTA1ZTExZWRjM2Q0MGFmPgo8MzZmMWMyNTg2NDE3NzBlYjg5
- MDVlMTFlZGMzZDQwYWY+IF0gPj4Kc3RhcnR4cmVmCjQ2ODQwCiUlRU9GCjEgMCBvYmoK
- PDwvQXV0aG9yIChtenApL0NyZWF0aW9uRGF0ZSAoRDoyMDEwMDMxODExNTAwMFopL0Ny
- ZWF0b3IgKE9tbmlHcmFmZmxlIFByb2Zlc3Npb25hbCA1LjIuMSkvTW9kRGF0ZSAoRDoy
- MDEwMDMxODIyMDUwMFopL1Byb2R1Y2VyIDU4IDAgUiAvVGl0bGUgKGdyYXBoaWNzKT4+
- CmVuZG9iagp4cmVmCjEgMQowMDAwMDQ4MjM4IDAwMDAwIG4gCnRyYWlsZXIKPDwvSUQg
- WzwzNmYxYzI1ODY0MTc3MGViODkwNWUxMWVkYzNkNDBhZj4gPDM2ZjFjMjU4NjQxNzcw
- ZWI4OTA1ZTExZWRjM2Q0MGFmPl0gL0luZm8gMSAwIFIgL1ByZXYgNDY4NDAgL1Jvb3Qg
- NDQgMCBSIC9TaXplIDYyPj4Kc3RhcnR4cmVmCjQ4NDA3CiUlRU9GCg==
- </data>
- <key>QuickLookThumbnail</key>
- <data>
- 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
- ACcIAAAASG1tb2QAACdQAAAAKGNwcnQAACd4AAAAJFhZWiAAAAAAAABnFgAAOpUAAAe8
- WFlaIAAAAAAAAGuMAACtvgAAJE1YWVogAAAAAAAAJDQAABetAACnJFhZWiAAAAAAAADz
- UgABAAAAARbPc2YzMgAAAAAAAQxCAAAF3v//8yYAAAeSAAD9kf//+6L///2jAAAD3AAA
- wGxjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQA
- WQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADV
- ANoA4ADlAOoA8AD1APsBAQEHAQwBEgEYAR4BJQErATEBOAE+AUUBSwFSAVkBYAFmAW0B
- dQF8AYMBigGSAZkBoQGoAbABuAHAAcgB0AHYAeAB6QHxAfoCAgILAhQCHAIlAi4CNwJA
- AkoCUwJcAmYCcAJ5AoMCjQKXAqECqwK1Ar8CygLUAt8C6gL0Av8DCgMVAyADKwM3A0ID
- TQNZA2UDcAN8A4gDlAOgA6wDuQPFA9ID3gPrA/gEBAQRBB4ELAQ5BEYEVARhBG8EfASK
- BJgEpgS0BMIE0QTfBO4E/AULBRoFKAU3BUcFVgVlBXQFhAWTBaMFswXDBdMF4wXzBgMG
- FAYkBjUGRQZWBmcGeAaJBpoGqwa9Bs4G4AbyBwMHFQcnBzkHTAdeB3AHgweWB6gHuwfO
- B+EH9AgICBsILwhCCFYIagh+CJIIpgi6CM4I4wj3CQwJIQk2CUsJYAl1CYoJoAm1CcsJ
- 4An2CgwKIgo5Ck8KZQp8CpIKqQrACtcK7gsFCx0LNAtLC2MLewuTC6sLwwvbC/MMDAwk
- DD0MVgxuDIcMoQy6DNMM7Q0GDSANOg1UDW4NiA2iDbwN1w3xDgwOJw5CDl0OeA6TDq8O
- yg7mDwIPHg86D1YPcg+OD6sPyA/kEAEQHhA7EFgQdhCTELEQzhDsEQoRKBFGEWQRgxGh
- EcAR3xH+Eh0SPBJbEnoSmhK5EtkS+RMZEzkTWRN6E5oTuxPbE/wUHRQ+FF8UgRSiFMQU
- 5RUHFSkVSxVtFZAVshXVFfcWGhY9FmAWgxanFsoW7hcSFzUXWRd9F6IXxhfqGA8YNBhZ
- GH0YoxjIGO0ZExk4GV4ZhBmqGdAZ9hodGkMaahqQGrca3hsGGy0bVBt8G6MbyxvzHBsc
- QxxsHJQcvRzmHQ4dNx1gHYodsx3dHgYeMB5aHoQerh7YHwMfLR9YH4Mfrh/ZIAQgMCBb
- IIcgsyDeIQohNyFjIY8hvCHpIhUiQiJwIp0iyiL4IyUjUyOBI68j3SQMJDokaSSXJMYk
- 9SUkJVQlgyWzJeImEiZCJnImoybTJwMnNCdlJ5Ynxyf4KCooWyiNKL4o8CkiKVUphym5
- KewqHypSKoUquCrrKx4rUiuGK7or7iwiLFYsiiy/LPQtKS1eLZMtyC39LjMuaS6eLtQv
- Cy9BL3cvri/kMBswUjCJMMEw+DEwMWcxnzHXMg8ySDKAMrgy8TMqM2MznDPVNA80SDSC
- NLw09jUwNWo1pTXfNho2VTaQNss3BjdCN343uTf1ODE4bTiqOOY5IzlgOZ052joXOlQ6
- kjrPOw07SzuJO8c8BjxEPIM8wj0BPUA9fz2/Pf4+Pj5+Pr4+/j8/P38/wEAAQEFAgkDE
- QQVBR0GIQcpCDEJOQpFC00MWQ1hDm0PeRCFEZUSoROxFMEV0RbhF/EZARoVGykcOR1NH
- mUfeSCNIaUivSPVJO0mBScdKDkpVSptK4ksqS3FLuEwATEhMkEzYTSBNaE2xTfpOQk6M
- TtVPHk9nT7FP+1BFUI9Q2VEkUW5RuVIEUk9SmlLlUzFTfFPIVBRUYFStVPlVRlWSVd9W
- LFZ6VsdXFFdiV7BX/lhMWJpY6Vk4WYZZ1VokWnRaw1sTW2NbslwDXFNco1z0XURdlV3m
- XjdeiV7aXyxffl/QYCJgdGDHYRlhbGG/YhJiZWK5YwxjYGO0ZAhkXGSxZQVlWmWvZgRm
- WWavZwRnWmewaAZoXGiyaQlpX2m2ag1qZGq8axNra2vDbBtsc2zLbSNtfG3Vbi5uh27g
- bzpvk2/tcEdwoXD7cVZxsHILcmZywXMcc3hz03QvdIt053VDdaB1/HZZdrZ3E3dwd854
- K3iJeOd5RXmjegJ6YHq/ex57fXvcfDx8m3z7fVt9u34bfnx+3H89f55//4BggMKBI4GF
- geeCSYKrgw6DcIPThDaEmYT8hWCFw4YnhouG74dUh7iIHYiBiOaJTImxihaKfIrii0iL
- rowUjHuM4o1Ija+OF45+juWPTY+1kB2QhZDukVaRv5IokpGS+pNkk82UN5ShlQuVdZXg
- lkqWtZcgl4uX95himM6ZOpmmmhKafprrm1ebxJwxnJ+dDJ15neeeVZ7DnzGfoKAPoH2g
- 7KFbocuiOqKqoxqjiqP6pGqk26VMpbymLqafpxCngqf0qGWo2KlKqbyqL6qiqxWriKv7
- rG+s461WrcuuP66zryivnbARsIew/LFxseeyXbLTs0mzv7Q2tK21JLWbthK2ibcBt3m3
- 8bhpuOG5WrnSuku6xLs+u7e8MLyqvSS9nr4ZvpO/Dr+JwATAf8D6wXbB8cJtwunDZsPi
- xF/E3MVZxdbGU8bRx07HzMhKyMnJR8nGykXKxMtDy8LMQszBzUHNwc5CzsLPQ8/D0ETQ
- xtFH0cjSStLM007T0NRT1NbVWNXb1l7W4tdl1+nYbdjx2XXZ+tp/2wPbiNwO3JPdGd2e
- 3iTeqt8x37fgPuDF4Uzh0+Ja4uLjauPy5HrlAuWL5hPmnOcl56/oOOjC6Uzp1upg6urr
- dev/7IrtFu2h7izuuO9E79DwXPDp8XXyAvKP8xzzqvQ39MX1U/Xh9m/2/veM+Bv4qvk5
- +cn6Wfro+3j8CPyZ/Sn9uv5L/tz/bmN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMA
- KAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCk
- AKkArgCyALcAvADBAMYAywDQANUA2gDgAOUA6gDwAPUA+wEBAQcBDAESARgBHgElASsB
- MQE4AT4BRQFLAVIBWQFgAWYBbQF1AXwBgwGKAZIBmQGhAagBsAG4AcAByAHQAdgB4AHp
- AfEB+gICAgsCFAIcAiUCLgI3AkACSgJTAlwCZgJwAnkCgwKNApcCoQKrArUCvwLKAtQC
- 3wLqAvQC/wMKAxUDIAMrAzcDQgNNA1kDZQNwA3wDiAOUA6ADrAO5A8UD0gPeA+sD+AQE
- BBEEHgQsBDkERgRUBGEEbwR8BIoEmASmBLQEwgTRBN8E7gT8BQsFGgUoBTcFRwVWBWUF
- dAWEBZMFowWzBcMF0wXjBfMGAwYUBiQGNQZFBlYGZwZ4BokGmgarBr0GzgbgBvIHAwcV
- BycHOQdMB14HcAeDB5YHqAe7B84H4Qf0CAgIGwgvCEIIVghqCH4IkgimCLoIzgjjCPcJ
- DAkhCTYJSwlgCXUJigmgCbUJywngCfYKDAoiCjkKTwplCnwKkgqpCsAK1wruCwULHQs0
- C0sLYwt7C5MLqwvDC9sL8wwMDCQMPQxWDG4MhwyhDLoM0wztDQYNIA06DVQNbg2IDaIN
- vA3XDfEODA4nDkIOXQ54DpMOrw7KDuYPAg8eDzoPVg9yD44Pqw/ID+QQARAeEDsQWBB2
- EJMQsRDOEOwRChEoEUYRZBGDEaERwBHfEf4SHRI8ElsSehKaErkS2RL5ExkTORNZE3oT
- mhO7E9sT/BQdFD4UXxSBFKIUxBTlFQcVKRVLFW0VkBWyFdUV9xYaFj0WYBaDFqcWyhbu
- FxIXNRdZF30XohfGF+oYDxg0GFkYfRijGMgY7RkTGTgZXhmEGaoZ0Bn2Gh0aQxpqGpAa
- txreGwYbLRtUG3wboxvLG/McGxxDHGwclBy9HOYdDh03HWAdih2zHd0eBh4wHloehB6u
- HtgfAx8tH1gfgx+uH9kgBCAwIFsghyCzIN4hCiE3IWMhjyG8IekiFSJCInAinSLKIvgj
- JSNTI4EjryPdJAwkOiRpJJckxiT1JSQlVCWDJbMl4iYSJkImciajJtMnAyc0J2UnlifH
- J/goKihbKI0ovijwKSIpVSmHKbkp7CofKlIqhSq4KusrHitSK4YruivuLCIsViyKLL8s
- 9C0pLV4tky3ILf0uMy5pLp4u1C8LL0Evdy+uL+QwGzBSMIkwwTD4MTAxZzGfMdcyDzJI
- MoAyuDLxMyozYzOcM9U0DzRINII0vDT2NTA1ajWlNd82GjZVNpA2yzcGN0I3fje5N/U4
- MThtOKo45jkjOWA5nTnaOhc6VDqSOs87DTtLO4k7xzwGPEQ8gzzCPQE9QD1/Pb89/j4+
- Pn4+vj7+Pz8/fz/AQABAQUCCQMRBBUFHQYhBykIMQk5CkULTQxZDWEObQ95EIURlRKhE
- 7EUwRXRFuEX8RkBGhUbKRw5HU0eZR95II0hpSK9I9Uk7SYFJx0oOSlVKm0riSypLcUu4
- TABMSEyQTNhNIE1oTbFN+k5CToxO1U8eT2dPsU/7UEVQj1DZUSRRblG5UgRST1KaUuVT
- MVN8U8hUFFRgVK1U+VVGVZJV31YsVnpWx1cUV2JXsFf+WExYmljpWThZhlnVWiRadFrD
- WxNbY1uyXANcU1yjXPRdRF2VXeZeN16JXtpfLF9+X9BgImB0YMdhGWFsYb9iEmJlYrlj
- DGNgY7RkCGRcZLFlBWVaZa9mBGZZZq9nBGdaZ7BoBmhcaLJpCWlfabZqDWpkarxrE2tr
- a8NsG2xzbMttI218bdVuLm6HbuBvOm+Tb+1wR3ChcPtxVnGwcgtyZnLBcxxzeHPTdC90
- i3TndUN1oHX8dll2tncTd3B3zngreIl453lFeaN6Anpger97Hnt9e9x8PHybfPt9W327
- fht+fH7cfz1/nn//gGCAwoEjgYWB54JJgquDDoNwg9OENoSZhPyFYIXDhieGi4bvh1SH
- uIgdiIGI5olMibGKFop8iuKLSIuujBSMe4zijUiNr44Xjn6O5Y9Nj7WQHZCFkO6RVpG/
- kiiSkZL6k2STzZQ3lKGVC5V1leCWSpa1lyCXi5f3mGKYzpk6maaaEpp+muubV5vEnDGc
- n50MnXmd555VnsOfMZ+goA+gfaDsoVuhy6I6oqqjGqOKo/qkaqTbpUylvKYupp+nEKeC
- p/SoZajYqUqpvKovqqKrFauIq/usb6zjrVaty64/rrOvKK+dsBGwh7D8sXGx57JdstOz
- SbO/tDa0rbUktZu2EraJtwG3ebfxuGm44blaudK6S7rEuz67t7wwvKq9JL2evhm+k78O
- v4nABMB/wPrBdsHxwm3C6cNmw+LEX8TcxVnF1sZTxtHHTsfMyErIyclHycbKRcrEy0PL
- wsxCzMHNQc3BzkLOws9Dz8PQRNDG0UfRyNJK0szTTtPQ1FPU1tVY1dvWXtbi12XX6dht
- 2PHZddn62n/bA9uI3A7ck90Z3Z7eJN6q3zHft+A+4MXhTOHT4lri4uNq4/LkeuUC5Yvm
- E+ac5yXnr+g46MLpTOnW6mDq6ut16//siu0W7aHuLO6470Tv0PBc8OnxdfIC8o/zHPOq
- 9Df0xfVT9eH2b/b+94z4G/iq+Tn5yfpZ+uj7ePwI/Jn9Kf26/kv+3P9uY3VydgAAAAAA
- AAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQBy
- AHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDaAOAA5QDqAPAA
- 9QD7AQEBBwEMARIBGAEeASUBKwExATgBPgFFAUsBUgFZAWABZgFtAXUBfAGDAYoBkgGZ
- AaEBqAGwAbgBwAHIAdAB2AHgAekB8QH6AgICCwIUAhwCJQIuAjcCQAJKAlMCXAJmAnAC
- eQKDAo0ClwKhAqsCtQK/AsoC1ALfAuoC9AL/AwoDFQMgAysDNwNCA00DWQNlA3ADfAOI
- A5QDoAOsA7kDxQPSA94D6wP4BAQEEQQeBCwEOQRGBFQEYQRvBHwEigSYBKYEtATCBNEE
- 3wTuBPwFCwUaBSgFNwVHBVYFZQV0BYQFkwWjBbMFwwXTBeMF8wYDBhQGJAY1BkUGVgZn
- BngGiQaaBqsGvQbOBuAG8gcDBxUHJwc5B0wHXgdwB4MHlgeoB7sHzgfhB/QICAgbCC8I
- QghWCGoIfgiSCKYIugjOCOMI9wkMCSEJNglLCWAJdQmKCaAJtQnLCeAJ9goMCiIKOQpP
- CmUKfAqSCqkKwArXCu4LBQsdCzQLSwtjC3sLkwurC8ML2wvzDAwMJAw9DFYMbgyHDKEM
- ugzTDO0NBg0gDToNVA1uDYgNog28DdcN8Q4MDicOQg5dDngOkw6vDsoO5g8CDx4POg9W
- D3IPjg+rD8gP5BABEB4QOxBYEHYQkxCxEM4Q7BEKESgRRhFkEYMRoRHAEd8R/hIdEjwS
- WxJ6EpoSuRLZEvkTGRM5E1kTehOaE7sT2xP8FB0UPhRfFIEUohTEFOUVBxUpFUsVbRWQ
- FbIV1RX3FhoWPRZgFoMWpxbKFu4XEhc1F1kXfReiF8YX6hgPGDQYWRh9GKMYyBjtGRMZ
- OBleGYQZqhnQGfYaHRpDGmoakBq3Gt4bBhstG1QbfBujG8sb8xwbHEMcbByUHL0c5h0O
- HTcdYB2KHbMd3R4GHjAeWh6EHq4e2B8DHy0fWB+DH64f2SAEIDAgWyCHILMg3iEKITch
- YyGPIbwh6SIVIkIicCKdIsoi+CMlI1MjgSOvI90kDCQ6JGkklyTGJPUlJCVUJYMlsyXi
- JhImQiZyJqMm0ycDJzQnZSeWJ8cn+CgqKFsojSi+KPApIilVKYcpuSnsKh8qUiqFKrgq
- 6yseK1Irhiu6K+4sIixWLIosvyz0LSktXi2TLcgt/S4zLmkuni7ULwsvQS93L64v5DAb
- MFIwiTDBMPgxMDFnMZ8x1zIPMkgygDK4MvEzKjNjM5wz1TQPNEg0gjS8NPY1MDVqNaU1
- 3zYaNlU2kDbLNwY3Qjd+N7k39TgxOG04qjjmOSM5YDmdOdo6FzpUOpI6zzsNO0s7iTvH
- PAY8RDyDPMI9AT1APX89vz3+Pj4+fj6+Pv4/Pz9/P8BAAEBBQIJAxEEFQUdBiEHKQgxC
- TkKRQtNDFkNYQ5tD3kQhRGVEqETsRTBFdEW4RfxGQEaFRspHDkdTR5lH3kgjSGlIr0j1
- STtJgUnHSg5KVUqbSuJLKktxS7hMAExITJBM2E0gTWhNsU36TkJOjE7VTx5PZ0+xT/tQ
- RVCPUNlRJFFuUblSBFJPUppS5VMxU3xTyFQUVGBUrVT5VUZVklXfVixWelbHVxRXYlew
- V/5YTFiaWOlZOFmGWdVaJFp0WsNbE1tjW7JcA1xTXKNc9F1EXZVd5l43Xole2l8sX35f
- 0GAiYHRgx2EZYWxhv2ISYmViuWMMY2BjtGQIZFxksWUFZVplr2YEZllmr2cEZ1pnsGgG
- aFxosmkJaV9ptmoNamRqvGsTa2trw2wbbHNsy20jbXxt1W4ubodu4G86b5Nv7XBHcKFw
- +3FWcbByC3JmcsFzHHN4c9N0L3SLdOd1Q3Wgdfx2WXa2dxN3cHfOeCt4iXjneUV5o3oC
- emB6v3see3173Hw8fJt8+31bfbt+G358ftx/PX+ef/+AYIDCgSOBhYHngkmCq4MOg3CD
- 04Q2hJmE/IVghcOGJ4aLhu+HVIe4iB2IgYjmiUyJsYoWinyK4otIi66MFIx7jOKNSI2v
- jheOfo7lj02PtZAdkIWQ7pFWkb+SKJKRkvqTZJPNlDeUoZULlXWV4JZKlrWXIJeLl/eY
- YpjOmTqZppoSmn6a65tXm8ScMZyfnQydeZ3nnlWew58xn6CgD6B9oOyhW6HLojqiqqMa
- o4qj+qRqpNulTKW8pi6mn6cQp4Kn9KhlqNipSqm8qi+qoqsVq4ir+6xvrOOtVq3Lrj+u
- s68or52wEbCHsPyxcbHnsl2y07NJs7+0NrSttSS1m7YStom3Abd5t/G4abjhuVq50rpL
- usS7Pru3vDC8qr0kvZ6+Gb6Tvw6/icAEwH/A+sF2wfHCbcLpw2bD4sRfxNzFWcXWxlPG
- 0cdOx8zISsjJyUfJxspFysTLQ8vCzELMwc1BzcHOQs7Cz0PPw9BE0MbRR9HI0krSzNNO
- 09DUU9TW1VjV29Ze1uLXZdfp2G3Y8dl12fraf9sD24jcDtyT3Rndnt4k3qrfMd+34D7g
- xeFM4dPiWuLi42rj8uR65QLli+YT5pznJeev6DjowulM6dbqYOrq63Xr/+yK7Rbtoe4s
- 7rjvRO/Q8Fzw6fF18gLyj/Mc86r0N/TF9VP14fZv9v73jPgb+Kr5OfnJ+ln66Pt4/Aj8
- mf0p/br+S/7c/25wYXJhAAAAAAADAAAAAmZmAADypwAADVkAABPQAAALA3BhcmEAAAAA
- AAMAAAACZmYAAPKnAAANWQAAE9AAAAsDcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT
- 0AAACwN2Y2d0AAAAAAAAAAAAAwEAAAIAAAADAA8AJABDAG0AowDlASsBeAHQAjYCqwMt
- A7wEVwT/BboGfwdPCC0JGAoRCw8MJA0+DmUPlxDQEhgTahS+FiEXiRj5Gm8b6h1vHvMg
- fCIKI5olKCa7KEsp3ittLPoufzADMYIy+DRoNdE3MTiEOc87FDxUPYw+wz/6QTFCaUOj
- ROFGH0daSJNJy0sATDZNaE6cT85RAVI1U3BUt1YHV2JYuFoNW1lcnF3cXxpgVmGSYs1k
- CGVCZoFnxmkUamZrtWz3bi9vYHCRccZy/XQ1dW12pHfeeSJ6dHvifWV+7oBmgceDEIRQ
- hY+Gz4gOiUKKYotnjFWNPI4rjyqQNpFEkk6TUZRQlVCWV5dkmHeZjpqpm8ec5Z4Anxag
- J6EyojajNKQupSqmKqcxqDupSKpYq26si62vrtCv7LD/sg2zGLQftSO2JLckuCe5LLoy
- uzW8L70fvgS+57/RwMbBxcLJw8zEzMXJxsTHvsi6ybnKt8uxzKHNis5vz1fQRNE10ifT
- GNQF1OzV0Na0153Yitl42mLbQ9wa3Ondud6Q327gUOEz4hTi8uPP5K7ljuZw50/oIujh
- 6Wfp7Opr6urrl+xL7Qftw+6C70PwBfDH8YnySvMI87j0P/Sx9Rv1efXY9lL22fdm9/P4
- gPkO+Zv6Kfq4+0z75vyL/Tb95v6Z/0z//wAAAAMADgAiAEAAaQCdAN0BIgFtAcICIgKR
- AwoDkAQiBMUFdQYxBvoH0AivCZgKjwuSDKQNvQ7gEAgRRBKCE8cVGBZtF8kZLRqaHAcd
- eh7tIGch4yNgJN0mVyfQKU0qwCw0LaEvCzBrMcMzFjRhNZ421TgGOTE6VDt2PJg9uj7d
- QAFBKEJQQ3dEn0XHRu1IE0k5SlpLfUyhTcNO5lANUTdSZlOYVMpV/FcuWF1Zi1q5W+Zd
- E14+X2lglmHFYvVkKWVcZo1nuWjjag5rOWxlbZBuu2/mcRFyPnNxdK5183c7eH15t3rq
- fBt9TH6Af7OA5YIRgzaEVIVqhnyHjoifia2KuovEjMyN1Y7fj+yQ/JISkyyUTJVsloeX
- m5ipmbKatZu1nLKdsJ6xn7WgvKHDos2j3KTxpgunJag7qUyqWatjrGytcq53r3ywgbGI
- spCzmLSjtbG2w7fUuOS58br7vAS9C74RvxbAGcEcwh/DJMQqxTPGP8dMyFbJW8pYy1PM
- S81CzjvPNNAu0SfSH9MV1ArU/dXt1trXxNiu2Zzai9t83GzdWt5I3zXgIuEQ4f/i7+Pb
- 5MLloeZ350roHOjv6cLqleto7DztEu3p7sDvl/Bu8UPyFvLg8530UPT99aj2VPcC97H4
- X/kN+bv6afsW+8D8Yv0A/Yr+E/6P/wv/hf//AAAAAgAKABgALQBKAG4AmwDPAQwBTQGX
- AekCRQKrAxkDkgQTBJ4FMwXRBnkHKgfhCKMJbgpCCxwL+wzjDdIOyQ/CEMERxxLUE+IU
- 9hYKFyUYPhlaGncblBy0HdAe7CAHISAiMyNBJE0lUiZTJ0woQCkrKhMq9SvTLLEtjy5s
- L04wMjEbMgYy9TPmNNc1yDa4N6Y4lDmBOm87WjxGPTE+HT8KP/hA50HYQsdDt0SnRZZG
- g0dxSF5JSkoySxZL+EzZTb1OqE+cUJdRlVKUU5JUkFWNVopXhliAWXlacFtmXF9dXF5e
- X2NgaGFrYm1jbGRkZVBmMWcMZ+xo22naauZr+G0MbiBvNHBHcVpybXOEdKZ11HcLeD15
- YXpwe3F8aH1eflF/RIA3gSmCHIMPhACE8oXlhtiHzYjDibyKtYuvjKmNoo6bj5SQjJGE
- knyTcpRjlUmWIpbzl8SYopmUmpObmZygnaeer5+2oLyhwqLHo8mkxKW2pqKnkaiJqY6q
- mqurrLuty67ar+qw+bIIsxa0JLUvtji3PbhEuVG6ZruCvKC9v77ev/zBGsI3w1XEc8WQ
- xqvHwcjRyeHK+8whzVTOjs/K0QbSQdN61LTV7Nck2FzZk9rK3ADdON5738vhKuKU5AHl
- bubc6Enptesi7JLuDO+o8Xrzk/Xm+GH66f10//8AAG5kaW4AAAAAAAAGNgAAmAkAAFfV
- AABQxAAAimsAACbwAAAXCgAAUA0AAFQ5AALhRwACmZkAAaj1AAMBAAACAAAAGwA7AFkA
- dwCVALIA0ADuAQwBKgFJAWcBhgGlAcQB5AIEAiQCRAJlAocCqALKAuwDDwMyA1YDegOe
- A8MD6QQPBDYEXQSFBK0E1wUBBSsFVwWDBbAF3gYNBj0GbwahBtUHCgdAB3kHswfuCCwI
- bAivCPQJPAmGCdIKIQpyCsQLGAttC8MMGgxyDMoNJA2ADd4OPQ6fDwIPZw/OEDYQoBEM
- EXgR5hJTEr4TJxOQE/cUYRTMFToVrBYhFpkXExePGA0YjBkNGZAaFBqaGx8bpBwnHKkd
- LB2wHjoeyh9fH/ggkiEsIcYiYSL+I5wkPCTdJXwmGCavJ0AnyChQKNYpYSnzKosrLyvb
- LIotOi3rLp0vUzATMOIxyDLHM840yDWzNpk3gjhyOWs6aTtmPF89VD5HPzhAKUEZQgpC
- /0P5RPpGAkcSSCxJUEp3S51Mvk3bTvhQFVEwUkZTWFRnVXlWkle1WOFaE1tLXIldzV8X
- YGFhqmLzZD9llWb8aHxqCWuMbP9uZm/JcS9ym3QPdYl3BniDef57fX0GfqKAUIIEg7OF
- WocAiKmKXIwejeuPuZGBk0OVB5bcmNKa5Zz7nv2g8aLjpNym4KjqqvSs+68EsR6zkbcc
- utq9oMA3wszFW8fpynnND8+u0pTXD9yT4HfkNugB69Xvo/M79on5s/zX//8AAAAcAD0A
- XQB9AJwAuwDaAPkBGQE5AVkBeQGZAboB2wH9Ah4CQAJjAoYCqQLNAvEDFgM7A2ADhgOt
- A9QD/AQlBE4EdwSiBM0E+QUmBVQFgwWzBeMGFQZJBn0GswbqByMHXgebB9oIGwheCKUI
- 7wk7CYoJ3AoxCogK4Qs7C5cL9AxSDLENEQ1zDdYOOw6hDwoPdA/gEE8QvxEwEaQSGRKP
- EwUTfBPyFGkU4RVbFdYWUxbTF1QX1xhcGOMZaxn2GoIbDxudHCwcux1LHd0ecR8JH6Qg
- QCDeIX4iHiLBI2UkCySzJVwmBSatJ1In9CiWKTkp4SqNKz8r9CysLWQuHC7XL5MwUzEZ
- MeUyuDOSNHA1UTY0Nxs4BTj1Oeg63jvUPMs9wT61P6dAl0GFQnZDbkRtRXRGgkeYSLRJ
- 1kr6TB1NP05gT4NQpVHFUuFT+lUSVi9XU1h+Wa9a5VwfXV5eoF/lYSxic2O7ZQVmTmeV
- aNpqIWtsbL1uFG9vcM5yMXOZdQV2dXfmeVl6zHw+fa9/HoCRgguDk4UmhsCIX4oAi6KN
- Ro7skJeSSJP9lbmXfplNmySc/J7RoKWie6RWpjeoHaoGq/Ct26/Isb6zxLXjuB66Y7yo
- vvHBP8OOxdzIKcp5zM7PKNGM1BHW0dnQ3N3f4+Ls5fzpE+wy72by3vbe+17//wAAACgA
- UwB9AKcA0QD7ASUBUAF7AaYB0gH/AiwCWgKIArgC6AMZA0oDfQOwA+UEGgRRBIkEwgT9
- BTkFdgW2BfcGOgZ/BscHEgdfB7AIBAhdCLoJHQmECfAKYQrUC0sLwgw6DLINKw2kDh8O
- nA8cD58QJRCuETkRyBJZEu0TgxQbFLQVTxXsFowXLhfTGHwZJxnVGocbPhv7HL4dgx5G
- HwMfvCB1IS4h6yKqI2wkMCT4JcMmkSdkKDopECnlKrgriyxgLTguFC71L94w1jHfMvIz
- +jTwNdo2vzejOIk5cTpbO0g8Nz0oPhg/Aj/lQMJBn0KEQ3ZEe0WRRrNH2kkGSjVLZ0yc
- TdNPDlBMUYxSzlQRVVRWl1fbWSFaaVu1XQReVV+qYQJiXWO9ZSdmqmhNaf9rl20PbnVv
- 1XE2cplz/nVmdtF4P3mweyh8q35Bf+WBiIMbhJ2GF4ePiQmKhowGjYiPDZCVkh+TrZU+
- ltaYdpobm7ydVZ7koG6h+KODpRCmoag0qcqrYqz7rpewNrHbs4q1Q7b/uLG6VLvnvXO+
- +8CDwg3Dm8Urxr7IU8nry4XNIc6/0F/SA9Op1U/W7tiC2gnbhtz73mzf3eFP4sPkOOWu
- 5ybooOob65btDu5+7+DxJPJU83T0d/V09mL3TPgu+Q/57frL+6j8hv1j/kL/IP//AABk
- ZXNjAAAAAAAAAApDb2xvciBMQ0QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbWx1
- YwAAAAAAAAACAAAADGVuVVMAAAASAAAAKGphSlAAAAAOAAAAOgBDAG8AbABvAHIAIABM
- AEMARDCrMOkw/AAgAEwAQwBEbW1vZAAAAAAAAAYQAACccwAAAADCSG0AAAAAAAAAAAAA
- AAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlLCBJbmMuLCAyMDEwAA==
- </data>
- <key>ReadOnly</key>
- <string>NO</string>
- <key>RowAlign</key>
- <integer>1</integer>
- <key>RowSpacing</key>
- <real>36</real>
- <key>SheetTitle</key>
- <string>キャンバス 1</string>
- <key>SmartAlignmentGuidesActive</key>
- <string>YES</string>
- <key>SmartDistanceGuidesActive</key>
- <string>YES</string>
- <key>UniqueID</key>
- <integer>1</integer>
- <key>UseEntirePage</key>
- <false/>
- <key>VPages</key>
- <integer>1</integer>
- <key>WindowInfo</key>
- <dict>
- <key>CurrentSheet</key>
- <integer>0</integer>
- <key>ExpandedCanvases</key>
- <array/>
- <key>Frame</key>
- <string>{{293, 4}, {694, 774}}</string>
- <key>ListView</key>
- <true/>
- <key>OutlineWidth</key>
- <integer>142</integer>
- <key>RightSidebar</key>
- <false/>
- <key>ShowRuler</key>
- <true/>
- <key>Sidebar</key>
- <true/>
- <key>SidebarWidth</key>
- <integer>120</integer>
- <key>VisibleRegion</key>
- <string>{{6, 0}, {545, 605}}</string>
- <key>Zoom</key>
- <real>1</real>
- <key>ZoomValues</key>
- <array>
- <array>
- <string>キャンバス 1</string>
- <real>1</real>
- <real>1</real>
- </array>
- </array>
- </dict>
- <key>saveQuickLookFiles</key>
- <string>YES</string>
-</dict>
-</plist>
diff --git a/docs/index.rst b/docs/index.rst
index 860b1e0..b29629a 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -15,11 +15,11 @@ atig.rbはTwitterとIRCを結ぶゲートウェイです。
ダウンロード
------------------------------
- - 安定板: `atigrb-0.3.4.tgz`_. ( `過去のバージョン`_ )
+ - 安定板: `atigrb-0.4.3.tgz`_. ( `過去のバージョン`_ )
- 開発版: `Github Repository`_.
-.. _atigrb-0.3.4.tgz: http://github.com/mzp/atig/tarball/v0.3.4
-.. _過去のバージョン: http://github.com/mzp/atig/downloads
+.. _atigrb-0.4.3.tgz: http://github.com/mzp/atig/tarball/v0.4.3
+.. _過去のバージョン: http://github.com/mzp/atig/tags
.. _GitHub Repository: http://github.com/mzp/atig
特徴
diff --git a/docs/options.rst b/docs/options.rst
index 1c405a3..b56220e 100644
--- a/docs/options.rst
+++ b/docs/options.rst
@@ -36,32 +36,33 @@ only
発言関連
------------------------------
+stream
+ `UserStream`_ を有効にします。
+ 実行中の変更には対応していません。
footer=\ ``footer``
発言の末尾に、 ``footer`` を追加します。
ただし ``footer`` がfalseの場合は、追加しません。
old_style_reply
@nickで始まる発言が、@nick の最新の発言へのreplyとなるモードに切り替えます。
+.. _UserStream: https://dev.twitter.com/docs/streaming-apis/streams/user
+
URL短縮関係
------------------------------
発言中の長いURLを自動で短縮します。どの短縮URLサービスを用いて短縮する
か、どの程度の長さのURLを短縮するか、などが設定できます。
-bitlify=\ ``size``
- ``size``\ 字以上のURLを http://bit.ly\ によって短縮します。
bitlify
|len|\ 字以上のURLを http://bit.ly\ によって短縮します。
-bitlify=\ ``api_key``:\ ``api_key``:\ ``size``
+bitlify=\ ``size``
+ ``size``\ 字以上のURLを http://bit.ly\ によって短縮します。
+bitlify=\ ``username``:\ ``api_key``
+ |len|\ 字以上のURLを http://bit.ly のAPIによって短縮します。
+bitlify=\ ``username``:\ ``api_key``:\ ``size``
``size``\ 字以上のURLを http://bit.ly のAPIによって短縮します。
APIを利用して短縮すると、ユーザページに短縮したURLが記録されたりします。
詳しくは、 http://bit.ly のSign up for bit.lyを読んでください。
-bitlify=\ ``api_key``:\ ``api_key``
- |len|\ 字以上のURLを http://bit.ly のAPIによって短縮します。
-unuify= \ ``size``
- ``size`` 字以上のURLを http://u.nu によって短縮します。
-unuify
- |len| 字以上のURLを http://u.nu によって短縮します。
.. |len| replace:: 20
diff --git a/docs/quickstart.rst b/docs/quickstart.rst
index d24c192..caa2179 100644
--- a/docs/quickstart.rst
+++ b/docs/quickstart.rst
@@ -36,7 +36,7 @@ trunk版
~~~~~~~~~~
githubからpullしてください。::
- $ git pull http://mzp.github.com/atig
+ $ git clone https://github.com/mzp/atig.git
使ってみる
----------
diff --git a/lib/atig.rb b/lib/atig.rb
index a38975a..67fd414 100644
--- a/lib/atig.rb
+++ b/lib/atig.rb
@@ -1,6 +1,4 @@
# -*- coding: utf-8 -*-
-$KCODE = "u" unless defined? ::Encoding # json use this
-
require 'atig/version'
require 'atig/monkey'
require 'atig/optparse'
diff --git a/lib/atig/agent.rb b/lib/atig/agent.rb
index 24c89aa..1520596 100644
--- a/lib/atig/agent.rb
+++ b/lib/atig/agent.rb
@@ -1,4 +1,3 @@
-require 'atig/agent/own_list'
require 'atig/agent/full_list'
require 'atig/agent/following'
require 'atig/agent/list_status'
@@ -7,3 +6,4 @@ require 'atig/agent/dm'
require 'atig/agent/timeline'
require 'atig/agent/clenup'
require 'atig/agent/user_stream'
+require 'atig/agent/noretweets'
diff --git a/lib/atig/agent/dm.rb b/lib/atig/agent/dm.rb
index 16e6442..8dbb21b 100644
--- a/lib/atig/agent/dm.rb
+++ b/lib/atig/agent/dm.rb
@@ -7,6 +7,7 @@ module Atig
include Util
def initialize(context, api, db)
+ return if context.opts.stream
@log = context.log
@api = api
@prev = nil
diff --git a/lib/atig/agent/following.rb b/lib/atig/agent/following.rb
index a94e5e3..7a55ac2 100644
--- a/lib/atig/agent/following.rb
+++ b/lib/atig/agent/following.rb
@@ -22,15 +22,15 @@ module Atig
def update(api)
if @db.followings.empty?
- friends = api.page("statuses/friends/#{@db.me.id}", :users)
+ friends = api.page("friends/list", :users, {:user_id => @db.me.id, :count => 100})
else
@db.me = api.post("account/update_profile")
return if @db.me.friends_count == @db.followings.size
- friends = api.page("statuses/friends/#{@db.me.id}", :users)
+ friends = api.page("friends/list", :users, {:user_id => @db.me.id, :count => 100})
end
if @opts.only
- followers = api.page("followers/ids/#{@db.me.id}", :ids)
+ followers = api.page("friends/ids", :ids, {:user_id => @db.me.id, :count => 2500})
friends.each do|friend|
friend[:only] = !followers.include?(friend.id)
end
diff --git a/lib/atig/agent/full_list.rb b/lib/atig/agent/full_list.rb
index d59e6fa..7c81895 100644
--- a/lib/atig/agent/full_list.rb
+++ b/lib/atig/agent/full_list.rb
@@ -7,8 +7,8 @@ module Atig
module Agent
class FullList < List
def entry_points
- [ "#{@db.me.screen_name}/lists",
- "#{@db.me.screen_name}/lists/subscriptions"
+ [
+ "lists/list",
]
end
diff --git a/lib/atig/agent/list.rb b/lib/atig/agent/list.rb
index 4b86417..ccae90e 100644
--- a/lib/atig/agent/list.rb
+++ b/lib/atig/agent/list.rb
@@ -12,16 +12,16 @@ module Atig
@db = db
log :info, "initialize"
- @db.lists.on_invalidated{|name|
+ @db.lists.on_invalidated do |name|
log :info, "invalidated #{name}"
- api.delay(0){|t|
+ api.delay(0) do |t|
if name == :all then
full_update t
else
- @db.lists[name].update t.page("#{@db.me.screen_name}/#{name}/members", :users, true)
+ @db.lists[name].update t.page("lists/members", :users, {:owner_screen_name => @db.me.screen_name, :slug => name})
end
- }
- }
+ end
+ end
api.repeat( interval ) do|t|
self.full_update t
end
@@ -29,11 +29,11 @@ module Atig
def full_update(t)
lists = entry_points.map{|entry|
- t.page(entry, :lists, true)
- }.flatten
+ t.get(entry)
+ }.flatten.compact
users = {}
- lists.map do|list|
+ lists.map do |list|
name = if list.user.screen_name == @db.me.screen_name then
"#{list.slug}"
else
@@ -41,8 +41,8 @@ module Atig
end
begin
users[name] =
- t.page("#{list.user.screen_name}/#{list.slug}/members", :users, true)
- rescue APIFailed => e
+ t.page("lists/members", :users, {:owner_screen_name => list.user.screen_name, :slug => list.slug})
+ rescue => e
log :error, e.inspect
users[name] =
@db.lists.find_by_list_name(list.slug)
diff --git a/lib/atig/agent/list_status.rb b/lib/atig/agent/list_status.rb
index f6ed8bd..b1549d6 100644
--- a/lib/atig/agent/list_status.rb
+++ b/lib/atig/agent/list_status.rb
@@ -20,8 +20,9 @@ class Atig::Agent::ListStatus
q = {}
q.update(:since_id => @prev[name]) if @prev.key?(name)
- screen_name,slug = parse name
- statuses = t.get("#{screen_name}/lists/#{slug}/statuses",q)
+ screen_name, slug = parse name
+ q.update(:owner_screen_name => screen_name, :slug => slug)
+ statuses = t.get("lists/statuses", q)
statuses.reverse_each do|status|
db.statuses.transaction do|d|
d.add(:status => status,
diff --git a/lib/atig/agent/mention.rb b/lib/atig/agent/mention.rb
index 84b0edf..297379c 100644
--- a/lib/atig/agent/mention.rb
+++ b/lib/atig/agent/mention.rb
@@ -4,9 +4,12 @@ require 'atig/agent/agent'
module Atig
module Agent
class Mention < Atig::Agent::Agent
- def initialize(context, api, db); super end
+ def initialize(context, api, db)
+ return if context.opts.stream
+ super
+ end
def interval; 180 end
- def path; '/statuses/mentions' end
+ def path; '/statuses/mentions_timeline' end
def source; :mention end
end
end
diff --git a/lib/atig/agent/noretweets.rb b/lib/atig/agent/noretweets.rb
new file mode 100644
index 0000000..0f932eb
--- /dev/null
+++ b/lib/atig/agent/noretweets.rb
@@ -0,0 +1,24 @@
+# -*- mode:ruby; coding:utf-8 -*-
+
+require 'atig/util'
+
+module Atig
+ module Agent
+ class Noretweets
+ include Util
+
+ def initialize(context, api, db)
+ @opts = context.opts
+ @log = context.log
+ @db = db
+ log :info, "initialize"
+
+ api.repeat(3600){|t| update t }
+ end
+
+ def update(api)
+ @db.noretweets.clear.concat( api.get("friendships/no_retweets/ids") )
+ end
+ end
+ end
+end
diff --git a/lib/atig/agent/other_list.rb b/lib/atig/agent/other_list.rb
deleted file mode 100644
index 55bc45d..0000000
--- a/lib/atig/agent/other_list.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# -*- mode:ruby; coding:utf-8 -*-
-
-require 'atig/util'
-require 'atig/agent/list'
-
-module Atig
- module Agent
- class OtherList < List
- def entry_points
- [ "#{@db.me.screen_name}/lists/subscriptions" ]
- end
-
- def interval
- 3600
- end
- end
- end
-end
diff --git a/lib/atig/agent/own_list.rb b/lib/atig/agent/own_list.rb
deleted file mode 100644
index 4de53ab..0000000
--- a/lib/atig/agent/own_list.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# -*- mode:ruby; coding:utf-8 -*-
-
-require 'atig/util'
-require 'atig/agent/list'
-
-module Atig
- module Agent
- class OwnList < List
- def entry_points
- [ "#{@db.me.screen_name}/lists" ]
- end
-
- def interval
- 3600
- end
- end
- end
-end
diff --git a/lib/atig/agent/timeline.rb b/lib/atig/agent/timeline.rb
index a928f07..389ad8e 100644
--- a/lib/atig/agent/timeline.rb
+++ b/lib/atig/agent/timeline.rb
@@ -4,8 +4,18 @@ require 'atig/agent/agent'
module Atig
module Agent
class Timeline < Atig::Agent::Agent
- def initialize(context, api, db); super end
- def interval; 30 end
+ DEFAULT_INTERVAL = 60
+
+ def initialize(context, api, db)
+ @opts = context.opts
+ return if @opts.stream
+ super
+ end
+
+ def interval
+ @interval ||= @opts.interval.nil? ? DEFAULT_INTERVAL : @opts.interval.to_i
+ end
+
def path; '/statuses/home_timeline' end
def source; :timeline end
end
diff --git a/lib/atig/agent/user_stream.rb b/lib/atig/agent/user_stream.rb
index f96fb4a..ae7832d 100644
--- a/lib/atig/agent/user_stream.rb
+++ b/lib/atig/agent/user_stream.rb
@@ -16,12 +16,33 @@ module Atig
log :info, "initialize"
@api.stream do|t|
- t.watch('user') do |status|
+ options = context.opts.allreplies ? {:replies => :all} : {}
+
+ t.watch('user', options) do |status|
# @log.debug status.inspect
- if status and status.user
+ next if status.retweeted_status and db.noretweets.include?(status.user.id)
+ if status.direct_message
+ dm = status.direct_message
+ db.dms.transaction do|d|
+ d.add :status => dm, :user => dm.sender
+ end
+ elsif status and status.user
db.statuses.transaction do|d|
d.add :status => status, :user => status.user, :source => :user_stream
end
+ elsif status and status.event
+ case status.event
+ when 'list_member_added'
+ t.channel.notify "list member \00311added\017 : @#{status.target.screen_name} into #{status.target_object.full_name} [ http://twitter.com#{status.target_object.uri} ]"
+ when 'list_member_removed'
+ t.channel.notify "list member \00305removed\017 : @#{status.target.screen_name} from #{status.target_object.full_name} [ http://twitter.com#{status.target_object.uri} ]"
+ when 'follow'
+ t.channel.notify "#{status.source.screen_name} \00311follows\017 @#{status.target.screen_name}"
+ when 'favorite'
+ t.channel.notify "#{status.source.screen_name} \00311favorites\017 => @#{status.target_object.user.screen_name} : #{status.target_object.text}"
+ when 'unfavorite'
+ t.channel.notify "#{status.source.screen_name} \00305unfavorites\017 => @#{status.target_object.user.screen_name} : #{status.target_object.text}"
+ end
end
end
end
diff --git a/lib/atig/basic_twitter.rb b/lib/atig/basic_twitter.rb
old mode 100644
new mode 100755
diff --git a/lib/atig/bitly.rb b/lib/atig/bitly.rb
index 4675954..0046f25 100644
--- a/lib/atig/bitly.rb
+++ b/lib/atig/bitly.rb
@@ -1,5 +1,4 @@
# -*- mode:ruby; coding:utf-8 -*-
-require 'rubygems'
require 'json'
require 'atig/http'
diff --git a/lib/atig/channel/list.rb b/lib/atig/channel/list.rb
index ce84970..274274a 100644
--- a/lib/atig/channel/list.rb
+++ b/lib/atig/channel/list.rb
@@ -12,14 +12,14 @@ module Atig
def on_invite(api, nick)
return if @name.include? '^'
- api.post("#{@db.me.screen_name}/#{@name}/members", :id => nick )
+ api.post("lists/members/create", :screen_name => nick, :owner_screen_name => @db.me.screen_name, :slug => @name )
@db.lists.invalidate @name
end
def on_kick(api, nick)
return if @name.include? '^'
- api.delete("#{@db.me.screen_name}/#{@name}/members", :id => nick )
+ api.post("lists/members/destroy", :screen_name => nick, :owner_screen_name => @db.me.screen_name, :slug => @name )
@db.lists.invalidate @name
end
@@ -73,4 +73,3 @@ module Atig
end
end
end
-
diff --git a/lib/atig/channel/timeline.rb b/lib/atig/channel/timeline.rb
index a948741..9eaea00 100644
--- a/lib/atig/channel/timeline.rb
+++ b/lib/atig/channel/timeline.rb
@@ -23,7 +23,7 @@ module Atig
end
end
- # 最新版のチェック
+ # git clone した状態から動かしていたら常に最新版のチェック
daemon do
log :info,"check update"
messages = UpdateChecker.latest
@@ -32,10 +32,10 @@ module Atig
messages[0, 3].each do |m|
@channel.notify " \002#{m[/.+/]}\017"
end
- @channel.notify(" ... and more. check it: http://mzp.github.com/atig/") if messages.size > 3
+ @channel.notify(" ... and more. check it: http://mzp.github.io/atig/") if messages.size > 3
end
sleep (3*60*60)
- end
+ end if UpdateChecker.git_repos?
db.statuses.listen do|entry|
if db.followings.include?(entry.user) or
diff --git a/lib/atig/command/autofix.rb b/lib/atig/command/autofix.rb
index 930dfbb..26e5ce1 100644
--- a/lib/atig/command/autofix.rb
+++ b/lib/atig/command/autofix.rb
@@ -1,4 +1,5 @@
# -*- mode:ruby; coding:utf-8 -*-
+
require 'atig/command/command'
require 'atig/levenshtein'
diff --git a/lib/atig/command/command.rb b/lib/atig/command/command.rb
index fa95ff4..1536baf 100644
--- a/lib/atig/command/command.rb
+++ b/lib/atig/command/command.rb
@@ -9,11 +9,11 @@ module Atig
@gateway = gateway
@api = api
@db = db
- @gateway.ctcp_action(*command_name) do |target, mesg, command, args|
+ @gateway.ctcp_action(*command_name) do |target, mesg, command, args|
action(target, mesg, command, args){|m|
gateway[target].notify m
}
- end
+ end
end
def find_by_tid(tid)
diff --git a/lib/atig/command/destroy.rb b/lib/atig/command/destroy.rb
index 861c69f..365ff77 100644
--- a/lib/atig/command/destroy.rb
+++ b/lib/atig/command/destroy.rb
@@ -1,5 +1,5 @@
# -*- mode:ruby; coding:utf-8 -*-
-require 'time'
+
require 'atig/command/command'
require 'atig/command/info'
diff --git a/lib/atig/command/dm.rb b/lib/atig/command/dm.rb
index b5ee97b..64b0a02 100644
--- a/lib/atig/command/dm.rb
+++ b/lib/atig/command/dm.rb
@@ -20,7 +20,7 @@ module Atig
text = mesg.split(" ", 3)[2]
api.delay(0) do|t|
t.post("direct_messages/new",{
- :user => user,
+ :screen_name => user,
:text => text
})
yield "Sent message to #{user}: #{text}"
diff --git a/lib/atig/command/favorite.rb b/lib/atig/command/favorite.rb
index d785d0c..73e8808 100644
--- a/lib/atig/command/favorite.rb
+++ b/lib/atig/command/favorite.rb
@@ -14,7 +14,7 @@ module Atig
args.each do|tid|
if entry = Info.find_status(db, tid)
api.delay(0){|t|
- res = t.post("favorites/#{method}/#{entry.status.id}")
+ res = t.post("favorites/#{method}", {:id => entry.status.id})
yield "#{command.upcase}: #{entry.user.screen_name}: #{entry.status.text}"
}
else
diff --git a/lib/atig/command/status.rb b/lib/atig/command/status.rb
index f625478..3cbbd4e 100644
--- a/lib/atig/command/status.rb
+++ b/lib/atig/command/status.rb
@@ -1,14 +1,12 @@
# -*- mode:ruby; coding:utf-8 -*-
require 'atig/command/command'
-begin
- require 'jcode'
-rescue LoadError
-end
+require 'twitter-text'
module Atig
module Command
class Status < Atig::Command::Command
- def initialize(*args); super end
+ include ::Twitter::Validation
+
def command_name; %w(status) end
def action(target, mesg, command, args)
@@ -26,9 +24,13 @@ module Atig
end
q = gateway.output_message(:status => text)
- if q[:status].each_char.to_a.size > 140 then
+ case tweet_invalid? q[:status]
+ when :too_long
yield "You can't submit the status over 140 chars"
return
+ when :invalid_characters
+ yield "You can't submit the status invalid chars"
+ return
end
api.delay(0, :retry=>3) do|t|
diff --git a/lib/atig/db/db.rb b/lib/atig/db/db.rb
index 74c31f9..b6c1bec 100644
--- a/lib/atig/db/db.rb
+++ b/lib/atig/db/db.rb
@@ -7,31 +7,31 @@ require 'atig/util'
require 'thread'
require 'set'
require 'fileutils'
-require 'tmpdir'
module Atig
module Db
class Db
include Util
- attr_reader :followings, :statuses, :dms, :lists
+ attr_reader :followings, :statuses, :dms, :lists, :noretweets
attr_accessor :me
- Path = ::Dir.tmpdir
VERSION = 4
def initialize(context, opt={})
@log = context.log
@me = opt[:me]
+ @tmpdir = opt[:tmpdir]
@followings = Followings.new dir('following')
@statuses = Statuses.new dir('status')
@dms = Statuses.new dir('dm')
@lists = Lists.new dir('lists.%s')
+ @noretweets = Array.new
log :info, "initialize"
end
def dir(id)
- dir = File.expand_path "atig/#{@me.screen_name}/", Path
+ dir = File.expand_path "atig/#{@me.screen_name}/", @tmpdir
log :debug, "db(#{id}) = #{dir}"
FileUtils.mkdir_p dir
File.expand_path "#{id}.#{VERSION}.db", dir
diff --git a/lib/atig/db/sql.rb b/lib/atig/db/sql.rb
index ccf0b4d..df425b1 100644
--- a/lib/atig/db/sql.rb
+++ b/lib/atig/db/sql.rb
@@ -1,6 +1,5 @@
# -*- mode:ruby; coding:utf-8 -*-
-require 'rubygems'
require 'sqlite3'
module Atig
diff --git a/lib/atig/db/statuses.rb b/lib/atig/db/statuses.rb
index 4080d48..e753651 100644
--- a/lib/atig/db/statuses.rb
+++ b/lib/atig/db/statuses.rb
@@ -1,7 +1,6 @@
# -*- mode:ruby; coding:utf-8 -*-
require 'atig/db/listenable'
require 'atig/db/transaction'
-require 'rubygems'
require 'sqlite3'
require 'atig/db/roman'
require 'atig/db/sql'
diff --git a/lib/atig/gateway.rb b/lib/atig/gateway.rb
index 8a12381..61e4221 100644
--- a/lib/atig/gateway.rb
+++ b/lib/atig/gateway.rb
@@ -9,6 +9,7 @@ Atig::Gateway::Session.agents = [
Atig::Agent::Timeline,
Atig::Agent::Cleanup,
Atig::Agent::UserStream,
+ Atig::Agent::Noretweets,
]
Atig::Gateway::Session.ifilters = [
diff --git a/lib/atig/gateway/channel.rb b/lib/atig/gateway/channel.rb
index 8dbba17..5a89ca1 100644
--- a/lib/atig/gateway/channel.rb
+++ b/lib/atig/gateway/channel.rb
@@ -86,6 +86,7 @@ END
end
private
+
def run_filters(entry)
status = entry.status.merge(:tid=>entry.tid, :sid=>entry.sid)
@filters.inject(status) {|x, f| f.call x }.text
diff --git a/lib/atig/gateway/session.rb b/lib/atig/gateway/session.rb
index 9dc5bec..e7b8b91 100644
--- a/lib/atig/gateway/session.rb
+++ b/lib/atig/gateway/session.rb
@@ -40,6 +40,7 @@ END
def initialize(*args)
super
+ @tmpdir = @opts.tmpdir
@on_message = nil
end
@@ -96,7 +97,6 @@ END
@channels.each{|_, ch| ch.topic entry }
end
- protected
def on_message(m)
GC.start
@on_message.call(m) if @on_message
@@ -138,7 +138,13 @@ END
log :debug, "initialize Twitter"
twitter = Twitter.new context, oauth.access
search = SearchTwitter.new context
- stream = Stream.new context, @nick, at pass if @opts.stream
+ if @opts.stream
+ unless @channels.key?("##{@nick}")
+ ch = channel("##{@nick}")
+ ch.join_me
+ end
+ end
+ stream = Stream.new context, @channels["##{@nick}"], oauth.access if @opts.stream
@api = Scheduler.new context, twitter, search, stream
log :debug, "initialize filter"
@@ -160,7 +166,7 @@ END
post server_name, MODE, @nick, "+o"
- @db = Atig::Db::Db.new context, :me=>me, :size=> 100
+ @db = Atig::Db::Db.new context, :me=>me, :size=> 100, :tmpdir => @tmpdir
run_new @@commands, context, self, @api, @db
run_new @@agents , context, @api, @db
run_new @@channels, context, self, @db
@@ -169,34 +175,10 @@ END
end
end
- def run_new(klasses,*args)
- (klasses || []).map do|klass|
- if klass.respond_to?(:new)
- klass.new(*args)
- else
- klass
- end
- end
- end
-
def on_disconnected
(@thread_group.list - [Thread.current]).each {|t| t.kill }
end
- CONFIG_FILE = File.expand_path("~/.atig/oauth")
- def save_config
- FileUtils.mkdir_p File.dirname(CONFIG_FILE)
- File.open(CONFIG_FILE, "w") {|io|
- YAML.dump(OAuth.dump,io)
- }
- FileUtils.chmod 0600, CONFIG_FILE
- end
-
- def load_config
- FileUtils.mkdir_p File.dirname(CONFIG_FILE)
- OAuth.load(YAML.load_file(CONFIG_FILE)) rescue nil
- end
-
def on_privmsg(m)
target, mesg = *m.params
m.ctcps.each {|ctcp| on_ctcp(target, ctcp) } if m.ctcp?
@@ -314,6 +296,32 @@ END
post server_name, RPL_ENDOFWHO, @nick, channel
end
+ protected
+
+ def run_new(klasses,*args)
+ (klasses || []).map do|klass|
+ if klass.respond_to?(:new)
+ klass.new(*args)
+ else
+ klass
+ end
+ end
+ end
+
+ CONFIG_FILE = File.expand_path("~/.atig/oauth")
+ def save_config
+ FileUtils.mkdir_p File.dirname(CONFIG_FILE)
+ File.open(CONFIG_FILE, "w") {|io|
+ YAML.dump(OAuth.dump,io)
+ }
+ FileUtils.chmod 0600, CONFIG_FILE
+ end
+
+ def load_config
+ FileUtils.mkdir_p File.dirname(CONFIG_FILE)
+ OAuth.load(YAML.load_file(CONFIG_FILE)) rescue nil
+ end
+
def available_user_modes
"o"
end
diff --git a/lib/atig/http.rb b/lib/atig/http.rb
index f71b2b2..98f17e5 100644
--- a/lib/atig/http.rb
+++ b/lib/atig/http.rb
@@ -49,9 +49,8 @@ module Atig
http.open_timeout = open_timeout if open_timeout # nil by default
http.read_timeout = read_timeout if read_timeout # 60 by default
if uri.is_a? URI::HTTPS
- http.use_ssl = true
+ http.use_ssl = true
http.cert_store = @cert_store
- http.verify_mode = OpenSSL::SSL::VERIFY_PEER
end
http
rescue => e
diff --git a/lib/atig/ifilter/expand_url.rb b/lib/atig/ifilter/expand_url.rb
index 882e302..aeb4496 100644
--- a/lib/atig/ifilter/expand_url.rb
+++ b/lib/atig/ifilter/expand_url.rb
@@ -16,33 +16,51 @@ module Atig
end
def call(status)
- target = if @opts.untiny_whole_urls then
- URI.regexp(%w[http https])
- else
- %r{
- http:// (?:
- (?: bit\.ly | (?: tin | rub) yurl\.com | j\.mp | t\.co
- | htn.to
- | is\.gd | cli\.gs | tr\.im | u\.nu | airme\.us
- | ff\.im | twurl.nl | bkite\.com | tumblr\.com
- | pic\.gd | sn\.im | digg\.com | goo\.gl)
- / [0-9a-z=-]+ |
- blip\.fm/~ (?> [0-9a-z]+) (?! /) |
- flic\.kr/[a-z0-9/]+
- )
- }ix
- end
-
+ target = short_url_regexp
+ entities = (entities = status.entities).nil? ? [] : entities.urls
status.merge :text => status.text.gsub(target) {|url|
- x = @cache[url]
- if x then
- x
- else
- @cache[url] = resolve_http_redirect(URI(url)).to_s || url
+ unless entities.nil? or entities.empty?
+ @cache[url] ||= search_url_from_entities(url, entities)
+ url = @cache[url] if @cache[url] =~ target
end
+ @cache[url] ||= resolve_http_redirect(URI(url)).to_s || url
}
end
+ private
+
+ def short_url_regexp
+ return URI.regexp(%w[http https]) if @opts.untiny_whole_urls
+ %r{
+ https?:// (?:
+ (?: t (?: mblr )? \.co
+ | (?: bitly | bkite | digg | tumblr | (?: tin | rub ) yurl ) \.com
+ | (?: is | pic ) \.gd
+ | goo\.gl
+ | cli\.gs
+ | (?: ff | sn | tr ) \.im
+ | bit\.ly
+ | j\.mp
+ | nico\.ms
+ | airme\.us
+ | twurl\.nl
+ | htn\.to)
+ / [0-9a-z=-]+ |
+ blip\.fm/~ (?> [0-9a-z]+) (?! /) |
+ flic\.kr/[a-z0-9/]+
+ )
+ }ix
+ end
+
+ def search_url_from_entities(url, entities)
+ expanded_url = nil
+ entities.reject! do |entity|
+ entity.url == url &&
+ (expanded_url = entity.expanded_url)
+ end
+ expanded_url
+ end
+
def resolve_http_redirect(uri, limit = 3)
return uri if limit.zero? or uri.nil?
log :debug, uri.inspect
diff --git a/lib/atig/ifilter/sanitize.rb b/lib/atig/ifilter/sanitize.rb
index 87c5e1b..9062708 100644
--- a/lib/atig/ifilter/sanitize.rb
+++ b/lib/atig/ifilter/sanitize.rb
@@ -10,6 +10,7 @@ module Atig
gsub(">", ">").
gsub(""", '"').
gsub("<", "<").
+ gsub("&", "&").
gsub(WSP_REGEX, " ")
status.merge :text => text
}
diff --git a/lib/atig/monkey.rb b/lib/atig/monkey.rb
index ec5a652..c7cdfab 100644
--- a/lib/atig/monkey.rb
+++ b/lib/atig/monkey.rb
@@ -1,4 +1,3 @@
-require 'rubygems'
require 'net/irc'
# monkey hack
diff --git a/lib/atig/oauth.rb b/lib/atig/oauth.rb
index cd7c2d0..048e1ef 100644
--- a/lib/atig/oauth.rb
+++ b/lib/atig/oauth.rb
@@ -1,5 +1,4 @@
# -*- mode:ruby; coding:utf-8 -*-
-require 'rubygems'
require 'oauth'
require 'atig/oauth-patch'
@@ -20,9 +19,11 @@ module Atig
end
attr_reader :access
+ attr_reader :oauth
+
def initialize(context, nick)
uri = URI(context.opts.api_base)
- site = "http://#{uri.host}"
+ site = "https://#{uri.host}"
@nick = nick
@oauth = ::OAuth::Consumer.new(CONSUMER_KEY, CONSUMER_SECRET, {
diff --git a/lib/atig/ofilter/short_url.rb b/lib/atig/ofilter/short_url.rb
index b2ff6bd..69089da 100644
--- a/lib/atig/ofilter/short_url.rb
+++ b/lib/atig/ofilter/short_url.rb
@@ -1,6 +1,5 @@
# -*- mode:ruby; coding:utf-8 -*-
-require 'atig/unu'
require 'atig/bitly'
module Atig
@@ -28,9 +27,6 @@ module Atig
when @opts.bitlify
@len = (@opts.bitlify.to_s || MIN_LEN).to_i
Bitly.no_login @log
- when @opts.unuify
- @len = (@opts.unuify.to_s || MIN_LEN).to_i
- Unu.new @log
else
return mesg
end
diff --git a/lib/atig/option.rb b/lib/atig/option.rb
index 9c9897a..ebe3843 100644
--- a/lib/atig/option.rb
+++ b/lib/atig/option.rb
@@ -29,9 +29,9 @@ module Atig
end
end
- default_value :api_base, 'https://api.twitter.com/1/'
- default_value :stream_api_base, 'http://chirpstream.twitter.com/2b/'
- default_value :search_api_base, 'http://search.twitter.com/'
+ default_value :api_base, 'https://api.twitter.com/1.1/'
+ default_value :stream_api_base, 'https://userstream.twitter.com/2/'
+ default_value :search_api_base, 'https://search.twitter.com/'
def initialize(table)
@table = {}
diff --git a/lib/atig/optparse.rb b/lib/atig/optparse.rb
index b66c9ee..fa72f01 100644
--- a/lib/atig/optparse.rb
+++ b/lib/atig/optparse.rb
@@ -1,4 +1,5 @@
require "optparse"
+require 'tmpdir'
module Atig
module OptParser
@@ -10,6 +11,7 @@ module Atig
:log => nil,
:debug => false,
:foreground => false,
+ :tmpdir => ::Dir.tmpdir,
:conf => '~/.atig/config',
}
@@ -38,6 +40,10 @@ EOB
opts[:debug] = true
end
+ on("--tmpdir path", "temporary directory path") do |tmp|
+ opts[:tmpdir] = tmp
+ end
+
on("--memprof", "Enable memory profiler") do|_|
require 'memory_profiler'
require 'fileutils'
diff --git a/lib/atig/search.rb b/lib/atig/search.rb
index 26ccdba..60a327f 100644
--- a/lib/atig/search.rb
+++ b/lib/atig/search.rb
@@ -1,4 +1,3 @@
-require 'rubygems'
require 'json'
require 'atig/http'
require 'atig/url_escape'
@@ -6,7 +5,7 @@ require 'atig/url_escape'
module Atig
class Search
def search(query, options = {})
- search = URI("http://search.twitter.com/search.json")
+ search = URI("https://search.twitter.com")
search.path = "/search.json"
params = options; options[:q] = query
search.query = options.to_query_str
diff --git a/lib/atig/stream.rb b/lib/atig/stream.rb
index 5f1360d..069c0df 100644
--- a/lib/atig/stream.rb
+++ b/lib/atig/stream.rb
@@ -1,6 +1,5 @@
# -*- mode:ruby; coding:utf-8 -*-
-require 'rubygems'
require 'json'
require 'uri'
require 'logger'
@@ -12,12 +11,14 @@ module Atig
class Stream
include Util
+ attr_reader :channel
+
class APIFailed < StandardError; end
- def initialize(context, user, password)
+ def initialize(context, channel, access)
@log = context.log
@opts = context.opts
- @user = user
- @password = password
+ @channel = channel
+ @access = access
end
def watch(path, query={}, &f)
@@ -30,32 +31,31 @@ module Atig
@log.debug [uri.to_s]
- Net::HTTP.start(uri.host, uri.port) do |http|
- request = Net::HTTP::Post.new uri.request_uri
- request.basic_auth @user, @password
-
- http.request(request) do |response|
- unless response.code == '200' then
- raise APIFailed,"#{response.code} #{response.message}"
- end
+ http = Net::HTTP.new(uri.host, uri.port)
+ http.use_ssl = true
+ request = Net::HTTP::Get.new(uri.request_uri)
+ request.oauth!(http, @access.consumer, @access)
+ http.request(request) do |response|
+ unless response.code == '200' then
+ raise APIFailed,"#{response.code} #{response.message}"
+ end
- begin
- buffer = ''
- response.read_body do |chunk|
- next if chunk.chomp.empty?
- buffer << chunk.to_s
+ begin
+ buffer = ''
+ response.read_body do |chunk|
+ next if chunk.chomp.empty?
+ buffer << chunk.to_s
- if buffer =~ /\A(.*)\n/ then
- text = $1
- unless text.strip.empty?
- f.call TwitterStruct.make(JSON.parse(text))
- end
- buffer = ''
+ if buffer =~ /\A(.*)\n/ then
+ text = $1
+ unless text.strip.empty?
+ f.call TwitterStruct.make(JSON.parse(text))
end
+ buffer = ''
end
- rescue => e
- raise APIFailed,e.to_s
end
+ rescue => e
+ raise APIFailed,e.to_s
end
end
end
diff --git a/lib/atig/twitter.rb b/lib/atig/twitter.rb
old mode 100644
new mode 100755
index 10d4646..a8d1139
--- a/lib/atig/twitter.rb
+++ b/lib/atig/twitter.rb
@@ -1,5 +1,5 @@
-#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
+
require 'atig/basic_twitter'
require 'atig/http'
@@ -12,16 +12,14 @@ module Atig
@http = Atig::Http.new @log
end
- # authenticate = trueでないとSSL verified errorがでることがある
- def page(path, name, authenticate = true, &block)
+ def page(path, name, opts = {}, &block)
limit = 0.98 * @remain # 98% of IP based rate limit
r = []
cursor = -1
1.upto(limit) do |num|
- # next_cursor にアクセスするとNot found が返ってくることがあるので,その時はbreak
- ret = api(path, { :cursor => cursor }, { :authenticate => authenticate }) rescue break
- arr = ret[name.to_s]
- r.concat arr
+ options = {:cursor => cursor}.merge(opts)
+ ret = api(path, options, { :authenticate => true })
+ r.concat ret[name]
cursor = ret[:next_cursor]
break if cursor.zero?
end
@@ -41,6 +39,7 @@ END
http_methods :get, :post, :put, :delete
protected
+
def request(uri, opts)
authenticate = opts.fetch(:authenticate, true)
method = opts.fetch(:method, :get)
@@ -61,6 +60,9 @@ END
headers = {}
req.each{|k,v| headers[k] = v }
+ # workaround: ruby-2.0.0 can't inflate when use accept-encoding.
+ headers.delete "accept-encoding" if headers["accept-encoding"]
+
case req
when Net::HTTP::Get
@oauth.get req.path,headers
diff --git a/lib/atig/unu.rb b/lib/atig/unu.rb
deleted file mode 100644
index c4d9987..0000000
--- a/lib/atig/unu.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# -*- mode:ruby; coding:utf-8 -*-
-module Atig
- class Unu
- def initialize(logger)
- @log = logger
- @http = Atig::Http.new logger
- end
-
- def shorten(url)
- unu_url = "http://u.nu/"
- unu = URI("#{unu_url}unu-api-simple")
- url = URI.rstrip url
- unu.query = { :url => url }.to_query_str
- res = @http.http(unu, 5, 5).request(@http.req(:get, unu)).body
-
- if res[0, 12] == unu_url
- res
- else
- @log.error res
- url
- end
- rescue Errno::ETIMEDOUT, JSON::ParserError, IOError, Timeout::Error, Errno::ECONNRESET => e
- @log.error e
- url
- end
- end
-end
diff --git a/lib/atig/update_checker.rb b/lib/atig/update_checker.rb
index 9e87121..5949894 100644
--- a/lib/atig/update_checker.rb
+++ b/lib/atig/update_checker.rb
@@ -3,10 +3,10 @@
module Atig
module UpdateChecker
def commits
- uri = URI("http://github.com/api/v1/json/mzp/atig/commits/master")
+ uri = URI("https://api.github.com/repos/mzp/atig/commits")
http = Atig::Http.new
res = http.http(uri).request http.req(:get, uri)
- JSON.parse(res.body)['commits']
+ JSON.parse(res.body)
end
def server_version
@@ -20,6 +20,10 @@ module Atig
system("git show #{rev} > /dev/null 2>&1")
end
+ def git_repos?
+ File.exists? File.expand_path('../../../.git', __FILE__)
+ end
+
def git?
system('which git > /dev/null 2>&1')
end
@@ -29,25 +33,24 @@ module Atig
[]
else
cs = commits
- latest = cs.first['id'][/^[0-9a-z]{40}$/]
+ latest = cs.first['sha'][/^[0-9a-z]{40}$/]
raise "github API changed?" unless latest
if local_repos?(latest) then
[]
else
- current = cs.map {|i| i['id'] }.index(server_version)
+ current = cs.map {|i| i['sha'] }.index(server_version)
if current then
cs[0...current]
else
cs
- end.map {|i| i['message'] }
+ end.map {|i| i['commit']['message'] }
end
end
rescue Errno::ECONNREFUSED, Timeout::Error => e
[]
end
- module_function :latest, :commits, :server_version, :local_repos?, :git?
+ module_function :latest, :commits, :server_version, :local_repos?, :git?, :git_repos?
end
end
-
diff --git a/lib/atig/url_escape.rb b/lib/atig/url_escape.rb
index b1982d7..65479c6 100644
--- a/lib/atig/url_escape.rb
+++ b/lib/atig/url_escape.rb
@@ -48,7 +48,7 @@ module URI::Escape
alias :encode :escape
end
- def encode_component str, unsafe = /[^-_.!~*'()a-zA-Z0-9 ]/
+ def encode_component(str, unsafe = ::OAuth::RESERVED_CHARACTERS)
_orig_escape(str, unsafe).tr(" ", "+")
end
diff --git a/lib/atig/version.rb b/lib/atig/version.rb
index 3370dfc..cda6d99 100644
--- a/lib/atig/version.rb
+++ b/lib/atig/version.rb
@@ -1,3 +1,3 @@
module Atig
- VERSION = "0.3.6"
+ VERSION = "0.4.5"
end
diff --git a/metadata.yml b/metadata.yml
index cd3e5ce..b6ec52e 100644
--- a/metadata.yml
+++ b/metadata.yml
@@ -1,130 +1,132 @@
--- !ruby/object:Gem::Specification
name: atig
version: !ruby/object:Gem::Version
- version: 0.3.6
- prerelease:
+ version: 0.4.5
platform: ruby
authors:
+- MIZUNO Hiroki
- SHIBATA Hiroshi
autorequire:
bindir: bin
cert_chain: []
-date: 2012-05-14 00:00:00.000000000 Z
+date: 2014-01-15 00:00:00.000000000 Z
dependencies:
- !ruby/object:Gem::Dependency
name: sqlite3
requirement: !ruby/object:Gem::Requirement
- none: false
requirements:
- - - ! '>='
+ - - ">="
- !ruby/object:Gem::Version
version: 1.3.2
type: :runtime
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
- none: false
requirements:
- - - ! '>='
+ - - ">="
- !ruby/object:Gem::Version
version: 1.3.2
- !ruby/object:Gem::Dependency
name: net-irc
requirement: !ruby/object:Gem::Requirement
- none: false
requirements:
- - - ! '>='
+ - - ">="
- !ruby/object:Gem::Version
version: '0'
type: :runtime
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
- none: false
requirements:
- - - ! '>='
+ - - ">="
- !ruby/object:Gem::Version
version: '0'
- !ruby/object:Gem::Dependency
name: oauth
requirement: !ruby/object:Gem::Requirement
- none: false
requirements:
- - - ! '>='
+ - - ">="
- !ruby/object:Gem::Version
version: '0'
type: :runtime
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
- none: false
requirements:
- - - ! '>='
+ - - ">="
- !ruby/object:Gem::Version
version: '0'
- !ruby/object:Gem::Dependency
- name: rake
+ name: twitter-text
requirement: !ruby/object:Gem::Requirement
- none: false
requirements:
- - - ! '>='
+ - - "~>"
- !ruby/object:Gem::Version
- version: '0'
+ version: 1.7.0
type: :runtime
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
- none: false
requirements:
- - - ! '>='
+ - - "~>"
- !ruby/object:Gem::Version
- version: '0'
+ version: 1.7.0
- !ruby/object:Gem::Dependency
- name: json
+ name: bundler
requirement: !ruby/object:Gem::Requirement
- none: false
requirements:
- - - ! '>='
+ - - ">="
- !ruby/object:Gem::Version
version: '0'
- type: :runtime
+ type: :development
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
- none: false
requirements:
- - - ! '>='
+ - - ">="
- !ruby/object:Gem::Version
version: '0'
- !ruby/object:Gem::Dependency
name: rspec
requirement: !ruby/object:Gem::Requirement
- none: false
requirements:
- - - ! '>='
+ - - ">="
+ - !ruby/object:Gem::Version
+ version: '0'
+ type: :development
+ prerelease: false
+ version_requirements: !ruby/object:Gem::Requirement
+ requirements:
+ - - ">="
+ - !ruby/object:Gem::Version
+ version: '0'
+- !ruby/object:Gem::Dependency
+ name: coveralls
+ requirement: !ruby/object:Gem::Requirement
+ requirements:
+ - - ">="
- !ruby/object:Gem::Version
version: '0'
type: :development
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
- none: false
requirements:
- - - ! '>='
+ - - ">="
- !ruby/object:Gem::Version
version: '0'
description: Atig.rb is Twitter Irc Gateway.
email:
+- mzp at ocaml.jp
- shibata.hiroshi at gmail.com
executables:
- atig
extensions: []
extra_rdoc_files: []
files:
-- .gitignore
-- .rspec
+- ".gitignore"
+- ".rspec"
+- ".travis.yml"
- Gemfile
- Gemfile.lock
- README.mkdn
- Rakefile
- atig.gemspec
- bin/atig
-- docs/OMakefile
-- docs/OMakeroot
- docs/_static/allow.png
- docs/_static/emacs.png
- docs/_static/irc_setting.png
@@ -141,7 +143,6 @@ files:
- docs/conf.py
- docs/config.rst
- docs/feature.rst
-- docs/graphics.graffle
- docs/hacking_guide.rst
- docs/index.rst
- docs/irc.rst
@@ -160,8 +161,7 @@ files:
- lib/atig/agent/list.rb
- lib/atig/agent/list_status.rb
- lib/atig/agent/mention.rb
-- lib/atig/agent/other_list.rb
-- lib/atig/agent/own_list.rb
+- lib/atig/agent/noretweets.rb
- lib/atig/agent/stream_follow.rb
- lib/atig/agent/timeline.rb
- lib/atig/agent/user_stream.rb
@@ -178,7 +178,6 @@ files:
- lib/atig/command.rb
- lib/atig/command/autofix.rb
- lib/atig/command/command.rb
-- lib/atig/command/command_helper.rb
- lib/atig/command/destroy.rb
- lib/atig/command/dm.rb
- lib/atig/command/favorite.rb
@@ -239,12 +238,12 @@ files:
- lib/atig/stream.rb
- lib/atig/twitter.rb
- lib/atig/twitter_struct.rb
-- lib/atig/unu.rb
- lib/atig/update_checker.rb
- lib/atig/url_escape.rb
- lib/atig/util.rb
- lib/atig/version.rb
- lib/memory_profiler.rb
+- requirements.txt
- spec/command/autofix_spec.rb
- spec/command/destroy_spec.rb
- spec/command/dm_spec.rb
@@ -265,6 +264,7 @@ files:
- spec/command/user_spec.rb
- spec/command/version_spec.rb
- spec/command/whois_spec.rb
+- spec/command_helper.rb
- spec/db/followings_spec.rb
- spec/db/listenable_spec.rb
- spec/db/lists_spec.rb
@@ -289,33 +289,26 @@ files:
- spec/update_checker_spec.rb
homepage: https://github.com/mzp/atig
licenses: []
+metadata: {}
post_install_message:
rdoc_options: []
require_paths:
- lib
required_ruby_version: !ruby/object:Gem::Requirement
- none: false
requirements:
- - - ! '>='
+ - - ">="
- !ruby/object:Gem::Version
- version: '0'
- segments:
- - 0
- hash: 2969950395206530754
+ version: 1.9.3
required_rubygems_version: !ruby/object:Gem::Requirement
- none: false
requirements:
- - - ! '>='
+ - - ">="
- !ruby/object:Gem::Version
version: '0'
- segments:
- - 0
- hash: 2969950395206530754
requirements: []
rubyforge_project:
-rubygems_version: 1.8.24
+rubygems_version: 2.2.1
signing_key:
-specification_version: 3
+specification_version: 4
summary: Atig.rb is forked from cho45's tig.rb. We improve some features of tig.rb.
test_files:
- spec/command/autofix_spec.rb
@@ -338,6 +331,7 @@ test_files:
- spec/command/user_spec.rb
- spec/command/version_spec.rb
- spec/command/whois_spec.rb
+- spec/command_helper.rb
- spec/db/followings_spec.rb
- spec/db/listenable_spec.rb
- spec/db/lists_spec.rb
@@ -360,3 +354,4 @@ test_files:
- spec/sized_hash_spec.rb
- spec/spec_helper.rb
- spec/update_checker_spec.rb
+has_rdoc:
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..92fc677
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,5 @@
+Jinja2==2.7.1
+MarkupSafe==0.18
+Pygments==1.6
+Sphinx==1.2b3
+docutils==0.11
diff --git a/spec/command/autofix_spec.rb b/spec/command/autofix_spec.rb
index ff558e4..2c512dc 100644
--- a/spec/command/autofix_spec.rb
+++ b/spec/command/autofix_spec.rb
@@ -2,7 +2,6 @@
require File.expand_path( '../../spec_helper', __FILE__ )
require 'atig/command/autofix'
-require 'atig/command/command_helper'
describe Atig::Command::Autofix do
include CommandHelper
diff --git a/spec/command/destroy_spec.rb b/spec/command/destroy_spec.rb
index 52dacf5..169819a 100644
--- a/spec/command/destroy_spec.rb
+++ b/spec/command/destroy_spec.rb
@@ -2,7 +2,6 @@
require File.expand_path( '../../spec_helper', __FILE__ )
require 'atig/command/destroy'
-require 'atig/command/command_helper'
describe Atig::Command::Destroy,"when status is not removed" do
include CommandHelper
@@ -13,7 +12,7 @@ describe Atig::Command::Destroy,"when status is not removed" do
it "should specified other's status" do
entry = entry user(2,'other'), status('blah blah', 'id'=>'1')
- @statuses.stub!(:find_by_tid).with('b').and_return(entry)
+ @statuses.stub(:find_by_tid).with('b').and_return(entry)
@channel.should_receive(:notify).with("The status you specified by the ID tid is not yours.")
call "#twitter","destory",%w(b)
@@ -28,7 +27,7 @@ describe Atig::Command::Destroy,"when remove recently tweet" do
target = status 'blah blah', 'id'=>'1'
entry = entry @me, target,'entry',1
- @res = mock 'res'
+ @res = double 'res'
stub_status(:find_by_tid,'a' => entry)
stub_status(:find_by_sid,'mzp:a' => entry)
@@ -72,7 +71,7 @@ describe Atig::Command::Destroy,"when remove old tweet" do
target = status 'blah blah', 'id'=>'1'
entry = entry @me, target,'entry',1
- @res = mock 'res'
+ @res = double 'res'
stub_status(:find_by_tid,'a' => entry)
stub_status(:find_by_sid,'mzp:a' => entry)
diff --git a/spec/command/dm_spec.rb b/spec/command/dm_spec.rb
index 71faeaf..f06448e 100644
--- a/spec/command/dm_spec.rb
+++ b/spec/command/dm_spec.rb
@@ -2,7 +2,6 @@
require File.expand_path( '../../spec_helper', __FILE__ )
require 'atig/command/dm'
-require 'atig/command/command_helper'
describe Atig::Command::Dm do
include CommandHelper
@@ -16,7 +15,7 @@ describe Atig::Command::Dm do
it "should post the status by API" do
@api.should_receive(:post).with('direct_messages/new',
- {:user=>'mzp', :text=> 'blah blah'})
+ {:screen_name => 'mzp', :text => 'blah blah'})
@channel.should_receive(:notify).with("Sent message to mzp: blah blah")
call '#twitter', "dm", %w(mzp blah blah)
end
diff --git a/spec/command/favorite_spec.rb b/spec/command/favorite_spec.rb
index 3e9034f..a01ceed 100644
--- a/spec/command/favorite_spec.rb
+++ b/spec/command/favorite_spec.rb
@@ -2,7 +2,6 @@
require File.expand_path( '../../spec_helper', __FILE__ )
require 'atig/command/favorite'
-require 'atig/command/command_helper'
describe Atig::Command::Favorite do
include CommandHelper
@@ -11,7 +10,7 @@ describe Atig::Command::Favorite do
target = status 'blah blah', 'id'=>'1'
entry = entry user(1,'mzp'), target
- @res = mock 'res'
+ @res = double 'res'
stub_status(:find_by_tid,'a' => entry)
stub_status(:find_by_sid,'mzp:a' => entry)
@@ -19,35 +18,35 @@ describe Atig::Command::Favorite do
end
it "should post fav by tid" do
- @api.should_receive(:post).with("favorites/create/1")
+ @api.should_receive(:post).with("favorites/create", {:id => "1"})
@channel.should_receive(:notify).with("FAV: mzp: blah blah")
call "#twitter","fav",%w(a)
end
it "should post fav by sid" do
- @api.should_receive(:post).with("favorites/create/1")
+ @api.should_receive(:post).with("favorites/create", {:id => "1"})
@channel.should_receive(:notify).with("FAV: mzp: blah blah")
call "#twitter","fav",%w(mzp:a)
end
it "should post fav by screen name" do
- @api.should_receive(:post).with("favorites/create/1")
+ @api.should_receive(:post).with("favorites/create", {:id => "1"})
@channel.should_receive(:notify).with("FAV: mzp: blah blah")
call "#twitter","fav",%w(mzp)
end
it "should post fav by screen name with at" do
- @api.should_receive(:post).with("favorites/create/1")
+ @api.should_receive(:post).with("favorites/create", {:id => "1"})
@channel.should_receive(:notify).with("FAV: mzp: blah blah")
call "#twitter","fav",%w(@mzp)
end
it "should post unfav" do
- @api.should_receive(:post).with("favorites/destroy/1")
+ @api.should_receive(:post).with("favorites/destroy", {:id => "1"})
@channel.should_receive(:notify).with("UNFAV: mzp: blah blah")
call "#twitter","unfav",%w(a)
diff --git a/spec/command/limit_spec.rb b/spec/command/limit_spec.rb
index 4613fd2..5de9de8 100644
--- a/spec/command/limit_spec.rb
+++ b/spec/command/limit_spec.rb
@@ -2,7 +2,6 @@
require File.expand_path( '../../spec_helper', __FILE__ )
require 'atig/command/limit'
-require 'atig/command/command_helper'
describe Atig::Command::Limit do
include CommandHelper
@@ -10,9 +9,9 @@ describe Atig::Command::Limit do
before do
@reset = ::Time.utc(2010,9,25,8,24,12)
@command = init Atig::Command::Limit
- @api.stub!(:limit).and_return(150)
- @api.stub!(:remain).and_return(148)
- @api.stub!(:reset).and_return(@reset)
+ @api.stub(:limit).and_return(150)
+ @api.stub(:remain).and_return(148)
+ @api.stub(:reset).and_return(@reset)
end
it "should provide limit command" do
diff --git a/spec/command/location_spec.rb b/spec/command/location_spec.rb
index 4324644..595dd1f 100644
--- a/spec/command/location_spec.rb
+++ b/spec/command/location_spec.rb
@@ -2,7 +2,6 @@
require File.expand_path( '../../spec_helper', __FILE__ )
require 'atig/command/location'
-require 'atig/command/command_helper'
describe Atig::Command::Location do
include CommandHelper
diff --git a/spec/command/name_spec.rb b/spec/command/name_spec.rb
index 852aeff..cd0acb3 100644
--- a/spec/command/name_spec.rb
+++ b/spec/command/name_spec.rb
@@ -2,7 +2,6 @@
require File.expand_path( '../../spec_helper', __FILE__ )
require 'atig/command/name'
-require 'atig/command/command_helper'
describe Atig::Command::Name do
include CommandHelper
diff --git a/spec/command/option_spec.rb b/spec/command/option_spec.rb
index 4878dfa..8a9c9d7 100644
--- a/spec/command/option_spec.rb
+++ b/spec/command/option_spec.rb
@@ -2,7 +2,6 @@
require File.expand_path( '../spec_helper', File.dirname(__FILE__))
require 'atig/command/option'
-require 'atig/command/command_helper'
describe Atig::Command::Option do
include CommandHelper
@@ -25,14 +24,14 @@ describe Atig::Command::Option, 'when have many property' do
@opts.foo2 = 42
@opts.foo3 = 42.1
- @opts.stub!(:foo1=)
- @opts.stub!(:foo2=)
- @opts.stub!(:foo3=)
+ @opts.stub(:foo1=)
+ @opts.stub(:foo2=)
+ @opts.stub(:foo3=)
end
it "should list up values" do
xs = []
- @channel.stub!(:notify){|x| xs << x}
+ @channel.stub(:notify){|x| xs << x}
call '#twitter', 'opt', %w()
xs.should == [
"foo1 => true",
@@ -48,9 +47,9 @@ describe Atig::Command::Option, 'when have bool property' do
before do
@command = init Atig::Command::Option
- @opts.stub!(:foo).and_return true
- @opts.stub!(:foo=){|v| @value = v }
- @channel.stub!(:notify)
+ @opts.stub(:foo).and_return true
+ @opts.stub(:foo=){|v| @value = v }
+ @channel.stub(:notify)
end
it "should show the value" do
@@ -69,9 +68,9 @@ describe Atig::Command::Option, 'when have int property' do
before do
@command = init Atig::Command::Option
- @opts.stub!(:foo).and_return 42
- @opts.stub!(:foo=){|v| @value = v }
- @channel.stub!(:notify)
+ @opts.stub(:foo).and_return 42
+ @opts.stub(:foo=){|v| @value = v }
+ @channel.stub(:notify)
end
it "should show the value" do
@@ -90,9 +89,9 @@ describe Atig::Command::Option, 'when have float property' do
before do
@command = init Atig::Command::Option
- @opts.stub!(:foo).and_return 1.23
- @opts.stub!(:foo=){|v| @value = v }
- @channel.stub!(:notify)
+ @opts.stub(:foo).and_return 1.23
+ @opts.stub(:foo=){|v| @value = v }
+ @channel.stub(:notify)
end
it "should show the value" do
@@ -111,9 +110,9 @@ describe Atig::Command::Option, 'when have string property' do
before do
@command = init Atig::Command::Option
- @opts.stub!(:foo).and_return "bar"
- @opts.stub!(:foo=){|v| @value = v }
- @channel.stub!(:notify)
+ @opts.stub(:foo).and_return "bar"
+ @opts.stub(:foo=){|v| @value = v }
+ @channel.stub(:notify)
end
it "should show the value" do
diff --git a/spec/command/refresh_spec.rb b/spec/command/refresh_spec.rb
index b4e056a..2ccdd1d 100644
--- a/spec/command/refresh_spec.rb
+++ b/spec/command/refresh_spec.rb
@@ -2,7 +2,6 @@
require File.expand_path( '../../spec_helper', __FILE__ )
require 'atig/command/refresh'
-require 'atig/command/command_helper'
require 'atig/command/info'
describe Atig::Command::Refresh do
diff --git a/spec/command/reply_spec.rb b/spec/command/reply_spec.rb
index 6ad00fa..f893403 100644
--- a/spec/command/reply_spec.rb
+++ b/spec/command/reply_spec.rb
@@ -2,7 +2,6 @@
require File.expand_path( '../../spec_helper', __FILE__ )
require 'atig/command/reply'
-require 'atig/command/command_helper'
describe Atig::Command::Reply do
include CommandHelper
@@ -11,7 +10,7 @@ describe Atig::Command::Reply do
target = status 'blah blah', 'id'=>'1'
entry = entry user(1,'mzp'), target
- @res = mock 'res'
+ @res = double 'res'
stub_status(:find_by_tid,'a' => entry)
stub_status(:find_by_sid,'mzp:a' => entry)
diff --git a/spec/command/retweet_spec.rb b/spec/command/retweet_spec.rb
index d29cb2b..d3f31bf 100644
--- a/spec/command/retweet_spec.rb
+++ b/spec/command/retweet_spec.rb
@@ -2,22 +2,21 @@
require File.expand_path( '../../spec_helper', __FILE__ )
require 'atig/command/retweet'
-require 'atig/command/command_helper'
describe Atig::Command::Retweet do
include CommandHelper
before do
- bitly = mock("Bitly")
- bitly.stub!(:shorten).and_return{|s|
+ bitly = double("Bitly")
+ bitly.stub(:shorten).and_return{|s|
"[#{s}]"
}
- Atig::Bitly.stub!(:no_login).and_return(bitly)
+ Atig::Bitly.stub(:no_login).and_return(bitly)
@command = init Atig::Command::Retweet
target = status 'blah blah blah blah blah blah blah blah', 'id'=>'1'
entry = entry user(1,'mzp'), target
- @res = mock 'res'
+ @res = double 'res'
stub_status(:find_by_tid,'a' => entry)
stub_status(:find_by_sid,'mzp:a' => entry)
diff --git a/spec/command/spam_spec.rb b/spec/command/spam_spec.rb
index f0291b3..f1ed422 100644
--- a/spec/command/spam_spec.rb
+++ b/spec/command/spam_spec.rb
@@ -1,7 +1,6 @@
# -*- mode:ruby; coding:utf-8 -*-
require File.expand_path( '../../spec_helper', __FILE__ )
-require 'atig/command/command_helper'
require 'atig/command/spam'
describe Atig::Command::Spam do
diff --git a/spec/command/status_spec.rb b/spec/command/status_spec.rb
index a7cfe04..7e25155 100644
--- a/spec/command/status_spec.rb
+++ b/spec/command/status_spec.rb
@@ -2,7 +2,6 @@
require File.expand_path( '../../spec_helper', __FILE__ )
require 'atig/command/status'
-require 'atig/command/command_helper'
describe Atig::Command::Status do
include CommandHelper
@@ -25,6 +24,28 @@ describe Atig::Command::Status do
@gateway.filtered.should == { :status => 'blah blah' }
end
+ it "should post with japanese language" do
+ res = status("あ"*140)
+ @statuses.should_receive(:find_by_user).with(@me,:limit=>1).and_return(nil)
+ @api.should_receive(:post).with('statuses/update', {:status=>"あ"*140}).and_return(res)
+
+ call '#twitter', "status", ["あ" * 140]
+
+ @gateway.updated.should == [ res, '#twitter' ]
+ @gateway.filtered.should == { :status => "あ" * 140 }
+ end
+
+ it "should post the status even if has long URL" do
+ res = status("https://www.google.co.jp/search?q=%E3%83%AB%E3%83%93%E3%83%BC%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E9%96%8B%E7%99%BA&safe=off")
+ @statuses.should_receive(:find_by_user).with(@me,:limit=>1).and_return(nil)
+ @api.should_receive(:post).with('statuses/update', {:status=>'https://www.google.co.jp/search?q=%E3%83%AB%E3%83%93%E3%83%BC%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E9%96%8B%E7%99%BA&safe=off'}).and_return(res)
+
+ call '#twitter', "status", ['https://www.google.co.jp/search?q=%E3%83%AB%E3%83%93%E3%83%BC%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E9%96%8B%E7%99%BA&safe=off']
+
+ @gateway.updated.should == [ res, '#twitter' ]
+ @gateway.filtered.should == { :status => 'https://www.google.co.jp/search?q=%E3%83%AB%E3%83%93%E3%83%BC%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E9%96%8B%E7%99%BA&safe=off'}
+ end
+
it "should not post same post" do
e = entry user(1,'mzp'), status('blah blah')
@statuses.should_receive(:find_by_user).with(@me,:limit=>1).and_return([ e ] )
diff --git a/spec/command/thread_spec.rb b/spec/command/thread_spec.rb
index ee9f8f4..adde583 100644
--- a/spec/command/thread_spec.rb
+++ b/spec/command/thread_spec.rb
@@ -2,12 +2,11 @@
require File.expand_path( '../../spec_helper', __FILE__ )
require 'atig/command/thread'
-require 'atig/command/command_helper'
describe Atig::Command::Thread do
include CommandHelper
before do
- u = mock 'user'
+ u = double 'user'
@entries = [
entry(u, status(''),'entry-0'),
entry(u, status('','in_reply_to_status_id'=>2),'entry-1'),
@@ -17,10 +16,10 @@ describe Atig::Command::Thread do
]
@command = init Atig::Command::Thread
@messages = []
- @channel.stub!(:message).and_return{|entry,_|
+ @channel.stub(:message).and_return{|entry,_|
@messages.unshift entry
}
- @statuses.stub!(:find_by_status_id).with(anything).and_return{|id|
+ @statuses.stub(:find_by_status_id).with(anything).and_return{|id|
@entries[id.to_i]
}
end
diff --git a/spec/command/time_spec.rb b/spec/command/time_spec.rb
index 112faca..5c46b32 100644
--- a/spec/command/time_spec.rb
+++ b/spec/command/time_spec.rb
@@ -2,15 +2,14 @@
require File.expand_path( '../../spec_helper', __FILE__ )
require 'atig/command/time'
-require 'atig/command/command_helper'
describe Atig::Command::Time do
include CommandHelper
def user(offset, tz)
- u = mock "user-#{offset}"
- u.stub!(:utc_offset).and_return(offset)
- u.stub!(:time_zone).and_return(tz)
+ u = double "user-#{offset}"
+ u.stub(:utc_offset).and_return(offset)
+ u.stub(:time_zone).and_return(tz)
u
end
diff --git a/spec/command/uptime_spec.rb b/spec/command/uptime_spec.rb
index 655f185..0d0a457 100644
--- a/spec/command/uptime_spec.rb
+++ b/spec/command/uptime_spec.rb
@@ -2,7 +2,6 @@
require File.expand_path( '../../spec_helper', __FILE__ )
require 'atig/command/uptime'
-require 'atig/command/command_helper'
describe Atig::Command::Uptime do
include CommandHelper
diff --git a/spec/command/user_info_spec.rb b/spec/command/user_info_spec.rb
index c41c0e4..37acc76 100644
--- a/spec/command/user_info_spec.rb
+++ b/spec/command/user_info_spec.rb
@@ -2,17 +2,16 @@
require File.expand_path( '../../spec_helper', __FILE__)
require 'atig/command/user_info'
-require 'atig/command/command_helper'
describe Atig::Command::UserInfo do
include CommandHelper
before do
@command = init Atig::Command::UserInfo
- @status = stub "status"
- @user = stub "user"
- @user.stub!(:description).and_return('hogehoge')
- @user.stub!(:status).and_return(@status)
+ @status = double "status"
+ @user = double "user"
+ @user.stub(:description).and_return('hogehoge')
+ @user.stub(:status).and_return(@status)
end
it "should show the source via DB" do
diff --git a/spec/command/user_spec.rb b/spec/command/user_spec.rb
index 6681b70..0a5a2de 100644
--- a/spec/command/user_spec.rb
+++ b/spec/command/user_spec.rb
@@ -2,7 +2,6 @@
require File.expand_path( '../../spec_helper', __FILE__ )
require 'atig/command/user'
-require 'atig/command/command_helper'
describe Atig::Command::User do
include CommandHelper
diff --git a/spec/command/version_spec.rb b/spec/command/version_spec.rb
index d49bafc..908a19f 100644
--- a/spec/command/version_spec.rb
+++ b/spec/command/version_spec.rb
@@ -2,17 +2,16 @@
require File.expand_path( '../../spec_helper', __FILE__ )
require 'atig/command/version'
-require 'atig/command/command_helper'
describe Atig::Command::Version do
include CommandHelper
before do
@command = init Atig::Command::Version
- @status = stub "status"
- @status.stub!(:source).and_return('<a href="http://echofon.com/" rel="nofollow">Echofon</a>')
- @user = stub "user"
- @user.stub!(:status).and_return(@status)
+ @status = double "status"
+ @status.stub(:source).and_return('<a href="http://echofon.com/" rel="nofollow">Echofon</a>')
+ @user = double "user"
+ @user.stub(:status).and_return(@status)
end
it "should provide version command" do
@@ -34,8 +33,8 @@ describe Atig::Command::Version do
end
it "should show the source of web" do
- status = stub "status"
- status.stub!(:source).and_return('web')
+ status = double "status"
+ status.stub(:source).and_return('web')
@statuses.
should_receive(:find_by_screen_name).
with('mzp',:limit => 1).
@@ -50,7 +49,7 @@ describe Atig::Command::Version do
end
it "should show the source via API" do
- @statuses.stub!(:find_by_screen_name).and_return(@status)
+ @statuses.stub(:find_by_screen_name).and_return(@status)
@statuses.should_receive(:find_by_screen_name).with('mzp',:limit => 1).and_return(nil)
@statuses.should_receive(:add).with(:status => @status, :user => @user, :source=>:version)
@api.should_receive(:get).with('users/show',:screen_name=>'mzp').and_return(@user)
diff --git a/spec/command/whois_spec.rb b/spec/command/whois_spec.rb
index 562215b..14e25bd 100644
--- a/spec/command/whois_spec.rb
+++ b/spec/command/whois_spec.rb
@@ -2,7 +2,6 @@
require File.expand_path( '../../spec_helper', __FILE__ )
require 'atig/command/whois'
-require 'atig/command/command_helper'
require 'atig/command/info'
include Net::IRC::Constants
@@ -17,20 +16,20 @@ describe Atig::Command::Whois do
before do
@command = init Atig::Command::Whois
- @status = stub 'status'
- @status.stub!(:created_at).and_return(time(::Time.at(42)))
- @user = stub "user"
- @user.stub!(:name) .and_return('name')
- @user.stub!(:id) .and_return('10')
- @user.stub!(:screen_name).and_return('screen_name')
- @user.stub!(:description).and_return('blah blah')
- @user.stub!(:protected) .and_return(false)
- @user.stub!(:location) .and_return('Tokyo, Japan')
- @user.stub!(:created_at) .and_return(time(::Time.at(0)))
- @user.stub!(:status) .and_return(@status)
+ @status = double 'status'
+ @status.stub(:created_at).and_return(time(::Time.at(42)))
+ @user = double "user"
+ @user.stub(:name) .and_return('name')
+ @user.stub(:id) .and_return('10')
+ @user.stub(:screen_name).and_return('screen_name')
+ @user.stub(:description).and_return('blah blah')
+ @user.stub(:protected) .and_return(false)
+ @user.stub(:location) .and_return('Tokyo, Japan')
+ @user.stub(:created_at) .and_return(time(::Time.at(0)))
+ @user.stub(:status) .and_return(@status)
- ::Time.stub!(:now).and_return(::Time.at(50))
- @followings.stub!(:find_by_screen_name).with('mzp').and_return(@user)
+ ::Time.stub(:now).and_return(::Time.at(50))
+ @followings.stub(:find_by_screen_name).with('mzp').and_return(@user)
end
it "should proide whois command" do
@@ -57,7 +56,7 @@ describe Atig::Command::Whois do
end
it "should append /protect if the user is protected" do
- @user.stub!(:protected).and_return(true)
+ @user.stub(:protected).and_return(true)
commands = []
@gateway.should_receive(:post){|_,command,_,_,*params|
commands << command
diff --git a/lib/atig/command/command_helper.rb b/spec/command_helper.rb
similarity index 92%
rename from lib/atig/command/command_helper.rb
rename to spec/command_helper.rb
index 6daa888..a73c831 100644
--- a/lib/atig/command/command_helper.rb
+++ b/spec/command_helper.rb
@@ -64,13 +64,13 @@ end
module CommandHelper
def init(klass)
- @log = mock 'log'
+ @log = double 'log'
@opts = Atig::Option.new({})
context = OpenStruct.new :log=>@log, :opts=>@opts
- @channel = mock 'channel'
+ @channel = double 'channel'
@gateway = FakeGateway.new @channel
- @api = mock 'api'
+ @api = double 'api'
@statuses = FakeDbEntry.new 'status DB'
@followings = FakeDbEntry.new 'followings DB'
@lists = {
@@ -88,7 +88,7 @@ module CommandHelper
end
def stub_status(key, hash)
- @statuses.stub!(key).and_return{|arg,*_|
+ @statuses.stub(key).and_return{|arg,*_|
hash.fetch(arg, hash[:default])
}
end
diff --git a/spec/db/followings_spec.rb b/spec/db/followings_spec.rb
index 34a811a..b36afc6 100644
--- a/spec/db/followings_spec.rb
+++ b/spec/db/followings_spec.rb
@@ -9,6 +9,10 @@ describe Atig::Db::Followings,"when it is empty" do
@db = Atig::Db::Followings.new('following.test.db')
end
+ after(:all) do
+ FileUtils.rm_f 'following.test.db'
+ end
+
it "should be emtpy" do
@db.empty?.should be_true
end
@@ -34,6 +38,10 @@ describe Atig::Db::Followings,"when updated users" do
end
end
+ after(:all) do
+ FileUtils.rm_f 'following.test.db'
+ end
+
it "should return size" do
@db.size.should == 2
end
diff --git a/spec/db/lists_spec.rb b/spec/db/lists_spec.rb
index 7e9e4ab..05ec2fa 100644
--- a/spec/db/lists_spec.rb
+++ b/spec/db/lists_spec.rb
@@ -19,6 +19,12 @@ describe Atig::Db::Lists do
@lists.listen{|kind,*args| @args[kind] = args }
end
+ after(:all) do
+ %w(test-a.db test-b.db).each do |file|
+ FileUtils.rm_f file
+ end
+ end
+
it "should have list" do
@lists.update("a" => [ @alice, @bob ],
"b" => [ @alice, @bob , @charriey ])
@@ -101,4 +107,3 @@ describe Atig::Db::Lists do
@args[:mode].should == [ "a", [ bob ]]
end
end
-
diff --git a/spec/db/sized_uniq_array_spec.rb b/spec/db/sized_uniq_array_spec.rb
index e2c9f2e..8dc1b84 100644
--- a/spec/db/sized_uniq_array_spec.rb
+++ b/spec/db/sized_uniq_array_spec.rb
@@ -6,8 +6,8 @@ require 'ostruct'
describe Atig::Db::SizedUniqArray do
def item(id)
- item = stub "Item-#{id}"
- item.stub!(:id).and_return id
+ item = double "Item-#{id}"
+ item.stub(:id).and_return id
item
end
diff --git a/spec/db/statuses_spec.rb b/spec/db/statuses_spec.rb
index 5a8eeb1..58a4715 100644
--- a/spec/db/statuses_spec.rb
+++ b/spec/db/statuses_spec.rb
@@ -31,6 +31,10 @@ describe Atig::Db::Statuses do
@db.add :status => @c , :user => @alice, :source => :srcC
end
+ after(:all) do
+ FileUtils.rm_f 'test.db'
+ end
+
it "should be re-openable" do
Atig::Db::Statuses.new 'test.db'
end
diff --git a/spec/ifilter/expand_url_spec.rb b/spec/ifilter/expand_url_spec.rb
index 8f40f45..62f3d88 100644
--- a/spec/ifilter/expand_url_spec.rb
+++ b/spec/ifilter/expand_url_spec.rb
@@ -10,12 +10,26 @@ end
describe Atig::IFilter::ExpandUrl, "when disable whole url" do
def filtered(text)
- ifilter = Atig::IFilter::ExpandUrl.new OpenStruct.new(:log=>mock('log'),:opts=>OpenStruct.new)
+ ifilter = Atig::IFilter::ExpandUrl.new OpenStruct.new(:log=>double('log'),:opts=>OpenStruct.new)
ifilter.call status(text)
end
it "should expand bit.ly" do
filtered("This is http://bit.ly/hoge").should be_text("This is [http://bit.ly/hoge]")
+ filtered("This is http://bitly.com/hoge").should be_text("This is [http://bitly.com/hoge]")
+ end
+
+ it "should expand htn.to" do
+ filtered("This is http://htn.to/TZdkXg").should be_text("This is [http://htn.to/TZdkXg]")
+ filtered("This is http://htnnto/TZdkXg").should be_text("This is http://htnnto/TZdkXg")
+ end
+
+ it "should expand tmblr.co" do
+ filtered("This is http://tmblr.co/Z0rNbyxhxUK5").should be_text("This is [http://tmblr.co/Z0rNbyxhxUK5]")
+ end
+
+ it "should expand nico.ms" do
+ filtered("This is http://nico.ms/sm11870888").should be_text("This is [http://nico.ms/sm11870888]")
end
it "should through other url" do
@@ -26,7 +40,7 @@ end
describe Atig::IFilter::ExpandUrl, "when enable whole url" do
def filtered(text)
context = OpenStruct.new(
- :log => mock('log'),
+ :log => double('log'),
:opts => OpenStruct.new(:untiny_whole_urls=>true))
ifilter = Atig::IFilter::ExpandUrl.new(context)
ifilter.call status(text)
@@ -42,3 +56,41 @@ describe Atig::IFilter::ExpandUrl, "when enable whole url" do
end
end
+describe Atig::IFilter::ExpandUrl, "when has urls entities" do
+ def filtered(text, opts)
+ context = OpenStruct.new(
+ :log => double('log'),
+ :opts => OpenStruct.new)
+ ifilter = Atig::IFilter::ExpandUrl.new(context)
+ ifilter.call status(text, opts)
+ end
+
+ it "should expand t.co" do
+ opts = {
+ "entities" => {
+ "urls" => [{
+ "url" => "http://t.co/1Vyoux4kB8",
+ "expanded_url" => "http://example.com/"
+ }, {
+ "url" => "http://t.co/V1441ye6g2",
+ "expanded_url" => "http://example.org/"
+ }]
+ }
+ }
+ filtered("http://t.co/1Vyoux4kB8", opts).should be_text("http://example.com/")
+ filtered("http://t.co/1Vyoux4kB8 http://t.co/V1441ye6g2", opts).should
+ be_text("http://example.com/ http://expmaple.org/")
+ end
+
+ it "should expand recursive shorten URL" do
+ opts = {
+ "entities" => {
+ "urls" => [{
+ "url" => "http://t.co/h8sqL5ZMuz",
+ "expanded_url" => "http://bit.ly/1LM4fW"
+ }]
+ }
+ }
+ filtered("http://t.co/h8sqL5ZMuz", opts).should be_text("[http://bit.ly/1LM4fW]")
+ end
+end
diff --git a/spec/ifilter/sid_spec.rb b/spec/ifilter/sid_spec.rb
index 3041065..18c1e41 100644
--- a/spec/ifilter/sid_spec.rb
+++ b/spec/ifilter/sid_spec.rb
@@ -6,7 +6,7 @@ require 'atig/twitter_struct'
describe Atig::IFilter::Sid, "when disable tid" do
def filtered(text)
- ifilter = Atig::IFilter::Sid.new(OpenStruct.new(:log=>mock('log'),
+ ifilter = Atig::IFilter::Sid.new(OpenStruct.new(:log=>double('log'),
:opts=>OpenStruct.new))
ifilter.call status(text,'sid'=>1)
end
@@ -18,7 +18,7 @@ end
describe Atig::IFilter::Sid, "when enable tid" do
def filtered(text)
- ifilter = Atig::IFilter::Sid.new(OpenStruct.new(:log=>mock('log'),
+ ifilter = Atig::IFilter::Sid.new(OpenStruct.new(:log=>double('log'),
:opts=>OpenStruct.new(:sid=>true)))
ifilter.call status(text,'sid'=>1)
end
diff --git a/spec/ifilter/tid_spec.rb b/spec/ifilter/tid_spec.rb
index 5ac48e8..8bb8ca6 100644
--- a/spec/ifilter/tid_spec.rb
+++ b/spec/ifilter/tid_spec.rb
@@ -6,7 +6,7 @@ require 'atig/twitter_struct'
describe Atig::IFilter::Tid, "when disable tid" do
def filtered(text)
- ifilter = Atig::IFilter::Tid.new(OpenStruct.new(:log=>mock('log'),
+ ifilter = Atig::IFilter::Tid.new(OpenStruct.new(:log=>double('log'),
:opts=>OpenStruct.new))
ifilter.call status(text,'tid'=>1)
end
@@ -18,7 +18,7 @@ end
describe Atig::IFilter::Tid, "when enable tid" do
def filtered(text)
- ifilter = Atig::IFilter::Tid.new(OpenStruct.new(:log=>mock('log'),
+ ifilter = Atig::IFilter::Tid.new(OpenStruct.new(:log=>double('log'),
:opts=>OpenStruct.new(:tid=>true)))
ifilter.call status(text,'tid'=>1)
end
diff --git a/spec/ofilter/escape_url_spec.rb b/spec/ofilter/escape_url_spec.rb
index 4ce94cb..3410898 100644
--- a/spec/ofilter/escape_url_spec.rb
+++ b/spec/ofilter/escape_url_spec.rb
@@ -9,7 +9,7 @@ end
describe Atig::OFilter::EscapeUrl do
before do
- @logger = mock('Logger')
+ @logger = double('Logger')
@logger.should_receive(:info).at_most(:once)
@logger.should_receive(:error).at_most(:once)
@logger.should_receive(:debug).at_most(:once)
@@ -32,7 +32,7 @@ end
if defined? ::Punycode then
describe Atig::OFilter::EscapeUrl,"when punycode is enabled" do
before do
- @logger = mock('Logger')
+ @logger = double('Logger')
@logger.should_receive(:info).at_most(:once)
@logger.should_receive(:error).at_most(:once)
@logger.should_receive(:debug).at_most(:once)
diff --git a/spec/ofilter/short_url_spec.rb b/spec/ofilter/short_url_spec.rb
index 6967a73..bfafdee 100644
--- a/spec/ofilter/short_url_spec.rb
+++ b/spec/ofilter/short_url_spec.rb
@@ -6,9 +6,9 @@ require 'ostruct'
describe Atig::OFilter::ShortUrl,"when no-login bitly" do
before do
- logger = mock('Logger')
- bitly = mock("Bitly")
- bitly.stub!(:shorten).and_return{|s|
+ logger = double('Logger')
+ bitly = double("Bitly")
+ bitly.stub(:shorten).and_return{|s|
"[#{s}]"
}
Atig::Bitly.should_receive(:no_login).with(logger).and_return(bitly)
@@ -24,9 +24,9 @@ end
describe Atig::OFilter::ShortUrl,"when no-login bitly with size" do
before do
- logger = mock('Logger')
- bitly = mock("Bitly")
- bitly.stub!(:shorten).and_return{|s|
+ logger = double('Logger')
+ bitly = double("Bitly")
+ bitly.stub(:shorten).and_return{|s|
"[#{s}]"
}
Atig::Bitly.should_receive(:no_login).with(logger).and_return(bitly)
@@ -42,9 +42,9 @@ end
describe Atig::OFilter::ShortUrl,"when login bitly" do
before do
- logger = mock('Logger')
- bitly = mock("Bitly")
- bitly.stub!(:shorten).and_return{|s|
+ logger = double('Logger')
+ bitly = double("Bitly")
+ bitly.stub(:shorten).and_return{|s|
"[#{s}]"
}
Atig::Bitly.should_receive(:login).with(logger,"username","api_key").and_return(bitly)
@@ -60,9 +60,9 @@ end
describe Atig::OFilter::ShortUrl,"when login bitly with size" do
before do
- logger = mock('Logger')
- bitly = mock("Bitly")
- bitly.stub!(:shorten).and_return{|s|
+ logger = double('Logger')
+ bitly = double("Bitly")
+ bitly.stub(:shorten).and_return{|s|
"[#{s}]"
}
Atig::Bitly.should_receive(:login).with(logger,"username","api_key").and_return(bitly)
@@ -76,45 +76,9 @@ describe Atig::OFilter::ShortUrl,"when login bitly with size" do
end
end
-describe Atig::OFilter::ShortUrl,"when unu bitly" do
- before do
- logger = mock('Logger')
- unu = mock("Unu")
- unu.stub!(:shorten).and_return{|s|
- "[#{s}]"
- }
- Atig::Unu.should_receive(:new).with(logger).and_return(unu)
- @ofilter = Atig::OFilter::ShortUrl.new(OpenStruct.new(:log=>logger, :opts=>OpenStruct.new('unuify'=>true)))
- end
-
- it "should shorten url by unu" do
- @ofilter.call({:status => "this is http://example.com/a http://example.com/b"}).should == {
- :status => "this is [http://example.com/a] [http://example.com/b]"
- }
- end
-end
-
-describe Atig::OFilter::ShortUrl,"when no-login unu with size" do
- before do
- logger = mock('Logger')
- unu = mock("Unu")
- unu.stub!(:shorten).and_return{|s|
- "[#{s}]"
- }
- Atig::Unu.should_receive(:new).with(logger).and_return(unu)
- @ofilter = Atig::OFilter::ShortUrl.new(OpenStruct.new(:log=>logger, :opts=>OpenStruct.new('unuify'=>13)))
- end
-
- it "should only shorten large url" do
- @ofilter.call({:status => "this is http://example.com/a http://a.com"}).should == {
- :status => "this is [http://example.com/a] http://a.com"
- }
- end
-end
-
describe Atig::OFilter::ShortUrl,"when nop" do
before do
- logger = mock('Logger')
+ logger = double('Logger')
@ofilter = Atig::OFilter::ShortUrl.new(OpenStruct.new(:log=>logger, :opts=>OpenStruct.new()))
end
diff --git a/spec/option_spec.rb b/spec/option_spec.rb
index 0be9ce3..1604f24 100644
--- a/spec/option_spec.rb
+++ b/spec/option_spec.rb
@@ -69,7 +69,7 @@ describe Atig::Option do
end
it "should have default value" do
- @opt.api_base.should == 'https://api.twitter.com/1/'
+ @opt.api_base.should == 'https://api.twitter.com/1.1/'
end
it "should list up all fields" do
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 6658fc7..cb0adc7 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -1,13 +1,7 @@
# -*- mode:ruby; coding:utf-8 -*-
-require 'rubygems'
-require 'bundler'
-
-Bundler.setup
-Bundler.require :default, :test
-
-$:.unshift(File.expand_path( '../lib', File.dirname(__FILE__) ) )
-
+require 'bundler/setup'
require 'atig/monkey'
+require 'command_helper'
RSpec::Matchers.define :be_text do |text|
match do |status|
@@ -15,21 +9,24 @@ RSpec::Matchers.define :be_text do |text|
end
end
-def status(text,opt={})
+def status(text, opt = {})
Atig::TwitterStruct.make(opt.merge('text' => text))
end
def user(id, name)
- user = stub("User-#{name}")
- user.stub!(:id).and_return(id)
- user.stub!(:screen_name).and_return(name)
+ user = double("User-#{name}")
+ user.stub(:id).and_return(id)
+ user.stub(:screen_name).and_return(name)
user
end
-def entry(user,status,name='entry',id=0)
- entry = stub name
- entry.stub!('id').and_return(id)
- entry.stub!('user').and_return(user)
- entry.stub!('status').and_return(status)
+def entry(user, status, name = 'entry', id = 0)
+ entry = double name
+ entry.stub('id').and_return(id)
+ entry.stub('user').and_return(user)
+ entry.stub('status').and_return(status)
entry
end
+
+require 'coveralls'
+Coveralls.wear!
diff --git a/spec/update_checker_spec.rb b/spec/update_checker_spec.rb
index fd3c18b..1ad54c9 100644
--- a/spec/update_checker_spec.rb
+++ b/spec/update_checker_spec.rb
@@ -9,12 +9,12 @@ describe Atig::UpdateChecker,'when use git version' do
end
def commit(c, mesg)
- {'id' => rev(c), 'message' => mesg}
+ {'sha' => rev(c), 'commit' => {'message' => mesg}}
end
before do
- Atig::UpdateChecker.stub!(:git?).and_return(true)
- Atig::UpdateChecker.stub!(:commits).
+ Atig::UpdateChecker.stub(:git?).and_return(true)
+ Atig::UpdateChecker.stub(:commits).
and_return [
commit('a', 'foo'),
commit('b', 'bar'),
@@ -25,29 +25,29 @@ describe Atig::UpdateChecker,'when use git version' do
end
it "should not do anything when use HEAD version" do
- Atig::UpdateChecker.stub!(:local_repos?).and_return true
- Atig::UpdateChecker.stub!(:server_version).and_return rev('a')
+ Atig::UpdateChecker.stub(:local_repos?).and_return true
+ Atig::UpdateChecker.stub(:server_version).and_return rev('a')
Atig::UpdateChecker.latest.should == []
end
it "should notify when not use HEAD version" do
- Atig::UpdateChecker.stub!(:local_repos?).and_return false
- Atig::UpdateChecker.stub!(:server_version).and_return rev('b')
+ Atig::UpdateChecker.stub(:local_repos?).and_return false
+ Atig::UpdateChecker.stub(:server_version).and_return rev('b')
Atig::UpdateChecker.latest.should == [ 'foo' ]
end
it "should notify many changes" do
- Atig::UpdateChecker.stub!(:local_repos?).and_return false
- Atig::UpdateChecker.stub!(:server_version).and_return rev('d')
+ Atig::UpdateChecker.stub(:local_repos?).and_return false
+ Atig::UpdateChecker.stub(:server_version).and_return rev('d')
Atig::UpdateChecker.latest.should == [ 'foo', 'bar', 'baz' ]
end
it "should notify all changes" do
- Atig::UpdateChecker.stub!(:local_repos?).and_return false
- Atig::UpdateChecker.stub!(:server_version).and_return rev('z')
+ Atig::UpdateChecker.stub(:local_repos?).and_return false
+ Atig::UpdateChecker.stub(:server_version).and_return rev('z')
Atig::UpdateChecker.latest.should == [ 'foo', 'bar', 'baz', 'xyzzy', 'fuga' ]
end
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ruby-extras/atig.git
More information about the Pkg-ruby-extras-commits
mailing list